mirror of
https://github.com/ganelson/inform.git
synced 2024-06-30 22:14:58 +03:00
Improved instance counting
This commit is contained in:
parent
87fe04d58b
commit
7808098c31
|
@ -1,6 +1,6 @@
|
|||
# Inform 7
|
||||
|
||||
v10.1.0-alpha.1+6S19 'Krypton' (22 May 2021)
|
||||
v10.1.0-alpha.1+6S20 'Krypton' (23 May 2021)
|
||||
|
||||
## About Inform 7
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: alpha.1
|
||||
Build Date: 22 May 2021
|
||||
Build Number: 6S19
|
||||
Build Date: 23 May 2021
|
||||
Build Number: 6S20
|
||||
|
|
|
@ -93,7 +93,7 @@ other two; it doesn't even have an activation function.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"core"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="3-pm.html#SP3" class="function-link"><span class="function-syntax">PluginManager::make_permanently_active</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">naming_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">Naming::start</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"naming"</span><span class="plain-syntax">, </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">PL::Counting::start</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"instance counting"</span><span class="plain-syntax">, </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">InstanceCounting::start</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"instance counting"</span><span class="plain-syntax">, </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">TASK_QUEUE_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"task queue"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@ performance.
|
|||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CompileLoops::schema</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">CompileLoops::schema</span></span>:<br/><a href="4-cl.html#SP1">§1</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PL::Counting::optimise_loop</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</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">InstanceCounting::optimise_loop</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</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">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"objectloop (*1 ofclass %n)"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKindDeclarations::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -1156,7 +1156,7 @@ of the cell. First, the eight cells around the outside:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">tool_tip</span><span class="plain-syntax">, </span><span class="string-syntax">"title=\""</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</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">PL::Counting::instance_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_direction</span><span class="plain-syntax">) == </span><span class="identifier-syntax">exit</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">InstanceCounting::IK_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_direction</span><span class="plain-syntax">) == </span><span class="identifier-syntax">exit</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">tool_tip</span><span class="plain-syntax">, </span><span class="string-syntax">"%+I"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -243,7 +243,7 @@ but that's now easy.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ni.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresscurrent">cu</li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-emt.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ni.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresscurrent">cu</li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-emt.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -420,7 +420,7 @@ names are not.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-dv.html#SP2">§2</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-th.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresscurrent">dv</li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-es.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-th.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresscurrent">dv</li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-es.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -349,7 +349,7 @@ is completely emitted before another one is.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ec.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresscurrent">ea</li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-int.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ec.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresscurrent">ea</li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-int.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -317,7 +317,7 @@ advance:
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-emt.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresscurrent">ec</li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ea.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-emt.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresscurrent">ec</li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ea.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -379,7 +379,7 @@ it represents an actual number at run-time, the second if not:
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::iname_constant</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">Emit::iname_constant</span></span>:<br/>Hierarchy - <a href="2-hrr.html#SP23">§23</a><br/>Short Names - <a href="2-sn.html#SP2">§2</a><br/>Responses - <a href="4-rsp.html#SP6">§6</a><br/>Activities - <a href="5-act.html#SP6">§6</a><br/>Chronology - <a href="5-chr.html#SP4">§4</a>, <a href="5-chr.html#SP8">§8</a><br/>Conjugations - <a href="5-cnj.html#SP12">§12</a><br/>Scene Instances - <a href="5-si.html#SP3">§3</a>, <a href="5-si.html#SP7">§7</a><br/>Multimedia - <a href="5-mlt.html#SP2_3">§2.3</a><br/>Tables - <a href="5-tbl.html#SP2_1_1_1_3">§2.1.1.1.3</a><br/>Rulebooks - <a href="5-rlb.html#SP6_4">§6.4</a>, <a href="5-rlb.html#SP13_3">§13.3</a><br/>Relations - <a href="5-rlt.html#SP5">§5</a>, <a href="5-rlt.html#SP6_2">§6.2</a>, <a href="5-rlt.html#SP6_3">§6.3</a><br/>Kind Constructors - <a href="5-kc.html#SP4">§4</a><br/>Kind IDs - <a href="5-ki.html#SP6">§6</a>, <a href="5-ki.html#SP9_2">§9.2</a><br/>Actions - <a href="5-act2.html#SP8_3">§8.3</a>, <a href="5-act2.html#SP8_4">§8.4</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::iname_constant</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">Emit::iname_constant</span></span>:<br/>Hierarchy - <a href="2-hrr.html#SP23">§23</a><br/>Instance Counting - <a href="2-ic.html#SP8">§8</a><br/>Short Names - <a href="2-sn.html#SP2">§2</a><br/>Responses - <a href="4-rsp.html#SP6">§6</a><br/>Activities - <a href="5-act.html#SP6">§6</a><br/>Chronology - <a href="5-chr.html#SP4">§4</a>, <a href="5-chr.html#SP8">§8</a><br/>Conjugations - <a href="5-cnj.html#SP12">§12</a><br/>Scene Instances - <a href="5-si.html#SP3">§3</a>, <a href="5-si.html#SP7">§7</a><br/>Multimedia - <a href="5-mlt.html#SP2_3">§2.3</a><br/>Tables - <a href="5-tbl.html#SP2_1_1_1_3">§2.1.1.1.3</a><br/>Rulebooks - <a href="5-rlb.html#SP6_4">§6.4</a>, <a href="5-rlb.html#SP13_3">§13.3</a><br/>Relations - <a href="5-rlt.html#SP5">§5</a>, <a href="5-rlt.html#SP6_2">§6.2</a>, <a href="5-rlt.html#SP6_3">§6.3</a><br/>Kind Constructors - <a href="5-kc.html#SP4">§4</a><br/>Kind IDs - <a href="5-ki.html#SP6">§6</a>, <a href="5-ki.html#SP9_2">§9.2</a><br/>Actions - <a href="5-act2.html#SP8_3">§8.3</a>, <a href="5-act2.html#SP8_4">§8.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Packaging::enter_home_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::define_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::kind_to_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
|
@ -593,7 +593,7 @@ assimilating during linking.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-cu.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresscurrent">emt</li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ec.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-cu.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresscurrent">emt</li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ec.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -128,7 +128,7 @@ data, not merely the pointer to them, which is a "deep copy".
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-dv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresscurrent">es</li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-kd.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-dv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresscurrent">es</li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ic.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -257,7 +257,7 @@ following convenience functions.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sn.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresscurrent">gpr</li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="3-gm.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sn.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresscurrent">gpr</li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="3-gm.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -130,7 +130,7 @@ ever change our minds about that.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sc.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresscurrent">hnae</li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sn.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sc.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresscurrent">hnae</li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sn.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -1640,7 +1640,7 @@ package holding it. (<span class="extract"><span class="extract-syntax">P</span>
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::make_iname_in</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">Hierarchy::make_iname_in</span></span>:<br/><a href="2-hrr.html#SP23">§23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1_2">§2.1.2</a><br/>Short Names - <a href="2-sn.html#SP3">§3</a><br/>Use Options - <a href="3-uo.html#SP1">§1</a><br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>List Literals - <a href="4-ll.html#SP7">§7</a><br/>Text Substitutions - <a href="4-ts.html#SP5">§5</a><br/>Responses - <a href="4-rsp.html#SP2">§2</a><br/>Activities - <a href="5-act.html#SP2">§2</a>, <a href="5-act.html#SP6">§6</a><br/>Adjectives - <a href="5-adj.html#SP2">§2</a>, <a href="5-adj.html#SP3">§3</a>, <a href="5-adj.html#SP9">§9</a>, <a href="5-adj.html#SP14">§14</a><br/>Chronology - <a href="5-chr.html#SP3_3">§3.3</a>, <a href="5-chr.html#SP4">§4</a>, <a href="5-chr.html#SP7">§7</a>, <a href="5-chr.html#SP7_1">§7.1</a>, <a href="5-chr.html#SP8">§8</a><br/>Conjugations - <a href="5-cnj.html#SP6">§6</a>, <a href="5-cnj.html#SP10">§10</a>, <a href="5-cnj.html#SP12">§12</a><br/>Equations - <a href="5-eqt.html#SP1">§1</a><br/>Instances - <a href="5-ins.html#SP2_1">§2.1</a><br/>Backdrop Instances - <a href="5-bi.html#SP1">§1</a><br/>Door Instances - <a href="5-di.html#SP2">§2</a>, <a href="5-di.html#SP4">§4</a>, <a href="5-di.html#SP6">§6</a><br/>Region Instances - <a href="5-ri.html#SP1">§1</a><br/>Scene Instances - <a href="5-si.html#SP3">§3</a>, <a href="5-si.html#SP7">§7</a><br/>Multimedia - <a href="5-mlt.html#SP1">§1</a>, <a href="5-mlt.html#SP2_3">§2.3</a><br/>Tables - <a href="5-tbl.html#SP1">§1</a>, <a href="5-tbl.html#SP2_1_1_1_3">§2.1.1.1.3</a>, <a href="5-tbl.html#SP2_2">§2.2</a>, <a href="5-tbl.html#SP2_3">§2.3</a>, <a href="5-tbl.html#SP5">§5</a><br/>Table Columns - <a href="5-tc.html#SP1">§1</a>, <a href="5-tc.html#SP2">§2</a><br/>Rules - <a href="5-rls.html#SP5">§5</a>, <a href="5-rls.html#SP7">§7</a><br/>Rulebooks - <a href="5-rlb.html#SP3">§3</a>, <a href="5-rlb.html#SP4">§4</a>, <a href="5-rlb.html#SP6">§6</a>, <a href="5-rlb.html#SP13_3">§13.3</a><br/>Variables - <a href="5-vrb.html#SP13">§13</a>, <a href="5-vrb.html#SP13_1">§13.1</a><br/>Properties - <a href="5-prp.html#SP6_4">§6.4</a><br/>Relations - <a href="5-rlt.html#SP4">§4</a>, <a href="5-rlt.html#SP6_2">§6.2</a>, <a href="5-rlt.html#SP6_3">§6.3</a>, <a href="5-rlt.html#SP6_3_2">§6.3.2</a>, <a href="5-rlt.html#SP10">§10</a>, <a href="5-rlt.html#SP10_3">§10.3</a><br/>Literal Patterns - <a href="5-lp.html#SP2">§2</a><br/>Kind Constructors - <a href="5-kc.html#SP3">§3</a>, <a href="5-kc.html#SP4">§4</a>, <a href="5-kc.html#SP11">§11</a><br/>Kind IDs - <a href="5-ki.html#SP8">§8</a>, <a href="5-ki.html#SP9_2">§9.2</a><br/>Actions - <a href="5-act2.html#SP3">§3</a>, <a href="5-act2.html#SP4">§4</a>, <a href="5-act2.html#SP8_1">§8.1</a>, <a href="5-act2.html#SP8_3">§8.3</a>, <a href="5-act2.html#SP8_4">§8.4</a><br/>Named Action Patterns - <a href="5-nap.html#SP2">§2</a><br/>Test Scripts - <a href="5-ts.html#SP2">§2</a><br/>Name Properties - <a href="6-np.html#SP3">§3</a><br/>Emit Property Values - <a href="7-epv.html#SP12">§12</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</a><br/>Command Grammars - <a href="7-cg.html#SP1">§1</a>, <a href="7-cg.html#SP7">§7</a>, <a href="7-cg.html#SP8">§8</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP2">§2</a>, <a href="7-cgl.html#SP7">§7</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§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">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::make_iname_in</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">Hierarchy::make_iname_in</span></span>:<br/><a href="2-hrr.html#SP23">§23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1_2">§2.1.2</a><br/>Short Names - <a href="2-sn.html#SP3">§3</a><br/>Use Options - <a href="3-uo.html#SP1">§1</a><br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>List Literals - <a href="4-ll.html#SP7">§7</a><br/>Text Substitutions - <a href="4-ts.html#SP5">§5</a><br/>Responses - <a href="4-rsp.html#SP2">§2</a><br/>Activities - <a href="5-act.html#SP2">§2</a>, <a href="5-act.html#SP6">§6</a><br/>Adjectives - <a href="5-adj.html#SP2">§2</a>, <a href="5-adj.html#SP3">§3</a>, <a href="5-adj.html#SP9">§9</a>, <a href="5-adj.html#SP14">§14</a><br/>Chronology - <a href="5-chr.html#SP3_3">§3.3</a>, <a href="5-chr.html#SP4">§4</a>, <a href="5-chr.html#SP7">§7</a>, <a href="5-chr.html#SP7_1">§7.1</a>, <a href="5-chr.html#SP8">§8</a><br/>Conjugations - <a href="5-cnj.html#SP6">§6</a>, <a href="5-cnj.html#SP10">§10</a>, <a href="5-cnj.html#SP12">§12</a><br/>Equations - <a href="5-eqt.html#SP1">§1</a><br/>Instances - <a href="5-ins.html#SP2_1">§2.1</a><br/>Backdrop Instances - <a href="5-bi.html#SP1">§1</a><br/>Door Instances - <a href="5-di.html#SP2">§2</a>, <a href="5-di.html#SP4">§4</a>, <a href="5-di.html#SP6">§6</a><br/>Region Instances - <a href="5-ri.html#SP1">§1</a><br/>Scene Instances - <a href="5-si.html#SP3">§3</a>, <a href="5-si.html#SP7">§7</a><br/>Multimedia - <a href="5-mlt.html#SP1">§1</a>, <a href="5-mlt.html#SP2_3">§2.3</a><br/>Tables - <a href="5-tbl.html#SP1">§1</a>, <a href="5-tbl.html#SP2_1_1_1_3">§2.1.1.1.3</a>, <a href="5-tbl.html#SP2_2">§2.2</a>, <a href="5-tbl.html#SP2_3">§2.3</a>, <a href="5-tbl.html#SP5">§5</a><br/>Table Columns - <a href="5-tc.html#SP1">§1</a>, <a href="5-tc.html#SP2">§2</a><br/>Rules - <a href="5-rls.html#SP5">§5</a>, <a href="5-rls.html#SP7">§7</a><br/>Rulebooks - <a href="5-rlb.html#SP3">§3</a>, <a href="5-rlb.html#SP4">§4</a>, <a href="5-rlb.html#SP6">§6</a>, <a href="5-rlb.html#SP13_3">§13.3</a><br/>Variables - <a href="5-vrb.html#SP13">§13</a>, <a href="5-vrb.html#SP13_1">§13.1</a><br/>Properties - <a href="5-prp.html#SP6_4">§6.4</a><br/>Relations - <a href="5-rlt.html#SP4">§4</a>, <a href="5-rlt.html#SP6_2">§6.2</a>, <a href="5-rlt.html#SP6_3">§6.3</a>, <a href="5-rlt.html#SP6_3_2">§6.3.2</a>, <a href="5-rlt.html#SP10">§10</a>, <a href="5-rlt.html#SP10_3">§10.3</a><br/>Literal Patterns - <a href="5-lp.html#SP2">§2</a><br/>Kind Constructors - <a href="5-kc.html#SP2">§2</a>, <a href="5-kc.html#SP3">§3</a>, <a href="5-kc.html#SP4">§4</a>, <a href="5-kc.html#SP11">§11</a><br/>Kind IDs - <a href="5-ki.html#SP8">§8</a>, <a href="5-ki.html#SP9_2">§9.2</a><br/>Actions - <a href="5-act2.html#SP3">§3</a>, <a href="5-act2.html#SP4">§4</a>, <a href="5-act2.html#SP8_1">§8.1</a>, <a href="5-act2.html#SP8_3">§8.3</a>, <a href="5-act2.html#SP8_4">§8.4</a><br/>Named Action Patterns - <a href="5-nap.html#SP2">§2</a><br/>Test Scripts - <a href="5-ts.html#SP2">§2</a><br/>Name Properties - <a href="6-np.html#SP3">§3</a><br/>Emit Property Values - <a href="7-epv.html#SP12">§12</a><br/>Command Grammars - <a href="7-cg.html#SP1">§1</a>, <a href="7-cg.html#SP7">§7</a>, <a href="7-cg.html#SP8">§8</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP2">§2</a>, <a href="7-cgl.html#SP7">§7</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§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">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</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">HierarchyLocations::find_in_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -1678,7 +1678,7 @@ it (e.g. by adding a prefix or suffix), the following should be used:
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::derive_iname_in</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">Hierarchy::derive_iname_in</span></span>:<br/>Rules - <a href="5-rls.html#SP8">§8</a><br/>Actions - <a href="5-act2.html#SP6">§6</a>, <a href="5-act2.html#SP7">§7</a>, <a href="5-act2.html#SP8_6">§8.6</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</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_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Hierarchy::derive_iname_in</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">Hierarchy::derive_iname_in</span></span>:<br/>Rules - <a href="5-rls.html#SP8">§8</a><br/>Kind Constructors - <a href="5-kc.html#SP2">§2</a><br/>Actions - <a href="5-act2.html#SP6">§6</a>, <a href="5-act2.html#SP7">§7</a>, <a href="5-act2.html#SP8_6">§8.6</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_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</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">HierarchyLocations::find_in_package</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -1830,7 +1830,7 @@ point system, and for those:
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="1-rm.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">hrr</li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ni.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="1-rm.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">hrr</li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-ni.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
470
docs/runtime-module/2-ic.html
Normal file
470
docs/runtime-module/2-ic.html
Normal file
|
@ -0,0 +1,470 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Instance Counting</title>
|
||||
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Language" content="en-gb">
|
||||
|
||||
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<script>
|
||||
function togglePopup(material_id) {
|
||||
var popup = document.getElementById(material_id);
|
||||
popup.classList.toggle("show");
|
||||
}
|
||||
</script>
|
||||
|
||||
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<script src="http://code.jquery.com/jquery-1.12.4.min.js"
|
||||
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
|
||||
<script src="../docs-assets/Bigfoot.js"></script>
|
||||
<link href="../docs-assets/Bigfoot.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
|
||||
</head>
|
||||
<body class="commentary-font">
|
||||
<nav role="navigation">
|
||||
<h1><a href="../index.html">
|
||||
<img src="../docs-assets/Inform.png" height=72">
|
||||
</a></h1>
|
||||
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
||||
<li><a href="../other.html">other tools</a></li>
|
||||
<li><a href="../extensions.html">extensions and kits</a></li>
|
||||
<li><a href="../units.html">unit test tools</a></li>
|
||||
</ul><h2>Compiler Webs</h2><ul>
|
||||
<li><a href="../inbuild/index.html">inbuild</a></li>
|
||||
<li><a href="../inform7/index.html">inform7</a></li>
|
||||
<li><a href="../inter/index.html">inter</a></li>
|
||||
</ul><h2>Inbuild Modules</h2><ul>
|
||||
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
||||
</ul><h2>Inform7 Modules</h2><ul>
|
||||
<li><a href="../core-module/index.html">core</a></li>
|
||||
<li><a href="../assertions-module/index.html">assertions</a></li>
|
||||
<li><a href="../values-module/index.html">values</a></li>
|
||||
<li><a href="../knowledge-module/index.html">knowledge</a></li>
|
||||
<li><a href="../imperative-module/index.html">imperative</a></li>
|
||||
<li><a href="index.html"><span class="selectedlink">runtime</span></a></li>
|
||||
<li><a href="../if-module/index.html">if</a></li>
|
||||
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
||||
<li><a href="../index-module/index.html">index</a></li>
|
||||
</ul><h2>Inter Modules</h2><ul>
|
||||
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
||||
<li><a href="../building-module/index.html">building</a></li>
|
||||
<li><a href="../codegen-module/index.html">codegen</a></li>
|
||||
</ul><h2>Services</h2><ul>
|
||||
<li><a href="../arch-module/index.html">arch</a></li>
|
||||
<li><a href="../calculus-module/index.html">calculus</a></li>
|
||||
<li><a href="../html-module/index.html">html</a></li>
|
||||
<li><a href="../inflections-module/index.html">inflections</a></li>
|
||||
<li><a href="../kinds-module/index.html">kinds</a></li>
|
||||
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
||||
<li><a href="../problems-module/index.html">problems</a></li>
|
||||
<li><a href="../syntax-module/index.html">syntax</a></li>
|
||||
<li><a href="../words-module/index.html">words</a></li>
|
||||
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<main role="main">
|
||||
<!--Weave of 'Instance Counting' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#2">Chapter 2: Emission</a></li><li><b>Instance Counting</b></li></ul></div>
|
||||
<p class="purpose">Though a plugin, for convenience of implementation, this code is always active and provides for efficient loops through instances at runtime.</p>
|
||||
|
||||
<ul class="toc"><li><a href="2-ic.html#SP1">§1. Plugin startup</a></li><li><a href="2-ic.html#SP5">§5. The IK-count</a></li><li><a href="2-ic.html#SP7">§7. The IK-sequence</a></li><li><a href="2-ic.html#SP9">§9. The KD-count</a></li><li><a href="2-ic.html#SP10">§10. Properties of instances</a></li><li><a href="2-ic.html#SP11">§11. Loop optimisation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Plugin startup. </b>Being a plugin, this needs a startup function, and here it is. It is in fact
|
||||
called on every run: see <a href="../core-module/1-cm.html" class="internal">Core Module (in core)</a>.
|
||||
</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">InstanceCounting::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_SUBJECT_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="2-ic.html#SP3" class="function-link"><span class="function-syntax">InstanceCounting::counting_new_subject_notify</span></a><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPLETE_MODEL_PLUG</span><span class="plain-syntax">, </span><a href="2-ic.html#SP10" class="function-link"><span class="function-syntax">InstanceCounting::counting_complete_model</span></a><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRODUCTION_LINE_PLUG</span><span class="plain-syntax">, </span><a href="2-ic.html#SP1" class="function-link"><span class="function-syntax">InstanceCounting::production_line</span></a><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">InstanceCounting::production_line</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stage</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">, </span><span class="identifier-syntax">stopwatch_timer</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sequence_timer</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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER1_CSEQ</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="2-ic.html#SP8" class="function-link"><span class="function-syntax">InstanceCounting::define_IK_sequence_start_constants</span></a><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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Being a plugin, this code can provide extra data on inference subjects. It
|
||||
will in practice use that only for subjects representing kinds:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) </span><span class="identifier-syntax">PLUGIN_DATA_ON_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<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">counting_data</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">has_instances</span><span class="plain-syntax">; </span><span class="comment-syntax"> are there any instances of this kind?</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IK_count_prop</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_in_IK_sequence_prop</span><span class="plain-syntax">; </span><span class="comment-syntax"> the IK-Link property for this kind</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">counting_data</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure counting_data is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </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">InstanceCounting::counting_new_subject_notify</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">InstanceCounting::counting_new_subject_notify</span></span>:<br/><a href="2-ic.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ATTACH_PLUGIN_DATA_TO_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">, </span><a href="2-ic.html#SP3" class="function-link"><span class="function-syntax">InstanceCounting::new_data</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">subj</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>
|
||||
|
||||
<span class="reserved-syntax">counting_data</span><span class="plain-syntax"> *</span><span class="function-syntax">InstanceCounting::new_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">counting_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">counting_data</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">cd</span><span class="plain-syntax">-></span><span class="element-syntax">IK_count_prop</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">cd</span><span class="plain-syntax">-></span><span class="element-syntax">next_in_IK_sequence_prop</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">cd</span><span class="plain-syntax">-></span><span class="element-syntax">has_instances</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">cd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">InstanceCounting::IK_count_property</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">InstanceCounting::IK_count_property</span></span>:<br/>Relations - <a href="5-rlt.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">IK_count_prop</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">P</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. The IK-count. </b>The IK-count for an instance I of kind K is the result of numbering instances
|
||||
of that kind upwards from 0. This depends on both I and K, hence the name:
|
||||
for example, a red car might be thing number 17 but vehicle number 2. Within
|
||||
each kind, instances are numbered in creation order by the source text.
|
||||
</p>
|
||||
|
||||
<p class="commentary">Before we can store this, we must calculate it, which we do with this less
|
||||
than elegant two-dimensional array:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax">[(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">*</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax"> +</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Behaviour::get_range_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)]</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InstanceCounting::calculate_IK_counts</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">InstanceCounting::calculate_IK_counts</span></span>:<br/><a href="2-ic.html#SP10">§10</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="named-paragraph-container code-font"><a href="2-ic.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Allocate the instance count array in memory</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Compute the instance count array</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Allocate the instance count array in memory</span><span class="named-paragraph-number">5.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">max_kind_instance_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Memory::calloc</span><span class="plain-syntax">(</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax">*</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax">),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNTING_MREASON</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b>The following is quadratic in the number of objects, but this has never been
|
||||
a problem in practice; the number seldom exceeds a few hundred.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compute the instance count array</span><span class="named-paragraph-number">5.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="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">) = -1;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix_count</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">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">) = </span><span class="identifier-syntax">ix_count</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Instance counts are actually useful to several other plugins, so we provide
|
||||
the following. Note that if I is not in fact an instance of K then its IK-count
|
||||
is by definition -1.
|
||||
</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">InstanceCounting::IK_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kind_instance_counts</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">"instance counts not available"</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">K</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">"instance counts available only for objects"</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">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. The IK-sequence. </b>Within each kind K, we form the instances in a linked list called the "IK-sequence".
|
||||
Again, the list position of I depends on K: the red car might be in one position
|
||||
in the list of things, and another in the list of vehicles.
|
||||
</p>
|
||||
|
||||
<p class="commentary">This sequence will be in "declaration order", that is, it will match the order
|
||||
in which instances are declared in Inter. This is not the same as their creation
|
||||
order in Inform 7 source text, though it tends to be roughly similar.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>
|
||||
</p>
|
||||
|
||||
<p class="commentary">The following function abstracts the list, returning the first instance if <span class="extract"><span class="extract-syntax">I</span></span>
|
||||
is <span class="extract"><span class="extract-syntax">NULL</span></span>, and otherwise the next after <span class="extract"><span class="extract-syntax">I</span></span>. Note that it excludes instances which
|
||||
have been "diverted".<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>
|
||||
</p>
|
||||
|
||||
<ul class="footnotetexts"><li class="footnote" id="fn:1"><p class="inwebfootnote"><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> Declaration order is more trouble to arrange, but we do it so that an optimised
|
||||
and an unoptimised loop to perform the same search will not only iterate through
|
||||
the same set of objects, but in the same order.
|
||||
<a href="#fnref:1" title="return to text"> ↩</a></p></li><li class="footnote" id="fn:2"><p class="inwebfootnote"><sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> This is used to get rid of the <span class="extract"><span class="extract-syntax">selfobj</span></span> object in cases where the source text
|
||||
creates an explicit player.
|
||||
<a href="#fnref:2" title="return to text"> ↩</a></p></li></ul>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">InstanceCounting::next_in_IK_sequence</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">InstanceCounting::next_in_IK_sequence</span></span>:<br/><a href="2-ic.html#SP8">§8</a>, <a href="2-ic.html#SP10_4_2">§10.4.2</a><br/>List Literals - <a href="4-ll.html#SP7_2">§7.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">k</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">resuming</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">I</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_IN_INSTANCE_ORDERING</span><span class="plain-syntax">; </span><span class="identifier-syntax">resuming</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</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">resuming</span><span class="plain-syntax">) </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_IN_INSTANCE_ORDERING</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resuming</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">I</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">InferenceSubjects::aliased_but_diverted</span><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">selfobj</span></span><span class="comment-syntax"> may not count</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Instances::of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>At runtime, we will store the IK sequences by defining their first entries
|
||||
as constants,<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> and their subsequent entries as property values of instances.
|
||||
The constants are declared here, and see <a href="2-ic.html#SP10" class="internal">InstanceCounting::counting_complete_model</a>
|
||||
below for the properties.
|
||||
</p>
|
||||
|
||||
<ul class="footnotetexts"><li class="footnote" id="fn:3"><p class="inwebfootnote"><sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> We don't need to store these list origins in some table in memory at
|
||||
runtime because Inform always compiles code which knows which kind it's looping
|
||||
over: so it never needs to look up an IK-sequence where K is not known at
|
||||
compile time.
|
||||
<a href="#fnref:3" title="return to text"> ↩</a></p></li></ul>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InstanceCounting::define_IK_sequence_start_constants</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">InstanceCounting::define_IK_sequence_start_constants</span></span>:<br/><a href="2-ic.html#SP1">§1</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="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::first_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><a href="2-ic.html#SP7" class="function-link"><span class="function-syntax">InstanceCounting::next_in_IK_sequence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">next</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-emt.html#SP11" class="function-link"><span class="function-syntax">Emit::iname_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="5-ins.html#SP1" class="function-link"><span class="function-syntax">RTInstances::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">next</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><a href="2-emt.html#SP11" class="function-link"><span class="function-syntax">Emit::iname_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. The KD-count. </b>This section is supposedly for instance-counting, but it also does a little
|
||||
kind-counting: specifically we number the subkinds of object. The KD-count of a
|
||||
kind is this number.<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup>
|
||||
</p>
|
||||
|
||||
<ul class="footnotetexts"><li class="footnote" id="fn:4"><p class="inwebfootnote"><sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup> I have completely forgotten what the D stood for. KD-counts are in creation
|
||||
order, not declaration order, so it can't be D for declaration.
|
||||
<a href="#fnref:4" title="return to text"> ↩</a></p></li></ul>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InstanceCounting::KD_count</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">InstanceCounting::KD_count</span></span>:<br/><a href="2-ic.html#SP10_3">§10.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</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">K</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="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IK</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">c</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</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="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Properties of instances. </b>At model completion time, then, we assign a set of low-level properties to
|
||||
all the object instances. These consume memory without even being visible in
|
||||
Inform 7 source text: they are all basically optimisations, and are a classic
|
||||
trade-off of memory for speed. For the most part we care more about memory in
|
||||
the Inform runtime (one of our target VMs has a very low memory ceiling), but
|
||||
search loops must run as fast as they possibly can.
|
||||
</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">InstanceCounting::counting_complete_model</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">InstanceCounting::counting_complete_model</span></span>:<br/><a href="2-ic.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stage</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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">WORLD_STAGE_I</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Create and assert zero values of the vector property</span><span class="named-paragraph-number">10.1</span></a></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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">WORLD_STAGE_V</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P_KD_Count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ValueProperties::new_nameless</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"KD_Count"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Create the two instance properties for each kind of object</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ic.html#SP5" class="function-link"><span class="function-syntax">InstanceCounting::calculate_IK_counts</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP10_3" class="named-paragraph-link"><span class="named-paragraph">Assert the KD count property for I</span><span class="named-paragraph-number">10.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP10_4" class="named-paragraph-link"><span class="named-paragraph">Assert values of the two instance properties for I</span><span class="named-paragraph-number">10.4</span></a></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">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>§10.1. </b>The <span class="extract"><span class="extract-syntax">vector</span></span> property provides workspace for the relation-route-finding code
|
||||
at runtime: it doesn't actually have anything to do with instance counting as
|
||||
such, but then again it doesn't deserve its own section of code.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create and assert zero values of the vector property</span><span class="named-paragraph-number">10.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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P_vector</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ValueProperties::new_nameless</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"vector"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">zero</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span><span class="identifier-syntax">P_vector</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">zero</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP10">§10</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>§10.2. </b>For each subkind of object K to which an instance I belongs, we will store the
|
||||
IK-count in a numerical property. So the red car, for example, would be given two
|
||||
property values: one for (red car, thing), one for (red car, vehicle). The
|
||||
properties in question are the <span class="extract"><span class="extract-syntax">IK_count_prop</span></span> for thing and vehicle.
|
||||
</p>
|
||||
|
||||
<p class="commentary">Similarly for the next terms in the IK-sequences, where the properties are
|
||||
the <span class="extract"><span class="extract-syntax">
|
||||
</span></span></p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create the two instance properties for each kind of object</span><span class="named-paragraph-number">10.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="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">count_iname</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::instance_count_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="identifier-syntax">IK_count_prop</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::new_nameless_using</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_number</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">count_iname</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">next_iname</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::next_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="identifier-syntax">next_in_IK_sequence_prop</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::new_nameless_using</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_object</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">next_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP10">§10</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10_3" class="paragraph-anchor"></a><b>§10.3. </b>For any object instance, the property <span class="extract"><span class="extract-syntax">KD_Count</span></span> holds the KD-count for its
|
||||
immediate kind. For a red car which was both vehicle and thing, therefore, this
|
||||
would be the number for "vehicle", not for "thing".
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Assert the KD count property for I</span><span class="named-paragraph-number">10.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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ic</span><span class="plain-syntax"> = </span><a href="2-ic.html#SP9" class="function-link"><span class="function-syntax">InstanceCounting::KD_count</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">ic</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">P_KD_Count</span><span class="plain-syntax">, </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">the_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP10">§10</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10_4" class="paragraph-anchor"></a><b>§10.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Assert values of the two instance properties for I</span><span class="named-paragraph-number">10.4</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">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax">; </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InferenceSubjects::narrowest_broader_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="identifier-syntax">has_instances</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-ic.html#SP10_4_1" class="named-paragraph-link"><span class="named-paragraph">Fill in this IK-count property</span><span class="named-paragraph-number">10.4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ic.html#SP10_4_2" class="named-paragraph-link"><span class="named-paragraph">Fill in this IK-sequence property</span><span class="named-paragraph-number">10.4.2</span></a></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-ic.html#SP10">§10</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10_4_1" class="paragraph-anchor"></a><b>§10.4.1. </b>And otherwise, for every kind that the instance belongs to (directly or
|
||||
indirectly) it gets the relevant instance count as a property value. For
|
||||
example, the red door might have <span class="extract"><span class="extract-syntax">IK4_Count</span></span> set to 3 — it's door number 3,
|
||||
let's suppose — and <span class="extract"><span class="extract-syntax">IK2_Count</span></span> set to 19 — it's thing number 19. It doesn't
|
||||
have an <span class="extract"><span class="extract-syntax">IK7_Count</span></span> property at all, since it isn't a backdrop (kind number 7),
|
||||
and so on for all other kinds.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in this IK-count property</span><span class="named-paragraph-number">10.4.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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ic</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">ic</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">IK_count_prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">the_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP10_4">§10.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10_4_2" class="paragraph-anchor"></a><b>§10.4.2. </b>The IK-Link property is never set for kind 0, so there's no special case. It
|
||||
records the next instance in compilation order:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in this IK-sequence property</span><span class="named-paragraph-number">10.4.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="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><a href="2-ic.html#SP7" class="function-link"><span class="function-syntax">InstanceCounting::next_in_IK_sequence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">next</span><span class="plain-syntax">)?</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Rvalues::from_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">next</span><span class="plain-syntax">):</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Rvalues::new_nothing_object_constant</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">next_in_IK_sequence_prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ic.html#SP10_4">§10.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Loop optimisation. </b>Lastly, then, the coup de grace: here's where we define loop schemas to
|
||||
perform loops through kinds quickly at run-time. We start from the First
|
||||
constants, and use the Next constants to progress; and we stop at <span class="extract"><span class="extract-syntax">nothing</span></span>.
|
||||
</p>
|
||||
|
||||
<p class="commentary">There is no actual need to compile the schema differently in the case of
|
||||
an empty loop, where there are no instances of the kind <span class="extract"><span class="extract-syntax">K</span></span> to loop over:
|
||||
the regular schema would work fine. But it would make the code somehow
|
||||
misleading to a human reader.
|
||||
</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">InstanceCounting::optimise_loop</span><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">has_instances</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">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"for (*1=nothing: false: )"</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_iname</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::first_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">next_iname</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::next_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"for (*1=%n: *1: *1=*1.%n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">first_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">next_iname</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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-es.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresscurrent">ic</li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-kd.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -300,7 +300,7 @@ to reject it again with a problem message.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-int.html#SP4">§4</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ea.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresscurrent">int</li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sv.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ea.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresscurrent">int</li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sv.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -143,7 +143,7 @@ the kind in Inter, ensuring that it has been declared exactly once.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindDeclarations::iname</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">RTKindDeclarations::iname</span></span>:<br/><a href="2-kd.html#SP7">§7</a>, <a href="2-kd.html#SP8">§8</a><br/>Relations - <a href="5-rlt.html#SP19_1">§19.1</a>, <a href="5-rlt.html#SP19_2">§19.2</a>, <a href="5-rlt.html#SP19_3">§19.3</a>, <a href="5-rlt.html#SP19_4">§19.4</a>, <a href="5-rlt.html#SP19_5">§19.5</a>, <a href="5-rlt.html#SP21">§21</a><br/>Kind Constructors - <a href="5-kc.html#SP11">§11</a><br/>Kind IDs - <a href="5-ki.html#SP10">§10</a><br/>Emit Property Values - <a href="7-epv.html#SP2">§2</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindDeclarations::iname</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">RTKindDeclarations::iname</span></span>:<br/><a href="2-kd.html#SP7">§7</a>, <a href="2-kd.html#SP8">§8</a><br/>Relations - <a href="5-rlt.html#SP19_1">§19.1</a>, <a href="5-rlt.html#SP19_2">§19.2</a>, <a href="5-rlt.html#SP19_3">§19.3</a>, <a href="5-rlt.html#SP19_4">§19.4</a>, <a href="5-rlt.html#SP19_5">§19.5</a>, <a href="5-rlt.html#SP21">§21</a><br/>Kind Constructors - <a href="5-kc.html#SP2">§2</a>, <a href="5-kc.html#SP11">§11</a><br/>Kind IDs - <a href="5-ki.html#SP10">§10</a><br/>Emit Property Values - <a href="7-epv.html#SP2">§2</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-kd.html#SP1" class="function-link"><span class="function-syntax">RTKindDeclarations::base_represented_in_Inter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">noun</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) && (</span><a href="2-ni.html#SP3" class="function-link"><span class="function-syntax">NounIdentifiers::iname_set</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
|
@ -333,7 +333,7 @@ source text.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-kd.html#SP9">§9</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-es.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresscurrent">kd</li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sc.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-ic.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresscurrent">kd</li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-sc.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -145,7 +145,7 @@ mutate the name in order to achieve that uniqueness.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-hrr.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresscurrent">ni</li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-cu.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-hrr.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresscurrent">ni</li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-cu.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -510,7 +510,7 @@ turn by turn.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-sc.html#SP6_2">§6.2</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-kd.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresscurrent">sc</li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-hnae.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-kd.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresscurrent">sc</li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-hnae.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -232,7 +232,7 @@ short name, and <span class="extract"><span class="extract-syntax">FALSE</span><
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-sn.html#SP4">§4</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-hnae.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresscurrent">sn</li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-gpr.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-hnae.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresscurrent">sn</li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-gpr.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -168,7 +168,7 @@ need to come into being.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-sv.html#SP1">§1</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-int.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresscurrent">sv</li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-th.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-int.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresscurrent">sv</li><li class="progresssection"><a href="2-th.html">th</a></li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-th.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -216,7 +216,7 @@ in <a href="../BasicInformKit/S-flx.html" class="internal">Flex (in BasicInformK
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresscurrent">th</li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-dv.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-sv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-hrr.html">hrr</a></li><li class="progresssection"><a href="2-ni.html">ni</a></li><li class="progresssection"><a href="2-cu.html">cu</a></li><li class="progresssection"><a href="2-emt.html">emt</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresssection"><a href="2-ea.html">ea</a></li><li class="progresssection"><a href="2-int.html">int</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresscurrent">th</li><li class="progresssection"><a href="2-dv.html">dv</a></li><li class="progresssection"><a href="2-es.html">es</a></li><li class="progresssection"><a href="2-ic.html">ic</a></li><li class="progresssection"><a href="2-kd.html">kd</a></li><li class="progresssection"><a href="2-sc.html">sc</a></li><li class="progresssection"><a href="2-hnae.html">hnae</a></li><li class="progresssection"><a href="2-sn.html">sn</a></li><li class="progresssection"><a href="2-gpr.html">gpr</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresschapter"><a href="7-epv.html">7</a></li><li class="progressnext"><a href="2-dv.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -285,7 +285,7 @@ one copy of this than to have to construct it frequently at runtime.
|
|||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ll.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>Note that the instances are given in the order preferred by <a href="7-ic.html" class="internal">Instance Counting</a>,
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>Note that the instances are given in the order preferred by <a href="2-ic.html" class="internal">Instance Counting</a>,
|
||||
not in creation order, as a simple <span class="extract"><span class="extract-syntax">LOOP_OVER_INSTANCES</span></span> would have done.
|
||||
</p>
|
||||
|
||||
|
@ -293,10 +293,10 @@ not in creation order, as a simple <span class="extract"><span class="extract-sy
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP7" class="function-link"><span class="function-syntax">PL::Counting::next_instance_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><a href="2-ic.html#SP7" class="function-link"><span class="function-syntax">InstanceCounting::next_in_IK_sequence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="5-ins.html#SP1" class="function-link"><span class="function-syntax">RTInstances::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP7" class="function-link"><span class="function-syntax">PL::Counting::next_instance_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><a href="2-ic.html#SP7" class="function-link"><span class="function-syntax">InstanceCounting::next_in_IK_sequence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ll.html#SP7">§7</a>.</li></ul>
|
||||
|
|
|
@ -91,7 +91,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><a href="2-ni.html#SP3" class="function-link"><span class="function-syntax">NounIdentifiers::set_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">-></span><span class="identifier-syntax">as_noun</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">-></span><span class="identifier-syntax">icd</span><span class="plain-syntax">.</span><span class="element-syntax">instance_iname</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="function-syntax">RTInstances::value_iname</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">RTInstances::value_iname</span></span>:<br/><a href="5-ins.html#SP2_1">§2.1</a>, <a href="5-ins.html#SP3">§3</a><br/>Emit - <a href="2-emt.html#SP18">§18</a><br/>Default Values - <a href="2-dv.html#SP2_4">§2.4</a><br/>Short Names - <a href="2-sn.html#SP4_1">§4.1</a><br/>List Literals - <a href="4-ll.html#SP7_2">§7.2</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Backdrop Instances - <a href="5-bi.html#SP2_1">§2.1</a><br/>Door Instances - <a href="5-di.html#SP3">§3</a>, <a href="5-di.html#SP5">§5</a>, <a href="5-di.html#SP6">§6</a><br/>Region Instances - <a href="5-ri.html#SP2">§2</a><br/>Kind Constructors - <a href="5-kc.html#SP11_1_3">§11.1.3</a><br/>Test Scripts - <a href="5-ts.html#SP4">§4</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP1">§1</a>, <a href="6-tm.html#SP2">§2</a><br/>Emit Property Values - <a href="7-epv.html#SP1">§1</a>, <a href="7-epv.html#SP2">§2</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</a><br/>Action Patterns - <a href="7-ap.html#SP6_1_1_1">§6.1.1.1</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1_1">§1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTInstances::value_iname</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">RTInstances::value_iname</span></span>:<br/><a href="5-ins.html#SP2_1">§2.1</a>, <a href="5-ins.html#SP3">§3</a><br/>Emit - <a href="2-emt.html#SP18">§18</a><br/>Default Values - <a href="2-dv.html#SP2_4">§2.4</a><br/>Instance Counting - <a href="2-ic.html#SP8">§8</a><br/>Short Names - <a href="2-sn.html#SP4_1">§4.1</a><br/>List Literals - <a href="4-ll.html#SP7_2">§7.2</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Backdrop Instances - <a href="5-bi.html#SP2_1">§2.1</a><br/>Door Instances - <a href="5-di.html#SP3">§3</a>, <a href="5-di.html#SP5">§5</a>, <a href="5-di.html#SP6">§6</a><br/>Region Instances - <a href="5-ri.html#SP2">§2</a><br/>Kind Constructors - <a href="5-kc.html#SP11_1_3">§11.1.3</a><br/>Test Scripts - <a href="5-ts.html#SP4">§4</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP1">§1</a>, <a href="6-tm.html#SP2">§2</a><br/>Emit Property Values - <a href="7-epv.html#SP1">§1</a>, <a href="7-epv.html#SP2">§2</a><br/>Action Patterns - <a href="7-ap.html#SP6_1_1_1">§6.1.1.1</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1_1">§1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</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">I</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">I</span><span class="plain-syntax">-></span><span class="identifier-syntax">icd</span><span class="plain-syntax">.</span><span class="element-syntax">instance_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
|
|
@ -86,6 +86,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_GPR_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_instance_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_instance_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_count_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inc_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dec_iname</span><span class="plain-syntax">;</span>
|
||||
|
@ -105,6 +106,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">instance_GPR_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">first_instance_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">next_instance_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">instance_count_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">pr_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">inc_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">dec_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
@ -173,24 +175,57 @@ of the kind which the constructor makes:
|
|||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::set_list_iname</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">RTKindConstructors::set_list_iname</span></span>:<br/>List Literals - <a href="4-ll.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">list_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::first_instance_iname</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">RTKindConstructors::first_instance_iname</span></span>:<br/>Instance Counting - <a href="7-ic.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::first_instance_iname</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">RTKindConstructors::first_instance_iname</span></span>:<br/>Instance Counting - <a href="2-ic.html#SP8">§8</a>, <a href="2-ic.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">first_instance_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">first_instance_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">FIRST_INSTANCE_HL</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><a href="5-kc.html#SP1" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</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">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">first_instance_iname</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">RTKindConstructors::set_first_instance_iname</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">RTKindConstructors::set_first_instance_iname</span></span>:<br/>Instance Counting - <a href="7-ic.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">first_instance_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::next_instance_iname</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">RTKindConstructors::next_instance_iname</span></span>:<br/>Instance Counting - <a href="7-ic.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::next_instance_iname</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">RTKindConstructors::next_instance_iname</span></span>:<br/>Instance Counting - <a href="2-ic.html#SP10_2">§10.2</a>, <a href="2-ic.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">next_instance_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">next_instance_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NEXT_INSTANCE_HL</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><a href="5-kc.html#SP1" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</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">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">next_instance_iname</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">RTKindConstructors::set_next_instance_iname</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">RTKindConstructors::set_next_instance_iname</span></span>:<br/>Instance Counting - <a href="7-ic.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">next_instance_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::instance_count_iname</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">RTKindConstructors::instance_count_iname</span></span>:<br/>Instance Counting - <a href="2-ic.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">instance_count_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_range_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = -1;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</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">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_1_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_2_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_3_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_4_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_5_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_6_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_7_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_8_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_9_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">10</span><span class="plain-syntax">: </span><span class="identifier-syntax">hl</span><span class="plain-syntax"> = </span><span class="constant-syntax">COUNT_INSTANCE_10_HL</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</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">hl</span><span class="plain-syntax"> == -1)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">instance_count_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_HL</span><span class="plain-syntax">, </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">),</span>
|
||||
<span class="plain-syntax"> </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">instance_count_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">hl</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">instance_count_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Convenient storage for some names.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_kind_GPR_iname</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">RTKindConstructors::get_kind_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_kind_GPR_iname</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">RTKindConstructors::get_kind_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">kind_GPR_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
|
@ -201,7 +236,7 @@ of the kind which the constructor makes:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">kind_GPR_iname</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="function-syntax">RTKindConstructors::get_instance_GPR_iname</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_instance_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_instance_GPR_iname</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">RTKindConstructors::get_instance_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">instance_GPR_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
|
@ -215,7 +250,7 @@ of the kind which the constructor makes:
|
|||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_iname</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a>, <a href="5-kc.html#SP11_1">§11.1</a><br/>Showme Command - <a href="2-sc.html#SP6_1_1_1">§6.1.1.1</a><br/>Rulebooks - <a href="5-rlb.html#SP14">§14</a><br/>Relations - <a href="5-rlt.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_iname</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a>, <a href="5-kc.html#SP11_1">§11.1</a><br/>Showme Command - <a href="2-sc.html#SP6_1_1_1">§6.1.1.1</a><br/>Rulebooks - <a href="5-rlb.html#SP14">§14</a><br/>Relations - <a href="5-rlt.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">K_number</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::get_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null kind has no printing routine"</span><span class="plain-syntax">);</span>
|
||||
|
@ -298,37 +333,37 @@ of the kind which the constructor makes:
|
|||
<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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">pr_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::kind_package</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::kind_package</span></span>:<br/><a href="5-kc.html#SP3">§3</a>, <a href="5-kc.html#SP11">§11</a><br/>Hierarchy - <a href="2-hrr.html#SP10">§10</a><br/>Emit - <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP17">§17</a><br/>Short Names - <a href="2-sn.html#SP1">§1</a><br/>List Literals - <a href="4-ll.html#SP7">§7</a><br/>Emit Property Values - <a href="7-epv.html#SP3">§3</a>, <a href="7-epv.html#SP12">§12</a><br/>Instance Counting - <a href="7-ic.html#SP9">§9</a>, <a href="7-ic.html#SP11_2">§11.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::kind_package</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::kind_package</span></span>:<br/><a href="5-kc.html#SP2">§2</a>, <a href="5-kc.html#SP3">§3</a>, <a href="5-kc.html#SP11">§11</a><br/>Hierarchy - <a href="2-hrr.html#SP10">§10</a><br/>Emit - <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP17">§17</a><br/>Instance Counting - <a href="2-ic.html#SP10_2">§10.2</a><br/>Short Names - <a href="2-sn.html#SP1">§1</a><br/>List Literals - <a href="4-ll.html#SP7">§7</a><br/>Emit Property Values - <a href="7-epv.html#SP3">§3</a>, <a href="7-epv.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-kc.html#SP1" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</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="function-syntax">RTKindConstructors::get_inc_iname</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_inc_iname</span></span>:<br/><a href="5-kc.html#SP11_1_4">§11.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_inc_iname</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_inc_iname</span></span>:<br/><a href="5-kc.html#SP11_1_4">§11.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">"null kind has no inc routine"</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inc_iname</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inc_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inc_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DECREMENT_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inc_iname</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="function-syntax">RTKindConstructors::get_dec_iname</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_dec_iname</span></span>:<br/><a href="5-kc.html#SP11_1_4">§11.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_dec_iname</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_dec_iname</span></span>:<br/><a href="5-kc.html#SP11_1_4">§11.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">"null kind has no dec routine"</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">dec_iname</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">dec_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">dec_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCREMENT_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">dec_iname</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="function-syntax">RTKindConstructors::get_ranger_iname</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_ranger_iname</span></span>:<br/><a href="5-kc.html#SP11_1_5">§11.1.5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_ranger_iname</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_ranger_iname</span></span>:<br/><a href="5-kc.html#SP11_1_5">§11.1.5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">"null kind has no ranger fn"</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ranger_iname</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ranger_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ranger_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RANGER_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ranger_iname</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="function-syntax">RTKindConstructors::get_mkdef_iname</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_mkdef_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_mkdef_iname</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_mkdef_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</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">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">mkdef_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">mkdef_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MKDEF_FN_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP1" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</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">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">mkdef_iname</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="function-syntax">RTKindConstructors::get_debug_print_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_debug_print_fn_iname</span></span>:<br/>Actions - <a href="5-act2.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_debug_print_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_debug_print_fn_iname</span></span>:<br/>Actions - <a href="5-act2.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_number</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">debug_print_fn_iname</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">debug_print_fn_iname</span><span class="plain-syntax">;</span>
|
||||
|
@ -346,25 +381,25 @@ of the kind which the constructor makes:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">debug_print_fn_iname</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="function-syntax">RTKindConstructors::get_explicit_I6_GPR_iname</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR_iname</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="7-nft.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">"RTKindConstructors::get_explicit_I6_GPR on null kind"</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">explicit_GPR_identifier</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</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">Produce::find_by_name</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">explicit_GPR_identifier</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>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_distinguisher_iname</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_distinguisher_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP8">§8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_distinguisher_iname</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_distinguisher_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP8">§8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_distinguisher</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</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">Produce::find_by_name</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><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">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_comparison_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_comparison_fn_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_comparison_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_comparison_fn_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</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">Produce::find_by_name</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">KindConstructors::get_comparison_fn_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</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="function-syntax">RTKindConstructors::get_support_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_support_fn_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_support_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_support_fn_iname</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</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">N</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">N</span><span class="plain-syntax">, </span><span class="string-syntax">"%S_Support"</span><span class="plain-syntax">, </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-></span><span class="identifier-syntax">explicit_identifier</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><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
||||
|
@ -383,7 +418,7 @@ not, it returns <span class="extract"><span class="extract-syntax">NULL</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">RTKindConstructors::get_explicit_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR</span></span>:<br/><a href="5-kc.html#SP4">§4</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_explicit_I6_GPR</span></span>:<br/><a href="5-kc.html#SP4">§4</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">"RTKindConstructors::get_explicit_I6_GPR on null kind"</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">explicit_GPR_identifier</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -392,7 +427,7 @@ not, it returns <span class="extract"><span class="extract-syntax">NULL</span></
|
|||
</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">RTKindConstructors::offers_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::offers_I6_GPR</span></span>:<br/><a href="5-kc.html#SP7">§7</a><br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::offers_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::offers_I6_GPR</span></span>:<br/><a href="5-kc.html#SP7">§7</a><br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">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">KindConstructors::offers_I6_GPR</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -417,7 +452,7 @@ this will be allowed or not.
|
|||
</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">RTKindConstructors::needs_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::needs_I6_GPR</span></span>:<br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::needs_I6_GPR</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::needs_I6_GPR</span></span>:<br/>Tokens Parsing Values - <a href="7-tpv.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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">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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">needs_GPR</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -432,7 +467,7 @@ parsing names of objects, but not as a grammar token in its own right.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="identifier-syntax">recognition_routine</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="function-syntax">RTKindConstructors::get_recognition_only_GPR_as_iname</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_recognition_only_GPR_as_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::get_recognition_only_GPR_as_iname</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_recognition_only_GPR_as_iname</span></span>:<br/>Parse Name Properties - <a href="6-pnp.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP9" class="function-link"><span class="function-syntax">RTKindConstructors::get_recognition_only_GPR</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</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">Produce::find_by_name</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
||||
|
@ -442,12 +477,12 @@ parsing names of objects, but not as a grammar token in its own right.
|
|||
</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">RTKindConstructors::get_highest_valid_value_as_integer</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer</span></span>:<br/><a href="5-kc.html#SP11_1_5">§11.1.5</a><br/>List Literals - <a href="4-ll.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer</span></span>:<br/><a href="5-kc.html#SP11_1_5">§11.1.5</a><br/>List Literals - <a href="4-ll.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</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="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-kc.html#SP10" class="function-link"><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer_kc</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</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">RTKindConstructors::get_highest_valid_value_as_integer_kc</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer_kc</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer_kc</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::get_highest_valid_value_as_integer_kc</span></span>:<br/><a href="5-kc.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</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">kc</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="constant-syntax">0</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">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_activity</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">activity</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">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_equation</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -121,7 +121,7 @@ package already supplied:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">prn</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">prop_package</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="function-syntax">RTProperties::iname</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">RTProperties::iname</span></span>:<br/><a href="5-prp.html#SP5">§5</a>, <a href="5-prp.html#SP6">§6</a>, <a href="5-prp.html#SP6_5">§6.5</a>, <a href="5-prp.html#SP9">§9</a>, <a href="5-prp.html#SP10_1">§10.1</a>, <a href="5-prp.html#SP10_2">§10.2</a><br/>Emit - <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP18">§18</a><br/>Showme Command - <a href="2-sc.html#SP6_1">§6.1</a>, <a href="2-sc.html#SP6_1_1">§6.1.1</a>, <a href="2-sc.html#SP6_1_1_1">§6.1.1.1</a>, <a href="2-sc.html#SP6_2">§6.2</a><br/>Scene Instances - <a href="5-si.html#SP6_1">§6.1</a><br/>Relations - <a href="5-rlt.html#SP6_3_3">§6.3.3</a><br/>Parse Name Properties - <a href="6-pnp.html#SP4_3_1">§4.3.1</a>, <a href="6-pnp.html#SP6_2">§6.2</a>, <a href="6-pnp.html#SP8">§8</a>, <a href="6-pnp.html#SP10">§10</a><br/>Emit Property Values - <a href="7-epv.html#SP6">§6</a><br/>Instance Counting - <a href="7-ic.html#SP12">§12</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTProperties::iname</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">RTProperties::iname</span></span>:<br/><a href="5-prp.html#SP5">§5</a>, <a href="5-prp.html#SP6">§6</a>, <a href="5-prp.html#SP6_5">§6.5</a>, <a href="5-prp.html#SP9">§9</a>, <a href="5-prp.html#SP10_1">§10.1</a>, <a href="5-prp.html#SP10_2">§10.2</a><br/>Emit - <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP18">§18</a><br/>Instance Counting - <a href="2-ic.html#SP4">§4</a><br/>Showme Command - <a href="2-sc.html#SP6_1">§6.1</a>, <a href="2-sc.html#SP6_1_1">§6.1.1</a>, <a href="2-sc.html#SP6_1_1_1">§6.1.1.1</a>, <a href="2-sc.html#SP6_2">§6.2</a><br/>Scene Instances - <a href="5-si.html#SP6_1">§6.1</a><br/>Relations - <a href="5-rlt.html#SP6_3_3">§6.3.3</a><br/>Parse Name Properties - <a href="6-pnp.html#SP4_3_1">§4.3.1</a>, <a href="6-pnp.html#SP6_2">§6.2</a>, <a href="6-pnp.html#SP8">§8</a>, <a href="6-pnp.html#SP10">§10</a><br/>Emit Property Values - <a href="7-epv.html#SP6">§6</a><br/>Command Grammar Lines - <a href="7-cgl.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</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">prn</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">"tried to find iname for null property"</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">Properties::is_either_or</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) && (</span><span class="identifier-syntax">prn</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">store_in_negation</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
|
||||
|
|
|
@ -1380,10 +1380,10 @@ this is done by the function <span class="extract"><span class="extract-syntax">
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">right_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryPredicates::term_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="constant-syntax">1</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">left_kind</span><span class="plain-syntax">)) && (</span><span class="identifier-syntax">left_count</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="7-ic.html#SP12" class="function-link"><span class="function-syntax">PL::Counting::instance_count_property_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left_kind</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-ic.html#SP4" class="function-link"><span class="function-syntax">InstanceCounting::IK_count_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left_kind</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">right_kind</span><span class="plain-syntax">)) && (</span><span class="identifier-syntax">right_count</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="7-ic.html#SP12" class="function-link"><span class="function-syntax">PL::Counting::instance_count_property_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right_kind</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-ic.html#SP4" class="function-link"><span class="function-syntax">InstanceCounting::IK_count_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right_kind</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">left_count</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -871,7 +871,7 @@ and in this case we therefore ignore <span class="extract"><span class="extract-
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-ic.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresscurrent">ap</li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-gng.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-epv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresscurrent">ap</li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-gng.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -470,7 +470,7 @@ being matched against the snippet of words.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-gng.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresscurrent">cg</li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-cgl.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-gng.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresscurrent">cg</li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-cgl.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -1635,7 +1635,7 @@ nothing else.
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-cgl.html#SP10">§10</a> (four times), <a href="7-cgl.html#SP10_1">§10.1</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-cg.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresscurrent">cgl</li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-nft.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-cg.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresscurrent">cgl</li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-nft.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -529,7 +529,7 @@ and it seems best to reject the extra complexity needed.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="6-pnp.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresscurrent">epv</li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-ic.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="6-pnp.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresscurrent">epv</li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-ap.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-ap.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresscurrent">gng</li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-cg.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-ap.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresscurrent">gng</li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-cg.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -1,511 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Instance Counting</title>
|
||||
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Language" content="en-gb">
|
||||
|
||||
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<script>
|
||||
function togglePopup(material_id) {
|
||||
var popup = document.getElementById(material_id);
|
||||
popup.classList.toggle("show");
|
||||
}
|
||||
</script>
|
||||
|
||||
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<script>
|
||||
MathJax = {
|
||||
tex: {
|
||||
inlineMath: '$', '$'], ['\\(', '\\)'
|
||||
},
|
||||
svg: {
|
||||
fontCache: 'global'
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" id="MathJax-script" async
|
||||
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
||||
</script>
|
||||
|
||||
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
|
||||
</head>
|
||||
<body class="commentary-font">
|
||||
<nav role="navigation">
|
||||
<h1><a href="../index.html">
|
||||
<img src="../docs-assets/Inform.png" height=72">
|
||||
</a></h1>
|
||||
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
||||
<li><a href="../other.html">other tools</a></li>
|
||||
<li><a href="../extensions.html">extensions and kits</a></li>
|
||||
<li><a href="../units.html">unit test tools</a></li>
|
||||
</ul><h2>Compiler Webs</h2><ul>
|
||||
<li><a href="../inbuild/index.html">inbuild</a></li>
|
||||
<li><a href="../inform7/index.html">inform7</a></li>
|
||||
<li><a href="../inter/index.html">inter</a></li>
|
||||
</ul><h2>Inbuild Modules</h2><ul>
|
||||
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
||||
</ul><h2>Inform7 Modules</h2><ul>
|
||||
<li><a href="../core-module/index.html">core</a></li>
|
||||
<li><a href="../assertions-module/index.html">assertions</a></li>
|
||||
<li><a href="../values-module/index.html">values</a></li>
|
||||
<li><a href="../knowledge-module/index.html">knowledge</a></li>
|
||||
<li><a href="../imperative-module/index.html">imperative</a></li>
|
||||
<li><a href="index.html"><span class="selectedlink">runtime</span></a></li>
|
||||
<li><a href="../if-module/index.html">if</a></li>
|
||||
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
||||
<li><a href="../index-module/index.html">index</a></li>
|
||||
</ul><h2>Inter Modules</h2><ul>
|
||||
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
||||
<li><a href="../building-module/index.html">building</a></li>
|
||||
<li><a href="../codegen-module/index.html">codegen</a></li>
|
||||
</ul><h2>Services</h2><ul>
|
||||
<li><a href="../arch-module/index.html">arch</a></li>
|
||||
<li><a href="../calculus-module/index.html">calculus</a></li>
|
||||
<li><a href="../html-module/index.html">html</a></li>
|
||||
<li><a href="../inflections-module/index.html">inflections</a></li>
|
||||
<li><a href="../kinds-module/index.html">kinds</a></li>
|
||||
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
||||
<li><a href="../problems-module/index.html">problems</a></li>
|
||||
<li><a href="../syntax-module/index.html">syntax</a></li>
|
||||
<li><a href="../words-module/index.html">words</a></li>
|
||||
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<main role="main">
|
||||
<!--Weave of 'Instance Counting' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#7">Chapter 7: Still Unsorted</a></li><li><b>Instance Counting</b></li></ul></div>
|
||||
<p class="purpose">A plugin which maintains run-time-accessible linked lists of instances of kinds, in order to speed up loops; and instance counts within kinds, in order to speed up relation storage; and the object-kind hierarchy, in order to speed up run-time checking of the type safety of property usage.</p>
|
||||
|
||||
<ul class="toc"><li><a href="7-ic.html#SP3">§3. Plugin startup</a></li><li><a href="7-ic.html#SP4">§4. Initialising</a></li><li><a href="7-ic.html#SP5">§5. Computing instance counts</a></li><li><a href="7-ic.html#SP7">§7. Instance sequences</a></li><li><a href="7-ic.html#SP9">§9. Inform 6 representation</a></li><li><a href="7-ic.html#SP13">§13. Loop optimisation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Every subject contains a pointer to its own unique copy of the following
|
||||
structure, but it only has relevance if the subject represents an object:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) </span><span class="identifier-syntax">PLUGIN_DATA_ON_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<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">counting_data</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_count_prop</span><span class="plain-syntax">; </span><span class="comment-syntax"> the (</span><span class="extract"><span class="extract-syntax">I6</span></span><span class="comment-syntax"> only) IK-Count property for this kind</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_link_prop</span><span class="plain-syntax">; </span><span class="comment-syntax"> the (</span><span class="extract"><span class="extract-syntax">I6</span></span><span class="comment-syntax"> only) IK-Link property for this kind</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">has_instances</span><span class="plain-syntax">; </span><span class="comment-syntax"> are there any instances of this kind?</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">counting_data</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure counting_data is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>In addition to these I6 properties, two for each kind, there's a single
|
||||
additional property called <span class="extract"><span class="extract-syntax">vector</span></span> which is needed as run-time storage for
|
||||
route-finding through relations on objects.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P_vector</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P_KD_Count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> see below</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Plugin startup. </b></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">PL::Counting::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_SUBJECT_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="7-ic.html#SP4" class="function-link"><span class="function-syntax">PL::Counting::counting_new_subject_notify</span></a><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPLETE_MODEL_PLUG</span><span class="plain-syntax">, </span><a href="7-ic.html#SP11" class="function-link"><span class="function-syntax">PL::Counting::counting_complete_model</span></a><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRODUCTION_LINE_PLUG</span><span class="plain-syntax">, </span><a href="7-ic.html#SP3" class="function-link"><span class="function-syntax">PL::Counting::production_line</span></a><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">PL::Counting::production_line</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stage</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">, </span><span class="identifier-syntax">stopwatch_timer</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sequence_timer</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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER1_CSEQ</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::counting_compile_model_tables</span></a><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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Initialising. </b>Counting data is actually relevant only for kinds, and remains blank for instances.
|
||||
</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">PL::Counting::counting_new_subject_notify</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">PL::Counting::counting_new_subject_notify</span></span>:<br/><a href="7-ic.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ATTACH_PLUGIN_DATA_TO_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">, </span><a href="7-ic.html#SP4" class="function-link"><span class="function-syntax">PL::Counting::new_data</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">subj</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>
|
||||
|
||||
<span class="reserved-syntax">counting_data</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Counting::new_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">counting_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">counting_data</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">cd</span><span class="plain-syntax">-></span><span class="element-syntax">instance_count_prop</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">cd</span><span class="plain-syntax">-></span><span class="element-syntax">instance_link_prop</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">cd</span><span class="plain-syntax">-></span><span class="element-syntax">has_instances</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">cd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Computing instance counts. </b>We're going to store these temporarily in an array which must be allocated
|
||||
dynamically in memory, and this will make lookups quite fiddly, so we
|
||||
use the following macro to specify the integer lvalue for the instance
|
||||
count of instance <span class="extract"><span class="extract-syntax">I</span></span> within kind <span class="extract"><span class="extract-syntax">k</span></span>. This depends on both: for example,
|
||||
the red car might be thing number 17 but vehicle number 2, and will be
|
||||
door number \(-1\), since it isn't a door. The first instance in a kind is
|
||||
numbered 0.
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax">[(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">*</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax"> +</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Behaviour::get_range_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)]</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Counting::make_instance_counts</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">PL::Counting::make_instance_counts</span></span>:<br/><a href="7-ic.html#SP11">§11</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="named-paragraph-container code-font"><a href="7-ic.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Allocate the instance count array in memory</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Compute the instance count array</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Allocate the instance count array in memory</span><span class="named-paragraph-number">5.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">max_kind_instance_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_instance_counts</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Memory::calloc</span><span class="plain-syntax">(</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax">*</span><span class="identifier-syntax">max_kind_instance_count</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax">),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNTING_MREASON</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b>The following is quadratic in the number of objects, but this has never been
|
||||
a problem in practice; the number seldom exceeds a few hundred.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compute the instance count array</span><span class="named-paragraph-number">5.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="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">) = -1;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix_count</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">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">) = </span><span class="identifier-syntax">ix_count</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Instance counts are actually useful to several other plugins, so we provide:
|
||||
</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">PL::Counting::instance_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kind_instance_counts</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">"instance counts not available"</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">K</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">"instance counts available only for objects"</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">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Instance sequences. </b>At run-time we're going to want to loop through objects in order of their
|
||||
definition in the I6 code, which is not the same as their creation order in I7.
|
||||
(This is so that an optimised and an unoptimised loop to perform the same
|
||||
search will not only iterate through the same set of objects, but in the
|
||||
same order.)
|
||||
</p>
|
||||
|
||||
<p class="commentary">The following abstracts the linked list in compilation sequence. Note that
|
||||
it excludes instances which have been "diverted", which is mainly used
|
||||
to get rid of the <span class="extract"><span class="extract-syntax">selfobj</span></span> object in cases where the source text creates
|
||||
an explicit player.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Counting::next_instance_of</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">PL::Counting::next_instance_of</span></span>:<br/><a href="7-ic.html#SP8">§8</a>, <a href="7-ic.html#SP9">§9</a><br/>List Literals - <a href="4-ll.html#SP7_2">§7.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">k</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">resuming</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">I</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_IN_INSTANCE_ORDERING</span><span class="plain-syntax">; </span><span class="identifier-syntax">resuming</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</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">resuming</span><span class="plain-syntax">) </span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_IN_INSTANCE_ORDERING</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resuming</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">I</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">InferenceSubjects::aliased_but_diverted</span><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">selfobj</span></span><span class="comment-syntax"> may not count</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Instances::of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>For compilation purposes, it's useful to express this as a specification:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Counting::next_instance_of_as_value</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">PL::Counting::next_instance_of_as_value</span></span>:<br/><a href="7-ic.html#SP11_3_3">§11.3.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP7" class="function-link"><span class="function-syntax">PL::Counting::next_instance_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">next</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Rvalues::from_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">next</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">Rvalues::new_nothing_object_constant</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Inform 6 representation. </b>The main purpose of this plugin is to trade memory for speed at run-time.
|
||||
Inform source text is rich in implied searches through kinds ("if a red
|
||||
door is open, ...") and we need these to be as fast as possible; iterating
|
||||
through all objects would be dangerously slow, so we need a way at run-time
|
||||
to iterate through the instances of a single kind (in this example, doors).
|
||||
</p>
|
||||
|
||||
<p class="commentary">For each kind we will store a linked list of instances. The first instance
|
||||
need only be defined as a constant, and need not be stored in a memory word,
|
||||
since Inform always compiles code which knows which kind it's looping over.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Counting::first_instance</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">PL::Counting::first_instance</span></span>:<br/><a href="7-ic.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::first_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">FIRST_INSTANCE_HL</span><span class="plain-syntax">, </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::set_first_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</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">iname</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="function-syntax">PL::Counting::next_instance</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">PL::Counting::next_instance</span></span>:<br/><a href="7-ic.html#SP11_2">§11.2</a>, <a href="7-ic.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::next_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NEXT_INSTANCE_HL</span><span class="plain-syntax">, </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::set_next_instance_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</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">iname</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="function-syntax">PL::Counting::instance_count_iname</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">PL::Counting::instance_count_iname</span></span>:<br/><a href="7-ic.html#SP11_2">§11.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_range_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_1_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_2_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">3</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_3_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">4</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_4_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">5</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_5_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">6</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_6_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">7</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_7_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">8</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_8_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">9</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_9_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">10</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_10_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COUNT_INSTANCE_HL</span><span class="plain-syntax">, </span><a href="2-kd.html#SP5" class="function-link"><span class="function-syntax">RTKindDeclarations::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Counting::counting_compile_model_tables</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">PL::Counting::counting_compile_model_tables</span></span>:<br/><a href="7-ic.html#SP3">§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="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::first_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP7" class="function-link"><span class="function-syntax">PL::Counting::next_instance_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">next</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-emt.html#SP11" class="function-link"><span class="function-syntax">Emit::iname_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="5-ins.html#SP1" class="function-link"><span class="function-syntax">RTInstances::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">next</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><a href="2-emt.html#SP11" class="function-link"><span class="function-syntax">Emit::iname_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Counting kinds of object, not very quickly:
|
||||
</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">PL::Counting::kind_of_object_count</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">PL::Counting::kind_of_object_count</span></span>:<br/><a href="7-ic.html#SP11_3_1">§11.3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</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">K</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="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IK</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">c</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">IK</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</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="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>So now the compiler can define the start of a linked list of instances
|
||||
for a given kind, but how can it define the inductive step? The answer is
|
||||
that every instance of kind number 4 (say) provides an I6 property <span class="extract"><span class="extract-syntax">IK4_Link</span></span>
|
||||
whose value is the next instance, or else <span class="extract"><span class="extract-syntax">nothing</span></span> if it's the last.
|
||||
</p>
|
||||
|
||||
<p class="commentary">A further property, <span class="extract"><span class="extract-syntax">IK4_Count</span></span>, holds the instance count; this is used for
|
||||
efficient access to various-to-various relation storage at run-time. If we
|
||||
have a relation of various doors to various rooms, say, we want to store a
|
||||
bitmap only \(D\times R\) in size, but then to access this quickly given a
|
||||
specific door and room, we need to convert these quickly to their indices;
|
||||
this is what <span class="extract"><span class="extract-syntax">IK4_Count</span></span> does.
|
||||
</p>
|
||||
|
||||
<p class="commentary">We create these properties, and assert these property values, during stage IV
|
||||
of model completion:
|
||||
</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">PL::Counting::counting_complete_model</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">PL::Counting::counting_complete_model</span></span>:<br/><a href="7-ic.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stage</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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">WORLD_STAGE_I</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP11_1" class="named-paragraph-link"><span class="named-paragraph">Create and assert zero values of the vector property</span><span class="named-paragraph-number">11.1</span></a></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">stage</span><span class="plain-syntax"> == </span><span class="identifier-syntax">WORLD_STAGE_V</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP11_2" class="named-paragraph-link"><span class="named-paragraph">Create the two instance properties for each kind of object</span><span class="named-paragraph-number">11.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="7-ic.html#SP5" class="function-link"><span class="function-syntax">PL::Counting::make_instance_counts</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP11_3" class="named-paragraph-link"><span class="named-paragraph">Assert values of the two instance properties for each instance</span><span class="named-paragraph-number">11.3</span></a></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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>§11.1. </b>The <span class="extract"><span class="extract-syntax">vector</span></span> property exists only at the I6 level, and provides workspace
|
||||
for the relation-route-finding code at run time.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create and assert zero values of the vector property</span><span class="named-paragraph-number">11.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">P_vector</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ValueProperties::new_nameless</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"vector"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">zero</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span><span class="identifier-syntax">P_vector</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">zero</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP11">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_2" class="paragraph-anchor"></a><b>§11.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create the two instance properties for each kind of object</span><span class="named-paragraph-number">11.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="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BASE_KINDS</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">count_iname</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::instance_count_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="identifier-syntax">instance_count_prop</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::new_nameless_using</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">count_iname</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">next_iname</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::next_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="identifier-syntax">instance_link_prop</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::new_nameless_using</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="5-kc.html#SP4" class="function-link"><span class="function-syntax">RTKindConstructors::kind_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">next_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">P_KD_Count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ValueProperties::new_nameless</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"KD_Count"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP11">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_3" class="paragraph-anchor"></a><b>§11.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Assert values of the two instance properties for each instance</span><span class="named-paragraph-number">11.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="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_INSTANCES</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP11_3_1" class="named-paragraph-link"><span class="named-paragraph">Fill in the special IK0-Count property</span><span class="named-paragraph-number">11.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax">; </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InferenceSubjects::narrowest_broader_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">has_instances</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="7-ic.html#SP11_3_2" class="named-paragraph-link"><span class="named-paragraph">Fill in this IK-Count property</span><span class="named-paragraph-number">11.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ic.html#SP11_3_3" class="named-paragraph-link"><span class="named-paragraph">Fill in this IK-Link property</span><span class="named-paragraph-number">11.3.3</span></a></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="7-ic.html#SP11">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_3_1" class="paragraph-anchor"></a><b>§11.3.1. </b>As noted above, <span class="extract"><span class="extract-syntax">KD_Count</span></span> is a special case. This looks as if it should be
|
||||
the instance count of "kind" itself, but that would be useless, since no
|
||||
instance object can ever have kind "kind" — instances aren't kinds.
|
||||
</p>
|
||||
|
||||
<p class="commentary">Instead it holds the kind number of its own (direct) kind. For example, if the
|
||||
instance object is the red door, its <span class="extract"><span class="extract-syntax">KD_Count</span></span> value will be 4, meaning that
|
||||
its kind is kind number 4, which according to the <span class="extract"><span class="extract-syntax">KindHierarchy</span></span> array is
|
||||
<span class="extract"><span class="extract-syntax">K4_door</span></span>. Again, this is needed for rapid checking at run-time that property
|
||||
usage is legal.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in the special IK0-Count property</span><span class="named-paragraph-number">11.3.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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ic</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP10" class="function-link"><span class="function-syntax">PL::Counting::kind_of_object_count</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">ic</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">P_KD_Count</span><span class="plain-syntax">, </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">the_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP11_3">§11.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_3_2" class="paragraph-anchor"></a><b>§11.3.2. </b>And otherwise, for every kind that the instance belongs to (directly or
|
||||
indirectly) it gets the relevant instance count as a property value. For
|
||||
example, the red door might have <span class="extract"><span class="extract-syntax">IK4_Count</span></span> set to 3 — it's door number 3,
|
||||
let's suppose — and <span class="extract"><span class="extract-syntax">IK2_Count</span></span> set to 19 — it's thing number 19. It doesn't
|
||||
have an <span class="extract"><span class="extract-syntax">IK7_Count</span></span> property at all, since it isn't a backdrop (kind number 7),
|
||||
and so on for all other kinds.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in this IK-Count property</span><span class="named-paragraph-number">11.3.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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ic</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INSTANCE_COUNT</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">ic</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">instance_count_prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">the_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP11_3">§11.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_3_3" class="paragraph-anchor"></a><b>§11.3.3. </b>The IK-Link property is never set for kind 0, so there's no special case. It
|
||||
records the next instance in compilation order:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in this IK-Link property</span><span class="named-paragraph-number">11.3.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="identifier-syntax">ValueProperties::assert</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">instance_link_prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Instances::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><a href="7-ic.html#SP8" class="function-link"><span class="function-syntax">PL::Counting::next_instance_of_as_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ic.html#SP11_3">§11.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Counting::instance_count_property_symbol</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">PL::Counting::instance_count_property_symbol</span></span>:<br/>Relations - <a href="5-rlt.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">instance_count_prop</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">P</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Loop optimisation. </b>Lastly, then, the coup de grace: here's where we define loop schemas to
|
||||
perform loops through kinds quickly at run-time. We start from the First
|
||||
constants, and use the Link constants to progress; we stop at <span class="extract"><span class="extract-syntax">nothing</span></span>.
|
||||
</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">PL::Counting::optimise_loop</span><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginManager::active</span><span class="plain-syntax">(</span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindSubjects::from_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">COUNTING_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-></span><span class="element-syntax">has_instances</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="comment-syntax"> (to avoid writing misleading code)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"for (*1=nothing: false: )"</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_iname</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::first_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">next_iname</span><span class="plain-syntax"> = </span><a href="7-ic.html#SP9" class="function-link"><span class="function-syntax">PL::Counting::next_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"for (*1=%n: *1: *1=*1.%n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">first_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">next_iname</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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-epv.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresscurrent">ic</li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-ap.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -352,7 +352,7 @@ that's why.)
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-cgl.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresscurrent">nft</li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-tpv.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-cgl.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresscurrent">nft</li><li class="progresssection"><a href="7-tpv.html">tpv</a></li><li class="progressnext"><a href="7-tpv.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -329,7 +329,7 @@ function togglePopup(material_id) {
|
|||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-tpv.html#SP1_1">§1.1</a> (three times).</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-nft.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ic.html">ic</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresscurrent">tpv</li><li class="progressnextoff">❯</li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="7-nft.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-gm.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</a></li><li class="progresschapter"><a href="5-act.html">5</a></li><li class="progresschapter"><a href="6-bd.html">6</a></li><li class="progresscurrentchapter">7</li><li class="progresssection"><a href="7-epv.html">epv</a></li><li class="progresssection"><a href="7-ap.html">ap</a></li><li class="progresssection"><a href="7-gng.html">gng</a></li><li class="progresssection"><a href="7-cg.html">cg</a></li><li class="progresssection"><a href="7-cgl.html">cgl</a></li><li class="progresssection"><a href="7-nft.html">nft</a></li><li class="progresscurrent">tpv</li><li class="progressnextoff">❯</li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -143,6 +143,11 @@
|
|||
<spon class="sectiontitle">Equality Schemas</span></a> -
|
||||
<span class="sectionpurpose">To define how to compile a comparisom of two values.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="2-ic.html">
|
||||
<spon class="sectiontitle">Instance Counting</span></a> -
|
||||
<span class="sectionpurpose">Though a plugin, for convenience of implementation, this code is always active and provides for efficient loops through instances at runtime.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="2-kd.html">
|
||||
<spon class="sectiontitle">Kind Declarations</span></a> -
|
||||
|
@ -413,11 +418,6 @@
|
|||
<spon class="sectiontitle">Emit Property Values</span></a> -
|
||||
<span class="sectionpurpose">To feed the hierarchy of instances and their property values, and kinds, into Inter.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="7-ic.html">
|
||||
<spon class="sectiontitle">Instance Counting</span></a> -
|
||||
<span class="sectionpurpose">A plugin which maintains run-time-accessible linked lists of instances of kinds, in order to speed up loops; and instance counts within kinds, in order to speed up relation storage; and the object-kind hierarchy, in order to speed up run-time checking of the type safety of property usage.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="7-ap.html">
|
||||
<spon class="sectiontitle">Action Patterns</span></a> -
|
||||
|
|
|
@ -64,11 +64,11 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- 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
|
||||
---- actions_rcd_data 1880 objects, 60160 bytes
|
||||
---- command_grammar 130 objects, 58240 bytes
|
||||
---- kind_constructor 77 objects, 56672 bytes
|
||||
---- table 7 objects, 56672 bytes
|
||||
---- kind_constructor 77 objects, 56056 bytes
|
||||
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
|
||||
---- cg_token 603 objects, 53064 bytes
|
||||
---- property_inference_data 1315 objects, 52600 bytes
|
||||
|
@ -83,6 +83,7 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- shared_variable_access_list_array 12 x 100 = 1200 objects, 38784 bytes
|
||||
---- parsing_data 670 objects, 37520 bytes
|
||||
---- production_list 616 objects, 34496 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, 30720 bytes
|
||||
|
@ -90,7 +91,6 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- verb_sense 403 objects, 29016 bytes
|
||||
---- heading 198 objects, 28512 bytes
|
||||
---- action_pattern_array 7 x 100 = 700 objects, 28224 bytes
|
||||
---- counting_data 670 objects, 26800 bytes
|
||||
---- shared_variable_set_array 6 x 100 = 600 objects, 24192 bytes
|
||||
---- backdrops_data 670 objects, 21440 bytes
|
||||
---- action_name 90 objects, 20160 bytes
|
||||
|
@ -102,8 +102,8 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- parse_node_tree 20 objects, 17280 bytes
|
||||
---- understanding_reference_array 2 x 100 = 200 objects, 16064 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
|
||||
---- match_avinue_array 1 x 1000 objects, 16032 bytes
|
||||
---- method 332 objects, 15936 bytes
|
||||
---- to_phrase_request 59 objects, 15576 bytes
|
||||
---- adjective 137 objects, 14248 bytes
|
||||
|
@ -147,21 +147,21 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- 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
|
||||
---- equation_symbol 30 objects, 2400 bytes
|
||||
---- inter_construct 30 objects, 2400 bytes
|
||||
---- equation_symbol 30 objects, 2400 bytes
|
||||
---- semver_range 22 objects, 2288 bytes
|
||||
---- scene 1 object, 2096 bytes
|
||||
---- pronoun_usage 42 objects, 1680 bytes
|
||||
---- pipeline_step 14 objects, 1680 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
|
||||
---- noun_filter_token 22 objects, 1408 bytes
|
||||
---- inter_annotation_form 35 objects, 1400 bytes
|
||||
---- special_meaning_holder 33 objects, 1320 bytes
|
||||
---- build_script 40 objects, 1280 bytes
|
||||
---- constant_phrase 20 objects, 1280 bytes
|
||||
---- table_column 16 objects, 1280 bytes
|
||||
---- build_script 40 objects, 1280 bytes
|
||||
---- invocation_options_array 1 x 100 objects, 1224 bytes
|
||||
---- direction_inference_data 30 objects, 1200 bytes
|
||||
---- runtime_kind_structure 13 objects, 1040 bytes
|
||||
|
@ -171,8 +171,8 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- submodule_identity 29 objects, 928 bytes
|
||||
---- pipeline_stage 19 objects, 912 bytes
|
||||
---- inbuild_requirement 22 objects, 880 bytes
|
||||
---- code_generation 1 object, 864 bytes
|
||||
---- control_structure_phrase 12 objects, 864 bytes
|
||||
---- code_generation 1 object, 864 bytes
|
||||
---- cached_understanding 21 objects, 840 bytes
|
||||
---- phrase_option_array 1 x 100 objects, 824 bytes
|
||||
---- target_vm 6 objects, 816 bytes
|
||||
|
@ -181,20 +181,20 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- tree_inventory_item 19 objects, 760 bytes
|
||||
---- inform_language 6 objects, 672 bytes
|
||||
---- I6T_intervention 8 objects, 640 bytes
|
||||
---- inter_warehouse_room 10 objects, 640 bytes
|
||||
---- relation_guard 5 objects, 640 bytes
|
||||
---- inter_warehouse_room 10 objects, 640 bytes
|
||||
---- inbuild_search_result 15 objects, 600 bytes
|
||||
---- internal_test 14 objects, 560 bytes
|
||||
---- rulebook_outcome 17 objects, 544 bytes
|
||||
---- small_word_set 11 objects, 528 bytes
|
||||
---- implication 13 objects, 520 bytes
|
||||
---- inform_kit 5 objects, 520 bytes
|
||||
---- implication 13 objects, 520 bytes
|
||||
---- inference_family 11 objects, 440 bytes
|
||||
---- i6_memory_setting 13 objects, 416 bytes
|
||||
---- equation 4 objects, 416 bytes
|
||||
---- i6_memory_setting 13 objects, 416 bytes
|
||||
---- module_package 10 objects, 400 bytes
|
||||
---- article_usage 8 objects, 384 bytes
|
||||
---- bp_family 12 objects, 384 bytes
|
||||
---- article_usage 8 objects, 384 bytes
|
||||
---- source_file 5 objects, 360 bytes
|
||||
---- inbuild_genre 7 objects, 336 bytes
|
||||
---- grammatical_category 8 objects, 320 bytes
|
||||
|
@ -239,7 +239,7 @@ Total memory consumption was 302324K = 295 MB
|
|||
|
||||
36.2% was used for memory not allocated for objects:
|
||||
|
||||
16.9% text stream storage 52372384 bytes in 345461 claims
|
||||
16.9% text stream storage 52372400 bytes in 345461 claims
|
||||
3.6% dictionary storage 11231232 bytes in 20125 claims
|
||||
---- sorting 712 bytes in 3 claims
|
||||
2.3% source text 7200000 bytes in 3 claims
|
||||
|
@ -256,5 +256,5 @@ Total memory consumption was 302324K = 295 MB
|
|||
---- code generation workspace for objects 9648 bytes in 9 claims
|
||||
---- emitter array storage 154432 bytes in 2037 claims
|
||||
|
||||
20.3% was overhead - 63091552 bytes = 61612K = 60 MB
|
||||
20.3% was overhead - 63085576 bytes = 61607K = 60 MB
|
||||
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
100.0% in inform7 run
|
||||
56.1% in compilation to Inter
|
||||
56.2% in compilation to Inter
|
||||
37.8% in //Sequence::undertake_queued_tasks//
|
||||
5.6% in //InferenceSubjects::emit_all//
|
||||
5.7% in //InferenceSubjects::emit_all//
|
||||
3.4% in //MajorNodes::pre_pass//
|
||||
2.9% in //MajorNodes::pass_1//
|
||||
1.5% in //ImperativeDefinitions::assess_all//
|
||||
0.5% in //MajorNodes::pass_2//
|
||||
0.5% in //RTKindConstructors::compile//
|
||||
0.5% in //World::stage_V//
|
||||
0.3% in //ImperativeDefinitions::compile_first_block//
|
||||
0.4% in //ImperativeDefinitions::compile_first_block//
|
||||
0.4% in //MajorNodes::pass_2//
|
||||
0.4% in //RTKindConstructors::compile//
|
||||
0.4% in //World::stage_V//
|
||||
0.3% in //Sequence::undertake_queued_tasks//
|
||||
0.1% in //RTProperties::compile//
|
||||
0.1% in //Task::make_built_in_kind_constructors//
|
||||
0.1% in //World::stages_II_and_III//
|
||||
2.2% not specifically accounted for
|
||||
41.5% in running Inter pipeline
|
||||
10.8% in step preparation
|
||||
10.4% in inter step 7/14: consolidate-text
|
||||
8.9% in inter step 2/14: link
|
||||
7.0% in inter step 14/14: generate inform6 -> auto.inf
|
||||
0.6% in inter step 10/14: make-identifiers-unique
|
||||
2.1% not specifically accounted for
|
||||
41.6% in running Inter pipeline
|
||||
10.5% in inter step 7/14: consolidate-text
|
||||
9.7% in step preparation
|
||||
9.1% in inter step 2/14: link
|
||||
6.9% in inter step 14/14: generate inform6 -> auto.inf
|
||||
0.7% in inter step 10/14: make-identifiers-unique
|
||||
0.3% in inter step 11/14: reconcile-verbs
|
||||
0.3% in inter step 13/14: eliminate-redundant-operations
|
||||
0.3% in inter step 6/14: assimilate
|
||||
|
@ -27,6 +28,6 @@
|
|||
0.1% in inter step 5/14: resolve-conditional-compilation
|
||||
0.1% in inter step 8/14: resolve-external-symbols
|
||||
0.1% in inter step 9/14: inspect-plugs
|
||||
1.7% not specifically accounted for
|
||||
2.7% not specifically accounted for
|
||||
1.8% in supervisor
|
||||
0.4% not specifically accounted for
|
||||
|
|
|
@ -20,7 +20,7 @@ void CoreModule::start(void) {
|
|||
core_plugin = PluginManager::new(NULL, I"core", NULL);
|
||||
PluginManager::make_permanently_active(core_plugin);
|
||||
naming_plugin = PluginManager::new(&Naming::start, I"naming", core_plugin);
|
||||
counting_plugin = PluginManager::new(&PL::Counting::start, I"instance counting", core_plugin);
|
||||
counting_plugin = PluginManager::new(&InstanceCounting::start, I"instance counting", core_plugin);
|
||||
|
||||
Log::declare_aspect(TASK_QUEUE_DA, L"task queue", FALSE, FALSE);
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ performance.
|
|||
int CompileLoops::schema(i6_schema *sch, kind *K) {
|
||||
if (K == NULL) return FALSE;
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
if (PL::Counting::optimise_loop(sch, K) == FALSE)
|
||||
if (InstanceCounting::optimise_loop(sch, K) == FALSE)
|
||||
Calculus::Schemas::modify(sch, "objectloop (*1 ofclass %n)",
|
||||
RTKindDeclarations::iname(K));
|
||||
return TRUE;
|
||||
|
|
|
@ -893,7 +893,7 @@ void PL::HTMLMap::plot_map_cell(OUTPUT_STREAM, int pass, vector P, int i1, int i
|
|||
WRITE_TO(tool_tip, "title=\"");
|
||||
instance *I;
|
||||
LOOP_OVER_INSTANCES(I, K_object)
|
||||
if (PL::Counting::instance_count(I, K_direction) == exit) {
|
||||
if (InstanceCounting::IK_count(I, K_direction) == exit) {
|
||||
WRITE_TO(tool_tip, "%+I", I);
|
||||
break;
|
||||
}
|
||||
|
|
335
inform7/runtime-module/Chapter 2/Instance Counting.w
Normal file
335
inform7/runtime-module/Chapter 2/Instance Counting.w
Normal file
|
@ -0,0 +1,335 @@
|
|||
[InstanceCounting::] Instance Counting.
|
||||
|
||||
Though a plugin, for convenience of implementation, this code is always active
|
||||
and provides for efficient loops through instances at runtime.
|
||||
|
||||
@h Plugin startup.
|
||||
Being a plugin, this needs a startup function, and here it is. It is in fact
|
||||
called on every run: see //core: Core Module//.
|
||||
|
||||
=
|
||||
void InstanceCounting::start(void) {
|
||||
PluginManager::plug(NEW_SUBJECT_NOTIFY_PLUG, InstanceCounting::counting_new_subject_notify);
|
||||
PluginManager::plug(COMPLETE_MODEL_PLUG, InstanceCounting::counting_complete_model);
|
||||
PluginManager::plug(PRODUCTION_LINE_PLUG, InstanceCounting::production_line);
|
||||
}
|
||||
|
||||
int InstanceCounting::production_line(int stage, int debugging, stopwatch_timer *sequence_timer) {
|
||||
if (stage == INTER1_CSEQ) {
|
||||
BENCH(InstanceCounting::define_IK_sequence_start_constants);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ Being a plugin, this code can provide extra data on inference subjects. It
|
||||
will in practice use that only for subjects representing kinds:
|
||||
|
||||
@d COUNTING_DATA(subj) PLUGIN_DATA_ON_SUBJECT(counting, subj)
|
||||
|
||||
=
|
||||
typedef struct counting_data {
|
||||
int has_instances; /* are there any instances of this kind? */
|
||||
struct property *IK_count_prop;
|
||||
struct property *next_in_IK_sequence_prop; /* the IK-Link property for this kind */
|
||||
CLASS_DEFINITION
|
||||
} counting_data;
|
||||
|
||||
@ =
|
||||
int InstanceCounting::counting_new_subject_notify(inference_subject *subj) {
|
||||
ATTACH_PLUGIN_DATA_TO_SUBJECT(counting, subj, InstanceCounting::new_data(subj));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
counting_data *InstanceCounting::new_data(inference_subject *subj) {
|
||||
counting_data *cd = CREATE(counting_data);
|
||||
cd->IK_count_prop = NULL;
|
||||
cd->next_in_IK_sequence_prop = NULL;
|
||||
cd->has_instances = FALSE;
|
||||
return cd;
|
||||
}
|
||||
|
||||
@ =
|
||||
inter_name *InstanceCounting::IK_count_property(kind *K) {
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
property *P = COUNTING_DATA(subj)->IK_count_prop;
|
||||
if (P) return RTProperties::iname(P);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@h The IK-count.
|
||||
The IK-count for an instance I of kind K is the result of numbering instances
|
||||
of that kind upwards from 0. This depends on both I and K, hence the name:
|
||||
for example, a red car might be thing number 17 but vehicle number 2. Within
|
||||
each kind, instances are numbered in creation order by the source text.
|
||||
|
||||
Before we can store this, we must calculate it, which we do with this less
|
||||
than elegant two-dimensional array:
|
||||
|
||||
@d INSTANCE_COUNT(I, K)
|
||||
kind_instance_counts[(I)->allocation_id*max_kind_instance_count +
|
||||
Kinds::Behaviour::get_range_number(K)]
|
||||
|
||||
=
|
||||
int *kind_instance_counts = NULL;
|
||||
int max_kind_instance_count = 0;
|
||||
|
||||
void InstanceCounting::calculate_IK_counts(void) {
|
||||
@<Allocate the instance count array in memory@>;
|
||||
@<Compute the instance count array@>;
|
||||
}
|
||||
|
||||
@<Allocate the instance count array in memory@> =
|
||||
max_kind_instance_count = NUMBER_CREATED(inference_subject);
|
||||
kind_instance_counts =
|
||||
Memory::calloc(max_kind_instance_count*max_kind_instance_count, sizeof(int),
|
||||
INSTANCE_COUNTING_MREASON);
|
||||
|
||||
@ The following is quadratic in the number of objects, but this has never been
|
||||
a problem in practice; the number seldom exceeds a few hundred.
|
||||
|
||||
@<Compute the instance count array@> =
|
||||
instance *I;
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K))
|
||||
LOOP_OVER_INSTANCES(I, K_object)
|
||||
INSTANCE_COUNT(I, K) = -1;
|
||||
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
int ix_count = 0;
|
||||
LOOP_OVER_INSTANCES(I, K)
|
||||
INSTANCE_COUNT(I, K) = ix_count++;
|
||||
}
|
||||
|
||||
@ Instance counts are actually useful to several other plugins, so we provide
|
||||
the following. Note that if I is not in fact an instance of K then its IK-count
|
||||
is by definition -1.
|
||||
|
||||
=
|
||||
int InstanceCounting::IK_count(instance *I, kind *K) {
|
||||
if (kind_instance_counts == NULL) internal_error("instance counts not available");
|
||||
if (K == NULL) internal_error("instance counts available only for objects");
|
||||
return INSTANCE_COUNT(I, K);
|
||||
}
|
||||
|
||||
@h The IK-sequence.
|
||||
Within each kind K, we form the instances in a linked list called the "IK-sequence".
|
||||
Again, the list position of I depends on K: the red car might be in one position
|
||||
in the list of things, and another in the list of vehicles.
|
||||
|
||||
This sequence will be in "declaration order", that is, it will match the order
|
||||
in which instances are declared in Inter. This is not the same as their creation
|
||||
order in Inform 7 source text, though it tends to be roughly similar.[1]
|
||||
|
||||
The following function abstracts the list, returning the first instance if |I|
|
||||
is |NULL|, and otherwise the next after |I|. Note that it excludes instances which
|
||||
have been "diverted".[2]
|
||||
|
||||
[1] Declaration order is more trouble to arrange, but we do it so that an optimised
|
||||
and an unoptimised loop to perform the same search will not only iterate through
|
||||
the same set of objects, but in the same order.
|
||||
|
||||
[2] This is used to get rid of the |selfobj| object in cases where the source text
|
||||
creates an explicit player.
|
||||
|
||||
=
|
||||
instance *InstanceCounting::next_in_IK_sequence(instance *I, kind *k) {
|
||||
if (k == NULL) return NULL;
|
||||
int resuming = TRUE;
|
||||
if (I == NULL) { I = FIRST_IN_INSTANCE_ORDERING; resuming = FALSE; }
|
||||
while (I) {
|
||||
if (resuming) I = NEXT_IN_INSTANCE_ORDERING(I);
|
||||
resuming = TRUE;
|
||||
if (I == NULL) break;
|
||||
if (InferenceSubjects::aliased_but_diverted(Instances::as_subject(I)))
|
||||
continue; /* |selfobj| may not count */
|
||||
if (Instances::of_kind(I, k)) return I;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ At runtime, we will store the IK sequences by defining their first entries
|
||||
as constants,[1] and their subsequent entries as property values of instances.
|
||||
The constants are declared here, and see //InstanceCounting::counting_complete_model//
|
||||
below for the properties.
|
||||
|
||||
[1] We don't need to store these list origins in some table in memory at
|
||||
runtime because Inform always compiles code which knows which kind it's looping
|
||||
over: so it never needs to look up an IK-sequence where K is not known at
|
||||
compile time.
|
||||
|
||||
=
|
||||
void InstanceCounting::define_IK_sequence_start_constants(void) {
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inter_name *iname = RTKindConstructors::first_instance_iname(K);
|
||||
instance *next = InstanceCounting::next_in_IK_sequence(NULL, K);
|
||||
if (next) {
|
||||
Emit::iname_constant(iname, K_object, RTInstances::value_iname(next));
|
||||
} else {
|
||||
Emit::iname_constant(iname, K_object, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@h The KD-count.
|
||||
This section is supposedly for instance-counting, but it also does a little
|
||||
kind-counting: specifically we number the subkinds of object. The KD-count of a
|
||||
kind is this number.[1]
|
||||
|
||||
[1] I have completely forgotten what the D stood for. KD-counts are in creation
|
||||
order, not declaration order, so it can't be D for declaration.
|
||||
|
||||
=
|
||||
int InstanceCounting::KD_count(kind *K) {
|
||||
int c = 0;
|
||||
if (K == NULL) return 0;
|
||||
kind *IK;
|
||||
LOOP_OVER_BASE_KINDS(IK)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(IK)) {
|
||||
c++;
|
||||
if (Kinds::eq(IK, K)) return c;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@h Properties of instances.
|
||||
At model completion time, then, we assign a set of low-level properties to
|
||||
all the object instances. These consume memory without even being visible in
|
||||
Inform 7 source text: they are all basically optimisations, and are a classic
|
||||
trade-off of memory for speed. For the most part we care more about memory in
|
||||
the Inform runtime (one of our target VMs has a very low memory ceiling), but
|
||||
search loops must run as fast as they possibly can.
|
||||
|
||||
=
|
||||
int InstanceCounting::counting_complete_model(int stage) {
|
||||
if (stage == WORLD_STAGE_I) {
|
||||
@<Create and assert zero values of the vector property@>;
|
||||
}
|
||||
if (stage == WORLD_STAGE_V) {
|
||||
property *P_KD_Count = ValueProperties::new_nameless(I"KD_Count", K_number);
|
||||
@<Create the two instance properties for each kind of object@>;
|
||||
InstanceCounting::calculate_IK_counts();
|
||||
instance *I;
|
||||
LOOP_OVER_INSTANCES(I, K_object) {
|
||||
@<Assert the KD count property for I@>;
|
||||
@<Assert values of the two instance properties for I@>;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ The |vector| property provides workspace for the relation-route-finding code
|
||||
at runtime: it doesn't actually have anything to do with instance counting as
|
||||
such, but then again it doesn't deserve its own section of code.
|
||||
|
||||
@<Create and assert zero values of the vector property@> =
|
||||
property *P_vector = ValueProperties::new_nameless(I"vector", K_number);
|
||||
parse_node *zero = Rvalues::from_int(0, EMPTY_WORDING);
|
||||
instance *I;
|
||||
LOOP_OVER_INSTANCES(I, K_object)
|
||||
ValueProperties::assert(P_vector,
|
||||
Instances::as_subject(I), zero, CERTAIN_CE);
|
||||
|
||||
@ For each subkind of object K to which an instance I belongs, we will store the
|
||||
IK-count in a numerical property. So the red car, for example, would be given two
|
||||
property values: one for (red car, thing), one for (red car, vehicle). The
|
||||
properties in question are the |IK_count_prop| for thing and vehicle.
|
||||
|
||||
Similarly for the next terms in the IK-sequences, where the properties are
|
||||
the |
|
||||
|
||||
@<Create the two instance properties for each kind of object@> =
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
inter_name *count_iname = RTKindConstructors::instance_count_iname(K);
|
||||
|
||||
COUNTING_DATA(subj)->IK_count_prop =
|
||||
ValueProperties::new_nameless_using(K_number,
|
||||
RTKindConstructors::kind_package(K), count_iname);
|
||||
|
||||
inter_name *next_iname = RTKindConstructors::next_instance_iname(K);
|
||||
COUNTING_DATA(subj)->next_in_IK_sequence_prop =
|
||||
ValueProperties::new_nameless_using(K_object,
|
||||
RTKindConstructors::kind_package(K), next_iname);
|
||||
}
|
||||
|
||||
@ For any object instance, the property |KD_Count| holds the KD-count for its
|
||||
immediate kind. For a red car which was both vehicle and thing, therefore, this
|
||||
would be the number for "vehicle", not for "thing".
|
||||
|
||||
@<Assert the KD count property for I@> =
|
||||
int ic = InstanceCounting::KD_count(Instances::to_kind(I));
|
||||
parse_node *the_count = Rvalues::from_int(ic, EMPTY_WORDING);
|
||||
ValueProperties::assert(
|
||||
P_KD_Count, Instances::as_subject(I), the_count, CERTAIN_CE);
|
||||
|
||||
@<Assert values of the two instance properties for I@> =
|
||||
inference_subject *infs;
|
||||
for (infs = KindSubjects::from_kind(Instances::to_kind(I));
|
||||
infs; infs = InferenceSubjects::narrowest_broader_subject(infs)) {
|
||||
kind *K = KindSubjects::to_kind(infs);
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
COUNTING_DATA(subj)->has_instances = TRUE;
|
||||
@<Fill in this IK-count property@>;
|
||||
@<Fill in this IK-sequence property@>;
|
||||
}
|
||||
}
|
||||
|
||||
@ And otherwise, for every kind that the instance belongs to (directly or
|
||||
indirectly) it gets the relevant instance count as a property value. For
|
||||
example, the red door might have |IK4_Count| set to 3 -- it's door number 3,
|
||||
let's suppose -- and |IK2_Count| set to 19 -- it's thing number 19. It doesn't
|
||||
have an |IK7_Count| property at all, since it isn't a backdrop (kind number 7),
|
||||
and so on for all other kinds.
|
||||
|
||||
@<Fill in this IK-count property@> =
|
||||
int ic = INSTANCE_COUNT(I, K);
|
||||
parse_node *the_count = Rvalues::from_int(ic, EMPTY_WORDING);
|
||||
ValueProperties::assert(
|
||||
COUNTING_DATA(subj)->IK_count_prop,
|
||||
Instances::as_subject(I), the_count, CERTAIN_CE);
|
||||
|
||||
@ The IK-Link property is never set for kind 0, so there's no special case. It
|
||||
records the next instance in compilation order:
|
||||
|
||||
@<Fill in this IK-sequence property@> =
|
||||
instance *next = InstanceCounting::next_in_IK_sequence(I, K);
|
||||
parse_node *val = (next)?
|
||||
Rvalues::from_instance(next):
|
||||
Rvalues::new_nothing_object_constant();
|
||||
ValueProperties::assert(
|
||||
COUNTING_DATA(subj)->next_in_IK_sequence_prop,
|
||||
Instances::as_subject(I), val, CERTAIN_CE);
|
||||
|
||||
@h Loop optimisation.
|
||||
Lastly, then, the coup de grace: here's where we define loop schemas to
|
||||
perform loops through kinds quickly at run-time. We start from the First
|
||||
constants, and use the Next constants to progress; and we stop at |nothing|.
|
||||
|
||||
There is no actual need to compile the schema differently in the case of
|
||||
an empty loop, where there are no instances of the kind |K| to loop over:
|
||||
the regular schema would work fine. But it would make the code somehow
|
||||
misleading to a human reader.
|
||||
|
||||
=
|
||||
int InstanceCounting::optimise_loop(i6_schema *sch, kind *K) {
|
||||
if (PluginManager::active(counting_plugin) == FALSE) return FALSE;
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
if (COUNTING_DATA(subj)->has_instances == FALSE) {
|
||||
Calculus::Schemas::modify(sch,
|
||||
"for (*1=nothing: false: )");
|
||||
} else {
|
||||
inter_name *first_iname = RTKindConstructors::first_instance_iname(K);
|
||||
inter_name *next_iname = RTKindConstructors::next_instance_iname(K);
|
||||
Calculus::Schemas::modify(sch, "for (*1=%n: *1: *1=*1.%n)", first_iname, next_iname);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
|
@ -186,8 +186,8 @@ one copy of this than to have to construct it frequently at runtime.
|
|||
not in creation order, as a simple |LOOP_OVER_INSTANCES| would have done.
|
||||
|
||||
@<Compile entries for a kind of object@> =
|
||||
instance *I = PL::Counting::next_instance_of(NULL, K);
|
||||
instance *I = InstanceCounting::next_in_IK_sequence(NULL, K);
|
||||
while (I) {
|
||||
EmitArrays::iname_entry(RTInstances::value_iname(I));
|
||||
I = PL::Counting::next_instance_of(I, K);
|
||||
I = InstanceCounting::next_in_IK_sequence(I, K);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ typedef struct kind_constructor_compilation_data {
|
|||
struct inter_name *instance_GPR_iname;
|
||||
struct inter_name *first_instance_iname;
|
||||
struct inter_name *next_instance_iname;
|
||||
struct inter_name *instance_count_iname;
|
||||
struct inter_name *pr_iname;
|
||||
struct inter_name *inc_iname;
|
||||
struct inter_name *dec_iname;
|
||||
|
@ -33,6 +34,7 @@ kind_constructor_compilation_data RTKindConstructors::new_compilation_data(kind_
|
|||
kccd.instance_GPR_iname = NULL;
|
||||
kccd.first_instance_iname = NULL;
|
||||
kccd.next_instance_iname = NULL;
|
||||
kccd.instance_count_iname = NULL;
|
||||
kccd.pr_iname = NULL;
|
||||
kccd.inc_iname = NULL;
|
||||
kccd.dec_iname = NULL;
|
||||
|
@ -99,17 +101,50 @@ inter_name *RTKindConstructors::list_iname(kind_constructor *kc) {
|
|||
void RTKindConstructors::set_list_iname(kind_constructor *kc, inter_name *iname) {
|
||||
kc->compilation_data.list_iname = iname;
|
||||
}
|
||||
inter_name *RTKindConstructors::first_instance_iname(kind_constructor *kc) {
|
||||
|
||||
inter_name *RTKindConstructors::first_instance_iname(kind *K) {
|
||||
kind_constructor *kc = Kinds::get_construct(K);
|
||||
if (kc->compilation_data.first_instance_iname == NULL)
|
||||
kc->compilation_data.first_instance_iname =
|
||||
Hierarchy::derive_iname_in(FIRST_INSTANCE_HL,
|
||||
RTKindDeclarations::iname(K), RTKindConstructors::package(kc));
|
||||
return kc->compilation_data.first_instance_iname;
|
||||
}
|
||||
void RTKindConstructors::set_first_instance_iname(kind_constructor *kc, inter_name *iname) {
|
||||
kc->compilation_data.first_instance_iname = iname;
|
||||
}
|
||||
inter_name *RTKindConstructors::next_instance_iname(kind_constructor *kc) {
|
||||
|
||||
inter_name *RTKindConstructors::next_instance_iname(kind *K) {
|
||||
kind_constructor *kc = Kinds::get_construct(K);
|
||||
if (kc->compilation_data.next_instance_iname == NULL)
|
||||
kc->compilation_data.next_instance_iname =
|
||||
Hierarchy::derive_iname_in(NEXT_INSTANCE_HL,
|
||||
RTKindDeclarations::iname(K), RTKindConstructors::package(kc));
|
||||
return kc->compilation_data.next_instance_iname;
|
||||
}
|
||||
void RTKindConstructors::set_next_instance_iname(kind_constructor *kc, inter_name *iname) {
|
||||
kc->compilation_data.next_instance_iname = iname;
|
||||
|
||||
inter_name *RTKindConstructors::instance_count_iname(kind *K) {
|
||||
kind_constructor *kc = Kinds::get_construct(K);
|
||||
if (kc->compilation_data.instance_count_iname == NULL) {
|
||||
int N = Kinds::Behaviour::get_range_number(K), hl = -1;
|
||||
switch (N) {
|
||||
case 1: hl = COUNT_INSTANCE_1_HL; break;
|
||||
case 2: hl = COUNT_INSTANCE_2_HL; break;
|
||||
case 3: hl = COUNT_INSTANCE_3_HL; break;
|
||||
case 4: hl = COUNT_INSTANCE_4_HL; break;
|
||||
case 5: hl = COUNT_INSTANCE_5_HL; break;
|
||||
case 6: hl = COUNT_INSTANCE_6_HL; break;
|
||||
case 7: hl = COUNT_INSTANCE_7_HL; break;
|
||||
case 8: hl = COUNT_INSTANCE_8_HL; break;
|
||||
case 9: hl = COUNT_INSTANCE_9_HL; break;
|
||||
case 10: hl = COUNT_INSTANCE_10_HL; break;
|
||||
}
|
||||
if (hl == -1)
|
||||
kc->compilation_data.instance_count_iname =
|
||||
Hierarchy::derive_iname_in(COUNT_INSTANCE_HL, RTKindDeclarations::iname(K),
|
||||
RTKindConstructors::kind_package(K));
|
||||
else
|
||||
kc->compilation_data.instance_count_iname =
|
||||
Hierarchy::make_iname_in(hl, RTKindConstructors::kind_package(K));
|
||||
}
|
||||
return kc->compilation_data.instance_count_iname;
|
||||
}
|
||||
|
||||
@ Convenient storage for some names.
|
||||
|
|
|
@ -1160,10 +1160,10 @@ this is done by the function |RTRelations::relation_range| (below).
|
|||
kind *right_kind = BinaryPredicates::term_kind(bp, 1);
|
||||
|
||||
if ((Kinds::Behaviour::is_subkind_of_object(left_kind)) && (left_count > 0)) {
|
||||
EmitArrays::iname_entry(PL::Counting::instance_count_property_symbol(left_kind));
|
||||
EmitArrays::iname_entry(InstanceCounting::IK_count_property(left_kind));
|
||||
} else EmitArrays::numeric_entry(0);
|
||||
if ((Kinds::Behaviour::is_subkind_of_object(right_kind)) && (right_count > 0)) {
|
||||
EmitArrays::iname_entry(PL::Counting::instance_count_property_symbol(right_kind));
|
||||
EmitArrays::iname_entry(InstanceCounting::IK_count_property(right_kind));
|
||||
} else EmitArrays::numeric_entry(0);
|
||||
|
||||
EmitArrays::numeric_entry((inter_ti) left_count);
|
||||
|
|
|
@ -1,368 +0,0 @@
|
|||
[PL::Counting::] Instance Counting.
|
||||
|
||||
A plugin which maintains run-time-accessible linked lists of instances
|
||||
of kinds, in order to speed up loops; and instance counts within kinds, in order
|
||||
to speed up relation storage; and the object-kind hierarchy, in order to speed
|
||||
up run-time checking of the type safety of property usage.
|
||||
|
||||
@ Every subject contains a pointer to its own unique copy of the following
|
||||
structure, but it only has relevance if the subject represents an object:
|
||||
|
||||
@d COUNTING_DATA(subj) PLUGIN_DATA_ON_SUBJECT(counting, subj)
|
||||
|
||||
=
|
||||
typedef struct counting_data {
|
||||
struct property *instance_count_prop; /* the (|I6| only) IK-Count property for this kind */
|
||||
struct property *instance_link_prop; /* the (|I6| only) IK-Link property for this kind */
|
||||
int has_instances; /* are there any instances of this kind? */
|
||||
CLASS_DEFINITION
|
||||
} counting_data;
|
||||
|
||||
@ In addition to these I6 properties, two for each kind, there's a single
|
||||
additional property called |vector| which is needed as run-time storage for
|
||||
route-finding through relations on objects.
|
||||
|
||||
=
|
||||
property *P_vector = NULL;
|
||||
property *P_KD_Count = NULL; /* see below */
|
||||
|
||||
@h Plugin startup.
|
||||
|
||||
=
|
||||
void PL::Counting::start(void) {
|
||||
PluginManager::plug(NEW_SUBJECT_NOTIFY_PLUG, PL::Counting::counting_new_subject_notify);
|
||||
PluginManager::plug(COMPLETE_MODEL_PLUG, PL::Counting::counting_complete_model);
|
||||
PluginManager::plug(PRODUCTION_LINE_PLUG, PL::Counting::production_line);
|
||||
}
|
||||
|
||||
int PL::Counting::production_line(int stage, int debugging, stopwatch_timer *sequence_timer) {
|
||||
if (stage == INTER1_CSEQ) {
|
||||
BENCH(PL::Counting::counting_compile_model_tables);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@h Initialising.
|
||||
Counting data is actually relevant only for kinds, and remains blank for instances.
|
||||
|
||||
=
|
||||
int PL::Counting::counting_new_subject_notify(inference_subject *subj) {
|
||||
ATTACH_PLUGIN_DATA_TO_SUBJECT(counting, subj, PL::Counting::new_data(subj));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
counting_data *PL::Counting::new_data(inference_subject *subj) {
|
||||
counting_data *cd = CREATE(counting_data);
|
||||
cd->instance_count_prop = NULL;
|
||||
cd->instance_link_prop = NULL;
|
||||
cd->has_instances = FALSE;
|
||||
return cd;
|
||||
}
|
||||
|
||||
@h Computing instance counts.
|
||||
We're going to store these temporarily in an array which must be allocated
|
||||
dynamically in memory, and this will make lookups quite fiddly, so we
|
||||
use the following macro to specify the integer lvalue for the instance
|
||||
count of instance |I| within kind |k|. This depends on both: for example,
|
||||
the red car might be thing number 17 but vehicle number 2, and will be
|
||||
door number $-1$, since it isn't a door. The first instance in a kind is
|
||||
numbered 0.
|
||||
|
||||
@d INSTANCE_COUNT(I, K)
|
||||
kind_instance_counts[(I)->allocation_id*max_kind_instance_count +
|
||||
Kinds::Behaviour::get_range_number(K)]
|
||||
|
||||
=
|
||||
int *kind_instance_counts = NULL;
|
||||
int max_kind_instance_count = 0;
|
||||
|
||||
void PL::Counting::make_instance_counts(void) {
|
||||
@<Allocate the instance count array in memory@>;
|
||||
@<Compute the instance count array@>;
|
||||
}
|
||||
|
||||
@<Allocate the instance count array in memory@> =
|
||||
max_kind_instance_count = NUMBER_CREATED(inference_subject);
|
||||
kind_instance_counts =
|
||||
Memory::calloc(max_kind_instance_count*max_kind_instance_count, sizeof(int),
|
||||
INSTANCE_COUNTING_MREASON);
|
||||
|
||||
@ The following is quadratic in the number of objects, but this has never been
|
||||
a problem in practice; the number seldom exceeds a few hundred.
|
||||
|
||||
@<Compute the instance count array@> =
|
||||
instance *I;
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K))
|
||||
LOOP_OVER_INSTANCES(I, K_object)
|
||||
INSTANCE_COUNT(I, K) = -1;
|
||||
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
int ix_count = 0;
|
||||
LOOP_OVER_INSTANCES(I, K)
|
||||
INSTANCE_COUNT(I, K) = ix_count++;
|
||||
}
|
||||
|
||||
@ Instance counts are actually useful to several other plugins, so we provide:
|
||||
|
||||
=
|
||||
int PL::Counting::instance_count(instance *I, kind *K) {
|
||||
if (kind_instance_counts == NULL) internal_error("instance counts not available");
|
||||
if (K == NULL) internal_error("instance counts available only for objects");
|
||||
return INSTANCE_COUNT(I, K);
|
||||
}
|
||||
|
||||
@h Instance sequences.
|
||||
At run-time we're going to want to loop through objects in order of their
|
||||
definition in the I6 code, which is not the same as their creation order in I7.
|
||||
(This is so that an optimised and an unoptimised loop to perform the same
|
||||
search will not only iterate through the same set of objects, but in the
|
||||
same order.)
|
||||
|
||||
The following abstracts the linked list in compilation sequence. Note that
|
||||
it excludes instances which have been "diverted", which is mainly used
|
||||
to get rid of the |selfobj| object in cases where the source text creates
|
||||
an explicit player.
|
||||
|
||||
=
|
||||
instance *PL::Counting::next_instance_of(instance *I, kind *k) {
|
||||
if (k == NULL) return NULL;
|
||||
int resuming = TRUE;
|
||||
if (I == NULL) { I = FIRST_IN_INSTANCE_ORDERING; resuming = FALSE; }
|
||||
while (I) {
|
||||
if (resuming) I = NEXT_IN_INSTANCE_ORDERING(I);
|
||||
resuming = TRUE;
|
||||
if (I == NULL) break;
|
||||
if (InferenceSubjects::aliased_but_diverted(Instances::as_subject(I)))
|
||||
continue; /* |selfobj| may not count */
|
||||
if (Instances::of_kind(I, k)) return I;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ For compilation purposes, it's useful to express this as a specification:
|
||||
|
||||
=
|
||||
parse_node *PL::Counting::next_instance_of_as_value(instance *I, kind *k) {
|
||||
instance *next = PL::Counting::next_instance_of(I, k);
|
||||
if (next) return Rvalues::from_instance(next);
|
||||
return Rvalues::new_nothing_object_constant();
|
||||
}
|
||||
|
||||
@h Inform 6 representation.
|
||||
The main purpose of this plugin is to trade memory for speed at run-time.
|
||||
Inform source text is rich in implied searches through kinds ("if a red
|
||||
door is open, ...") and we need these to be as fast as possible; iterating
|
||||
through all objects would be dangerously slow, so we need a way at run-time
|
||||
to iterate through the instances of a single kind (in this example, doors).
|
||||
|
||||
For each kind we will store a linked list of instances. The first instance
|
||||
need only be defined as a constant, and need not be stored in a memory word,
|
||||
since Inform always compiles code which knows which kind it's looping over.
|
||||
|
||||
=
|
||||
inter_name *PL::Counting::first_instance(kind *K) {
|
||||
kind_constructor *con = Kinds::get_construct(K);
|
||||
inter_name *iname = RTKindConstructors::first_instance_iname(con);
|
||||
if (iname == NULL) {
|
||||
iname = Hierarchy::derive_iname_in(FIRST_INSTANCE_HL, RTKindDeclarations::iname(K), RTKindConstructors::kind_package(K));
|
||||
RTKindConstructors::set_first_instance_iname(con, iname);
|
||||
}
|
||||
return iname;
|
||||
}
|
||||
|
||||
inter_name *PL::Counting::next_instance(kind *K) {
|
||||
kind_constructor *con = Kinds::get_construct(K);
|
||||
inter_name *iname = RTKindConstructors::next_instance_iname(con);
|
||||
if (iname == NULL) {
|
||||
iname = Hierarchy::derive_iname_in(NEXT_INSTANCE_HL, RTKindDeclarations::iname(K), RTKindConstructors::kind_package(K));
|
||||
RTKindConstructors::set_next_instance_iname(con, iname);
|
||||
}
|
||||
return iname;
|
||||
}
|
||||
|
||||
inter_name *PL::Counting::instance_count_iname(kind *K) {
|
||||
int N = Kinds::Behaviour::get_range_number(K);
|
||||
if (N == 1) return Hierarchy::make_iname_in(COUNT_INSTANCE_1_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 2) return Hierarchy::make_iname_in(COUNT_INSTANCE_2_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 3) return Hierarchy::make_iname_in(COUNT_INSTANCE_3_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 4) return Hierarchy::make_iname_in(COUNT_INSTANCE_4_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 5) return Hierarchy::make_iname_in(COUNT_INSTANCE_5_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 6) return Hierarchy::make_iname_in(COUNT_INSTANCE_6_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 7) return Hierarchy::make_iname_in(COUNT_INSTANCE_7_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 8) return Hierarchy::make_iname_in(COUNT_INSTANCE_8_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 9) return Hierarchy::make_iname_in(COUNT_INSTANCE_9_HL, RTKindConstructors::kind_package(K));
|
||||
if (N == 10) return Hierarchy::make_iname_in(COUNT_INSTANCE_10_HL, RTKindConstructors::kind_package(K));
|
||||
return Hierarchy::derive_iname_in(COUNT_INSTANCE_HL, RTKindDeclarations::iname(K), RTKindConstructors::kind_package(K));
|
||||
}
|
||||
|
||||
void PL::Counting::counting_compile_model_tables(void) {
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inter_name *iname = PL::Counting::first_instance(K);
|
||||
instance *next = PL::Counting::next_instance_of(NULL, K);
|
||||
if (next) {
|
||||
Emit::iname_constant(iname, K_object, RTInstances::value_iname(next));
|
||||
} else {
|
||||
Emit::iname_constant(iname, K_object, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ Counting kinds of object, not very quickly:
|
||||
|
||||
=
|
||||
int PL::Counting::kind_of_object_count(kind *K) {
|
||||
int c = 0;
|
||||
if (K == NULL) return 0;
|
||||
kind *IK;
|
||||
LOOP_OVER_BASE_KINDS(IK)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(IK)) {
|
||||
c++;
|
||||
if (Kinds::eq(IK, K)) return c;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ So now the compiler can define the start of a linked list of instances
|
||||
for a given kind, but how can it define the inductive step? The answer is
|
||||
that every instance of kind number 4 (say) provides an I6 property |IK4_Link|
|
||||
whose value is the next instance, or else |nothing| if it's the last.
|
||||
|
||||
A further property, |IK4_Count|, holds the instance count; this is used for
|
||||
efficient access to various-to-various relation storage at run-time. If we
|
||||
have a relation of various doors to various rooms, say, we want to store a
|
||||
bitmap only $D\times R$ in size, but then to access this quickly given a
|
||||
specific door and room, we need to convert these quickly to their indices;
|
||||
this is what |IK4_Count| does.
|
||||
|
||||
We create these properties, and assert these property values, during stage IV
|
||||
of model completion:
|
||||
|
||||
=
|
||||
int PL::Counting::counting_complete_model(int stage) {
|
||||
if (stage == WORLD_STAGE_I) {
|
||||
@<Create and assert zero values of the vector property@>;
|
||||
}
|
||||
if (stage == WORLD_STAGE_V) {
|
||||
@<Create the two instance properties for each kind of object@>;
|
||||
PL::Counting::make_instance_counts();
|
||||
@<Assert values of the two instance properties for each instance@>;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ The |vector| property exists only at the I6 level, and provides workspace
|
||||
for the relation-route-finding code at run time.
|
||||
|
||||
@<Create and assert zero values of the vector property@> =
|
||||
P_vector = ValueProperties::new_nameless(I"vector", K_number);
|
||||
parse_node *zero = Rvalues::from_int(0, EMPTY_WORDING);
|
||||
instance *I;
|
||||
LOOP_OVER_INSTANCES(I, K_object)
|
||||
ValueProperties::assert(P_vector,
|
||||
Instances::as_subject(I), zero, CERTAIN_CE);
|
||||
|
||||
@<Create the two instance properties for each kind of object@> =
|
||||
kind *K;
|
||||
LOOP_OVER_BASE_KINDS(K)
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
inter_name *count_iname = PL::Counting::instance_count_iname(K);
|
||||
|
||||
COUNTING_DATA(subj)->instance_count_prop =
|
||||
ValueProperties::new_nameless_using(K_number, RTKindConstructors::kind_package(K), count_iname);
|
||||
|
||||
inter_name *next_iname = PL::Counting::next_instance(K);
|
||||
COUNTING_DATA(subj)->instance_link_prop =
|
||||
ValueProperties::new_nameless_using(K_object, RTKindConstructors::kind_package(K), next_iname);
|
||||
}
|
||||
P_KD_Count = ValueProperties::new_nameless(I"KD_Count", K_number);
|
||||
|
||||
@<Assert values of the two instance properties for each instance@> =
|
||||
instance *I;
|
||||
LOOP_OVER_INSTANCES(I, K_object) {
|
||||
@<Fill in the special IK0-Count property@>;
|
||||
inference_subject *infs;
|
||||
for (infs = KindSubjects::from_kind(Instances::to_kind(I));
|
||||
infs; infs = InferenceSubjects::narrowest_broader_subject(infs)) {
|
||||
kind *K = KindSubjects::to_kind(infs);
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
COUNTING_DATA(subj)->has_instances = TRUE;
|
||||
@<Fill in this IK-Count property@>;
|
||||
@<Fill in this IK-Link property@>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ As noted above, |KD_Count| is a special case. This looks as if it should be
|
||||
the instance count of "kind" itself, but that would be useless, since no
|
||||
instance object can ever have kind "kind" -- instances aren't kinds.
|
||||
|
||||
Instead it holds the kind number of its own (direct) kind. For example, if the
|
||||
instance object is the red door, its |KD_Count| value will be 4, meaning that
|
||||
its kind is kind number 4, which according to the |KindHierarchy| array is
|
||||
|K4_door|. Again, this is needed for rapid checking at run-time that property
|
||||
usage is legal.
|
||||
|
||||
@<Fill in the special IK0-Count property@> =
|
||||
int ic = PL::Counting::kind_of_object_count(Instances::to_kind(I));
|
||||
parse_node *the_count = Rvalues::from_int(ic, EMPTY_WORDING);
|
||||
ValueProperties::assert(
|
||||
P_KD_Count, Instances::as_subject(I), the_count, CERTAIN_CE);
|
||||
|
||||
@ And otherwise, for every kind that the instance belongs to (directly or
|
||||
indirectly) it gets the relevant instance count as a property value. For
|
||||
example, the red door might have |IK4_Count| set to 3 -- it's door number 3,
|
||||
let's suppose -- and |IK2_Count| set to 19 -- it's thing number 19. It doesn't
|
||||
have an |IK7_Count| property at all, since it isn't a backdrop (kind number 7),
|
||||
and so on for all other kinds.
|
||||
|
||||
@<Fill in this IK-Count property@> =
|
||||
int ic = INSTANCE_COUNT(I, K);
|
||||
parse_node *the_count = Rvalues::from_int(ic, EMPTY_WORDING);
|
||||
ValueProperties::assert(
|
||||
COUNTING_DATA(subj)->instance_count_prop,
|
||||
Instances::as_subject(I), the_count, CERTAIN_CE);
|
||||
|
||||
@ The IK-Link property is never set for kind 0, so there's no special case. It
|
||||
records the next instance in compilation order:
|
||||
|
||||
@<Fill in this IK-Link property@> =
|
||||
ValueProperties::assert(
|
||||
COUNTING_DATA(subj)->instance_link_prop,
|
||||
Instances::as_subject(I), PL::Counting::next_instance_of_as_value(I, K), CERTAIN_CE);
|
||||
|
||||
@ =
|
||||
inter_name *PL::Counting::instance_count_property_symbol(kind *K) {
|
||||
if (Kinds::Behaviour::is_subkind_of_object(K)) {
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
property *P = COUNTING_DATA(subj)->instance_count_prop;
|
||||
if (P) return RTProperties::iname(P);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@h Loop optimisation.
|
||||
Lastly, then, the coup de grace: here's where we define loop schemas to
|
||||
perform loops through kinds quickly at run-time. We start from the First
|
||||
constants, and use the Link constants to progress; we stop at |nothing|.
|
||||
|
||||
=
|
||||
int PL::Counting::optimise_loop(i6_schema *sch, kind *K) {
|
||||
if (PluginManager::active(counting_plugin) == FALSE) return FALSE;
|
||||
inference_subject *subj = KindSubjects::from_kind(K);
|
||||
if (COUNTING_DATA(subj)->has_instances == FALSE) /* (to avoid writing misleading code) */
|
||||
Calculus::Schemas::modify(sch,
|
||||
"for (*1=nothing: false: )");
|
||||
else {
|
||||
inter_name *first_iname = PL::Counting::first_instance(K);
|
||||
inter_name *next_iname = PL::Counting::next_instance(K);
|
||||
Calculus::Schemas::modify(sch, "for (*1=%n: *1: *1=*1.%n)", first_iname, next_iname);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
|
@ -22,6 +22,7 @@ Chapter 2: Emission
|
|||
The Heap
|
||||
Default Values
|
||||
Equality Schemas
|
||||
Instance Counting
|
||||
Kind Declarations
|
||||
Showme Command
|
||||
Here, Nowhere and Everywhere
|
||||
|
@ -80,7 +81,6 @@ Chapter 6: Completion Resources
|
|||
|
||||
Chapter 7: Still Unsorted
|
||||
Emit Property Values
|
||||
Instance Counting
|
||||
Action Patterns
|
||||
Going
|
||||
Command Grammars
|
||||
|
|
Loading…
Reference in a new issue