1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/kinds-module/2-uk.html

914 lines
143 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Using Kinds</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="index.html"><span class="selectedlink">kinds</span></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Using Kinds' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#2">Chapter 2: Kinds</a></li><li><b>Using Kinds</b></li></ul><p class="purpose">To determine the characteristics of different kinds, enabling them to be used in practice.</p>
2019-03-17 14:40:57 +02:00
<ul class="toc"><li><a href="2-uk.html#SP1">&#167;1. Names of kinds</a></li><li><a href="2-uk.html#SP2">&#167;2. Definiteness</a></li><li><a href="2-uk.html#SP4">&#167;4. (A) How this came into being</a></li><li><a href="2-uk.html#SP12">&#167;12. (B) Constructing kinds</a></li><li><a href="2-uk.html#SP13">&#167;13. (C) Compatibility with other kinds</a></li><li><a href="2-uk.html#SP14">&#167;14. (D) How constant values of this kind are expressed</a></li><li><a href="2-uk.html#SP17">&#167;17. (E) Knowledge about values of this kind</a></li><li><a href="2-uk.html#SP18">&#167;18. (G) Performing arithmetic</a></li><li><a href="2-uk.html#SP21">&#167;21. (H) Representing this kind at run-time</a></li><li><a href="2-uk.html#SP23">&#167;23. (I) Storing values at run-time</a></li><li><a href="2-uk.html#SP32">&#167;32. (J) Printing and parsing values at run-time</a></li><li><a href="2-uk.html#SP38">&#167;38. (K) Indexing and documentation</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Names of kinds. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_name<button class="popup" onclick="togglePopup('usagePopup103')">...<span class="popuptext" id="usagePopup103">Usage of <b>Kinds::Behaviour::get_name</b>:<br>Describing Kinds - <a href="2-dk.html#SP24_2">&#167;24.2</a>, <a href="2-dk.html#SP24_3">&#167;24.3</a><br>Dimensions - <a href="2-dmn.html#SP28">&#167;28</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">plural_form</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP8">Kinds::Constructors::get_name</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">, </span><span class="identifier">plural_form</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_name_in_play<button class="popup" onclick="togglePopup('usagePopup104')">...<span class="popuptext" id="usagePopup104">Usage of <b>Kinds::Behaviour::get_name_in_play</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">plural_form</span><span class="plain">, </span><span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP8">Kinds::Constructors::get_name_in_play</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">, </span><span class="identifier">plural_form</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">noun</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_noun<button class="popup" onclick="togglePopup('usagePopup105')">...<span class="popuptext" id="usagePopup105">Usage of <b>Kinds::Behaviour::get_noun</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">dt_tag</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Definiteness. </b>A kind like "number" is definite. One way to be indefinite is to be a
kind of kind, like "arithmetic value":
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::is_kind_of_kind<button class="popup" onclick="togglePopup('usagePopup106')">...<span class="popuptext" id="usagePopup106">Usage of <b>Kinds::Behaviour::is_kind_of_kind</b>:<br>Describing Kinds - <a href="2-dk.html#SP15">&#167;15</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">group</span><span class="plain"> == </span><span class="constant">KIND_OF_KIND_GRP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Another way is to be a kind variable, like "Q", or to be a construction
made from something indefinite, like "list of values". So the following
checks that we aren't doing that:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::definite<button class="popup" onclick="togglePopup('usagePopup107')">...<span class="popuptext" id="usagePopup107">Usage of <b>Kinds::Behaviour::definite</b>:<br><a href="2-uk.html#SP26">&#167;26</a>, Kind Checking - <a href="2-kc.html#SP13">&#167;13</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc2.html#SP15">Kinds::Constructors::is_definite</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">arity</span><span class="plain"> = </span><span class="functiontext"><a href="2-kc2.html#SP14">Kinds::Constructors::arity</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">arity</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP3">Kinds::Behaviour::definite</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">kc_args</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::semidefinite<button class="popup" onclick="togglePopup('usagePopup108')">...<span class="popuptext" id="usagePopup108">Usage of <b>Kinds::Behaviour::semidefinite</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain"> == </span><span class="identifier">CON_KIND_VARIABLE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc2.html#SP15">Kinds::Constructors::is_definite</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">arity</span><span class="plain"> = </span><span class="functiontext"><a href="2-kc2.html#SP14">Kinds::Constructors::arity</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">arity</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP3">Kinds::Behaviour::semidefinite</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">kc_args</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::involves_var<button class="popup" onclick="togglePopup('usagePopup109')">...<span class="popuptext" id="usagePopup109">Usage of <b>Kinds::Behaviour::involves_var</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain"> == </span><span class="identifier">CON_KIND_VARIABLE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">v</span><span class="plain"> == </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">kind_variable_number</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">arity</span><span class="plain"> = </span><span class="functiontext"><a href="2-kc2.html#SP14">Kinds::Constructors::arity</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">arity</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP3">Kinds::Behaviour::involves_var</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">kc_args</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">v</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. (A) How this came into being. </b>Some kinds are built in (in that the I6 template files create them, using
the kind interpreter), while others arise from "X is a kind of value"
sentences in the source text.
</p>
<p class="inwebparagraph">Note that a kind of object counts as built-in by this test, even though it
might be a kind of object created in the source text, because at the end of
the day "object" is built in.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::is_built_in<button class="popup" onclick="togglePopup('usagePopup110')">...<span class="popuptext" id="usagePopup110">Usage of <b>Kinds::Behaviour::is_built_in</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">defined_in_source_text</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_creating_sentence<button class="popup" onclick="togglePopup('usagePopup111')">...<span class="popuptext" id="usagePopup111">Usage of <b>Kinds::Behaviour::get_creating_sentence</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">where_defined_in_source_text</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>When we read "Colour is a kind of value.", "colour" is uncertainly
defined at first. Later we read either "The colours are blue and pink.",
say, and then "colour" becomes an enumeration; or "450 nanometers
specifies a colour.", say, and then it becomes a unit. Initially, then,
it has an incompletely defined flag set: once one of the conversion routines
has been used, the matter is settled and there is no going back.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::is_uncertainly_defined<button class="popup" onclick="togglePopup('usagePopup112')">...<span class="popuptext" id="usagePopup112">Usage of <b>Kinds::Behaviour::is_uncertainly_defined</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">is_incompletely_defined</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Here we test for being an enumeration:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::is_an_enumeration<button class="popup" onclick="togglePopup('usagePopup113')">...<span class="popuptext" id="usagePopup113">Usage of <b>Kinds::Behaviour::is_an_enumeration</b>:<br><a href="2-uk.html#SP17">&#167;17</a>, <a href="2-uk.html#SP29">&#167;29</a>, <a href="2-uk.html#SP30">&#167;30</a>, <a href="2-uk.html#SP32">&#167;32</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP15">Kinds::Constructors::is_enumeration</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>And here we perform the conversion to a unit. The return value is <code class="display"><span class="extract">TRUE</span></code>
if the kind was already a unit or was successfully converted into one,
<code class="display"><span class="extract">FALSE</span></code> if it's now too late.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::convert_to_unit<button class="popup" onclick="togglePopup('usagePopup114')">...<span class="popuptext" id="usagePopup114">Usage of <b>Kinds::Behaviour::convert_to_unit</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP11">Kinds::Constructors::convert_to_unit</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And similarly:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::convert_to_enumeration<button class="popup" onclick="togglePopup('usagePopup115')">...<span class="popuptext" id="usagePopup115">Usage of <b>Kinds::Behaviour::convert_to_enumeration</b>:<br><a href="2-uk.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) </span><span class="functiontext"><a href="2-kc2.html#SP11">Kinds::Constructors::convert_to_enumeration</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>And similarly to switch from integer to real arithmetic.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::convert_to_real<button class="popup" onclick="togglePopup('usagePopup116')">...<span class="popuptext" id="usagePopup116">Usage of <b>Kinds::Behaviour::convert_to_real</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) </span><span class="functiontext"><a href="2-kc2.html#SP12">Kinds::Constructors::convert_to_real</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-14 19:56:54 +03:00
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The instances of an enumeration have the values \(1, 2, 3, ..., N\) at
run-time; the following returns \(N+1\), that is, a value which can be held
2019-03-17 14:40:57 +02:00
by the next instance to be created.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::new_enumerated_value<button class="popup" onclick="togglePopup('usagePopup117')">...<span class="popuptext" id="usagePopup117">Usage of <b>Kinds::Behaviour::new_enumerated_value</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node_tree</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="functiontext"><a href="2-uk.html#SP8">Kinds::Behaviour::convert_to_enumeration</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">next_free_value</span><span class="plain">++;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>At present we aren't using named aliases for kinds, but we may in future.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">kind</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::stored_as<button class="popup" onclick="togglePopup('usagePopup118')">...<span class="popuptext" id="usagePopup118">Usage of <b>Kinds::Behaviour::stored_as</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">stored_as</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. (B) Constructing kinds. </b></p>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. (C) Compatibility with other kinds. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::set_superkind_set_at<button class="popup" onclick="togglePopup('usagePopup119')">...<span class="popuptext" id="usagePopup119">Usage of <b>Kinds::Behaviour::set_superkind_set_at</b>:<br>Kind Checking - <a href="2-kc.html#SP17">&#167;17</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"set_superkind_set_at for null kind"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">superkind_set_at</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_superkind_set_at<button class="popup" onclick="togglePopup('usagePopup120')">...<span class="popuptext" id="usagePopup120">Usage of <b>Kinds::Behaviour::get_superkind_set_at</b>:<br>Kind Checking - <a href="2-kc.html#SP17">&#167;17</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">superkind_set_at</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. (D) How constant values of this kind are expressed. </b>Some kinds have named constants, others use a quasi-numerical notation: for
instance "maroon" might be an instance of kind "colour", while "234
kilopascals" might be a notation for a kind where constants are not named.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::has_named_constant_values<button class="popup" onclick="togglePopup('usagePopup121')">...<span class="popuptext" id="usagePopup121">Usage of <b>Kinds::Behaviour::has_named_constant_values</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">named_values_created_with_assertions</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>The following returns the compilation method (a constant in the form <code class="display"><span class="extract">*_CCM</span></code>,
defined in "Data Types.w") used when compiling an actual constant value
specification of this kind: in other words, when compiling an I6
value for a constant of this kind.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_constant_compilation_method<button class="popup" onclick="togglePopup('usagePopup122')">...<span class="popuptext" id="usagePopup122">Usage of <b>Kinds::Behaviour::get_constant_compilation_method</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">NONE_CCM</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">constant_compilation_method</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>The following is used only when the kind has named instances.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_highest_valid_value_as_integer<button class="popup" onclick="togglePopup('usagePopup123')">...<span class="popuptext" id="usagePopup123">Usage of <b>Kinds::Behaviour::get_highest_valid_value_as_integer</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">kind_constructor</span><span class="plain"> *</span><span class="identifier">con</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="identifier">CON_activity</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">activity</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K_equation</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">equation</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="identifier">CON_rule</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">booking</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="identifier">CON_rulebook</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K_table</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">table</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K_use_option</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">use_option</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con</span><span class="plain"> == </span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K_response</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">response_message</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">endif</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">con</span><span class="plain">-&gt;</span><span class="element">next_free_value</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. (E) Knowledge about values of this kind. </b>Some values can have properties attached &mdash; scenes, for instance &mdash; while
2020-04-14 19:56:54 +03:00
others can't &mdash; numbers or times, for instance. In general \(v\) can have
2019-03-17 14:40:57 +02:00
properties only if its kind passes this test:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::has_properties<button class="popup" onclick="togglePopup('usagePopup124')">...<span class="popuptext" id="usagePopup124">Usage of <b>Kinds::Behaviour::has_properties</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP6">Kinds::Behaviour::is_an_enumeration</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. (G) Performing arithmetic. </b>Comparisons made by calling an I6 routine are slower in the VM than using the
standard <code class="display"><span class="extract">&lt;</span></code> or <code class="display"><span class="extract">&gt;</span></code> operators for signed comparison, so we use them only if
we have to.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::uses_signed_comparisons<button class="popup" onclick="togglePopup('usagePopup125')">...<span class="popuptext" id="usagePopup125">Usage of <b>Kinds::Behaviour::uses_signed_comparisons</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">comparison_routine</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"signed"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_comparison_routine<button class="popup" onclick="togglePopup('usagePopup126')">...<span class="popuptext" id="usagePopup126">Usage of <b>Kinds::Behaviour::get_comparison_routine</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-fv.html#SP4">Kinds::FloatingPoint::uses_floating_point</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K_real_number</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="identifier">comparison_routine</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">comparison_routine</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"signed"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">comparison_routine</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_comparison_routine_as_iname<button class="popup" onclick="togglePopup('usagePopup127')">...<span class="popuptext" id="usagePopup127">Usage of <b>Kinds::Behaviour::get_comparison_routine_as_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="functiontext"><a href="2-uk.html#SP18">Kinds::Behaviour::get_comparison_routine</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>See "Dimensions.w" for a full account of these ideas. In theory, our
polymorphic system of arithmetic allows us to add or multiply any kinds
according to rules provided in the source text. In practice we have to keep
track of dimensions, and the following routines connect the code in the
"Dimensions" section to kind structures.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::is_quasinumerical<button class="popup" onclick="togglePopup('usagePopup128')">...<span class="popuptext" id="usagePopup128">Usage of <b>Kinds::Behaviour::is_quasinumerical</b>:<br><a href="2-uk.html#SP32">&#167;32</a>, Dimensions - <a href="2-dmn.html#SP18">&#167;18</a>, <a href="2-dmn.html#SP30_3">&#167;30.3</a>, <a href="2-dmn.html#SP31">&#167;31</a>, <a href="2-dmn.html#SP32_2">&#167;32.2</a>, <a href="2-dmn.html#SP33">&#167;33</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP15">Kinds::Constructors::is_arithmetic</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">unit_sequence</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_dimensional_form<button class="popup" onclick="togglePopup('usagePopup129')">...<span class="popuptext" id="usagePopup129">Usage of <b>Kinds::Behaviour::get_dimensional_form</b>:<br>Describing Kinds - <a href="2-dk.html#SP24_1">&#167;24.1</a><br>Dimensions - <a href="2-dmn.html#SP30_2">&#167;30.2</a>, <a href="2-dmn.html#SP30_3">&#167;30.3</a>, <a href="2-dmn.html#SP30_4">&#167;30.4</a>, <a href="2-dmn.html#SP31">&#167;31</a>, <a href="2-dmn.html#SP32_2">&#167;32.2</a>, <a href="2-dmn.html#SP33">&#167;33</a>, <a href="2-dmn.html#SP40">&#167;40</a>, <a href="2-dmn.html#SP40_3">&#167;40.3</a>, <a href="2-dmn.html#SP41">&#167;41</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP19">Kinds::Behaviour::is_quasinumerical</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain"> == </span><span class="identifier">CON_INTERMEDIATE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">intermediate_result</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> &amp;(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dimensional_form</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::test_if_derived<button class="popup" onclick="togglePopup('usagePopup130')">...<span class="popuptext" id="usagePopup130">Usage of <b>Kinds::Behaviour::test_if_derived</b>:<br>Dimensions - <a href="2-dmn.html#SP30_1">&#167;30.1</a>, <a href="2-dmn.html#SP33">&#167;33</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">dimensional_form_fixed</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::now_derived<button class="popup" onclick="togglePopup('usagePopup131')">...<span class="popuptext" id="usagePopup131">Usage of <b>Kinds::Behaviour::now_derived</b>:<br>Dimensions - <a href="2-dmn.html#SP30_2">&#167;30.2</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't derive null kind"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dimensional_form_fixed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::scale_factor<button class="popup" onclick="togglePopup('usagePopup132')">...<span class="popuptext" id="usagePopup132">Usage of <b>Kinds::Behaviour::scale_factor</b>:<br>Dimensions - <a href="2-dmn.html#SP35">&#167;35</a>, <a href="2-dmn.html#SP36">&#167;36</a>, <a href="2-dmn.html#SP37">&#167;37</a>, <a href="2-dmn.html#SP38">&#167;38</a>, <a href="2-dmn.html#SP39">&#167;39</a>, <a href="2-dmn.html#SP40_4">&#167;40.4</a><br>Floating-Point Values - <a href="2-fv.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">intermediate_result</span><span class="plain">)</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-dmn.html#SP27">Kinds::Dimensions::us_get_scaling_factor</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">intermediate_result</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LITERAL_PATTERNS</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">LiteralPatterns::scale_factor</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
<span class="plain">#</span><span class="reserved">else</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>The dimensional rules for K are the conventions on whether arithmetic
operations can be applied, and if so, what kind the result has.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">dimensional_rules</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_dim_rules<button class="popup" onclick="togglePopup('usagePopup133')">...<span class="popuptext" id="usagePopup133">Usage of <b>Kinds::Behaviour::get_dim_rules</b>:<br>Dimensions - <a href="2-dmn.html#SP16">&#167;16</a>, <a href="2-dmn.html#SP17">&#167;17</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> &amp;(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dim_rules</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. (H) Representing this kind at run-time. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_name_in_template_code<button class="popup" onclick="togglePopup('usagePopup134')">...<span class="popuptext" id="usagePopup134">Usage of <b>Kinds::Behaviour::get_name_in_template_code</b>:<br>Kinds - <a href="2-knd.html#SP33">&#167;33</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"UNKNOWN_NT"</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">name_in_template_code</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>Some kinds have a support routine:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::write_support_routine_name<button class="popup" onclick="togglePopup('usagePopup135')">...<span class="popuptext" id="usagePopup135">Usage of <b>Kinds::Behaviour::write_support_routine_name</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no support name for null kind"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">stored_as</span><span class="plain">) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">stored_as</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S_Support"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">name_in_template_code</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_support_routine_as_iname<button class="popup" onclick="togglePopup('usagePopup136')">...<span class="popuptext" id="usagePopup136">Usage of <b>Kinds::Behaviour::get_support_routine_as_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
<span class="functiontext"><a href="2-uk.html#SP22">Kinds::Behaviour::write_support_routine_name</a></span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">N</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. (I) Storing values at run-time. </b>Recall that values are stored at run-time either as "word values" &mdash; a
single I6 word &mdash; or "pointer values" (sometimes "block values"), where
the I6 word is a pointer to a block of data on the heap. Numbers and times
are word values, texts and lists are pointer values. Which form a value
takes depends on its kind:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::uses_pointer_values<button class="popup" onclick="togglePopup('usagePopup137')">...<span class="popuptext" id="usagePopup137">Usage of <b>Kinds::Behaviour::uses_pointer_values</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP19">Kinds::Constructors::uses_pointer_values</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>Exactly how large the small block is:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_small_block_size<button class="popup" onclick="togglePopup('usagePopup138')">...<span class="popuptext" id="usagePopup138">Usage of <b>Kinds::Behaviour::get_small_block_size</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">small_block_size</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>A reasonable estimate of how large the (larger!) heap block needs to be,
for a pointer-value kind, in bytes.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_heap_size_estimate<button class="popup" onclick="togglePopup('usagePopup139')">...<span class="popuptext" id="usagePopup139">Usage of <b>Kinds::Behaviour::get_heap_size_estimate</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">heap_size_estimate</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::cast_possible<button class="popup" onclick="togglePopup('usagePopup140')">...<span class="popuptext" id="usagePopup140">Usage of <b>Kinds::Behaviour::cast_possible</b>:<br><a href="2-uk.html#SP27">&#167;27</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">from</span><span class="plain"> = </span><span class="functiontext"><a href="2-knd.html#SP30">Kinds::weaken</a></span><span class="plain">(</span><span class="identifier">from</span><span class="plain">);</span>
<span class="identifier">to</span><span class="plain"> = </span><span class="functiontext"><a href="2-knd.html#SP30">Kinds::weaken</a></span><span class="plain">(</span><span class="identifier">to</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">to</span><span class="plain">) &amp;&amp; (</span><span class="identifier">from</span><span class="plain">) &amp;&amp; (</span><span class="identifier">to</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain"> != </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="2-uk.html#SP3">Kinds::Behaviour::definite</a></span><span class="plain">(</span><span class="identifier">to</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext"><a href="2-uk.html#SP3">Kinds::Behaviour::definite</a></span><span class="plain">(</span><span class="identifier">from</span><span class="plain">)) &amp;&amp;</span>
2020-04-14 19:56:54 +03:00
<span class="plain">(</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">to</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain"> != </span><span class="identifier">CON_property</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::cast_constant<button class="popup" onclick="togglePopup('usagePopup141')">...<span class="popuptext" id="usagePopup141">Usage of <b>Kinds::Behaviour::cast_constant</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">, </span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">REAL_LITERALS</span>
<span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP26">Kinds::Behaviour::cast_possible</a></span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">))</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">K_real_number</span><span class="plain">))) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">real</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">value</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't parse integer as real"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">value</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>And the following returns the name of an I6 routine to determine if two
2020-04-14 19:56:54 +03:00
values of \(K\) are different from each other; or <code class="display"><span class="extract">NULL</span></code> to say that it's
2019-03-17 14:40:57 +02:00
sufficient to apply <code class="display"><span class="extract">~=</span></code> to the values.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_distinguisher<button class="popup" onclick="togglePopup('usagePopup142')">...<span class="popuptext" id="usagePopup142">Usage of <b>Kinds::Behaviour::get_distinguisher</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">distinguisher</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_distinguisher_as_iname<button class="popup" onclick="togglePopup('usagePopup143')">...<span class="popuptext" id="usagePopup143">Usage of <b>Kinds::Behaviour::get_distinguisher_as_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP28">Kinds::Behaviour::get_distinguisher</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">N</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>Some kinds are such that all legal values can efficiently be looped through
at run-time, some are not: we can sensibly loop over all scenes, but not
over all texts. We use the term "domain" to mean the set of values which
a loop traverses.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::compile_domain_possible<button class="popup" onclick="togglePopup('usagePopup144')">...<span class="popuptext" id="usagePopup144">Usage of <b>Kinds::Behaviour::compile_domain_possible</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP6">Kinds::Behaviour::is_an_enumeration</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">loop_domain_schema</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>See "Tables.i6t"; the issue is whether the value <code class="display"><span class="extract">IMPROBABLE_VALUE</span></code> can,
despite its improbability, be valid for this kind. If we can prove that it is
not, we should return <code class="display"><span class="extract">FALSE</span></code>; if in any doubt, we must return <code class="display"><span class="extract">TRUE</span></code>.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::requires_blanks_bitmap<button class="popup" onclick="togglePopup('usagePopup145')">...<span class="popuptext" id="usagePopup145">Usage of <b>Kinds::Behaviour::requires_blanks_bitmap</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP6">Kinds::Behaviour::is_an_enumeration</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b>Can values of this kind be serialised out to a file and read back in again
by some other Inform story file, or by this one running on a different day?
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::can_exchange<button class="popup" onclick="togglePopup('usagePopup146')">...<span class="popuptext" id="usagePopup146">Usage of <b>Kinds::Behaviour::can_exchange</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">can_exchange</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. (J) Printing and parsing values at run-time. </b>Each kind can provide its own I6 routine to print out a value onto screen,
in some human-readable format.
</p>
<pre class="display">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_iname<button class="popup" onclick="togglePopup('usagePopup147')">...<span class="popuptext" id="usagePopup147">Usage of <b>Kinds::Behaviour::get_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K_number</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::get_iname</a></span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null kind has no printing routine"</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_use_option</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_USE_OPTION_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_table</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_TABLE_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_rulebook_outcome</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_RULEBOOK_OUTCOME_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_response</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_RESPONSE_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_figure_name</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_FIGURE_NAME_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_sound_name</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_SOUND_NAME_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_external_file</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_EXTERNAL_FILE_NAME_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_scene</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PRINT_SCENE_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_rule</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="2-knd.html#SP23">Kinds::get_construct</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_rulebook</span><span class="plain">)) </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP6">Kinds::Behaviour::is_an_enumeration</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) {</span>
<span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">); </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dt_I6_identifier</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-uk.html#SP19">Kinds::Behaviour::is_quasinumerical</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) {</span>
<span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">); </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_time</span><span class="plain">)) </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">)) </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP10">Kinds::Compare::eq</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_real_number</span><span class="plain">)) </span><span class="identifier">external</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"DecimalNumber"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">external</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">PRINT_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">actual_iname</span><span class="plain"> = </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">X</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Emit::named_iname_constant</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">actual_iname</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"internal but unknown kind printing routine"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">external</span><span class="plain">) </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain"> = </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">X</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"internal but unpackaged kind printing routine"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">pr_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">package_request</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::package<button class="popup" onclick="togglePopup('usagePopup148')">...<span class="popuptext" id="usagePopup148">Usage of <b>Kinds::Behaviour::package</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="2-kc2.html#SP9">Kinds::Constructors::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_inc_iname<button class="popup" onclick="togglePopup('usagePopup149')">...<span class="popuptext" id="usagePopup149">Usage of <b>Kinds::Behaviour::get_inc_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null kind has no inc routine"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">inc_iname</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">inc_iname</span><span class="plain">;</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">inc_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">DECREMENT_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">inc_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_dec_iname<button class="popup" onclick="togglePopup('usagePopup150')">...<span class="popuptext" id="usagePopup150">Usage of <b>Kinds::Behaviour::get_dec_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null kind has no dec routine"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dec_iname</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dec_iname</span><span class="plain">;</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">dec_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">INCREMENT_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">dec_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_ranger_iname<button class="popup" onclick="togglePopup('usagePopup151')">...<span class="popuptext" id="usagePopup151">Usage of <b>Kinds::Behaviour::get_ranger_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null kind has no inc routine"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">ranger_iname</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">ranger_iname</span><span class="plain">;</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP32">Kinds::Behaviour::package</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">ranger_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">RANGER_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">ranger_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_name_of_printing_rule_ACTIONS<button class="popup" onclick="togglePopup('usagePopup152')">...<span class="popuptext" id="usagePopup152">Usage of <b>Kinds::Behaviour::get_name_of_printing_rule_ACTIONS</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">K_number</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">trace_iname</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">trace_iname</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">name_of_printing_rule_ACTIONS</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">trace_iname</span><span class="plain"> = </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">name_of_printing_rule_ACTIONS</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">else</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">trace_iname</span><span class="plain"> = </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"DA_Name"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">trace_iname</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>Moving on to understanding: some kinds can be used as tokens in Understand
sentences, others can't. Thus "[time]" is a valid Understand token, but
"[stored action]" is not.
</p>
<p class="inwebparagraph">Some kinds provide have a GPR ("general parsing routine", an I6 piece of
jargon) defined somewhere in the template: if so, this returns its name;
if not, it returns <code class="display"><span class="extract">NULL</span></code>.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_explicit_I6_GPR<button class="popup" onclick="togglePopup('usagePopup153')">...<span class="popuptext" id="usagePopup153">Usage of <b>Kinds::Behaviour::get_explicit_I6_GPR</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Kinds::Behaviour::get_explicit_I6_GPR on null kind"</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrong way to handle object grammar"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">explicit_i6_GPR</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_explicit_I6_GPR_iname<button class="popup" onclick="togglePopup('usagePopup154')">...<span class="popuptext" id="usagePopup154">Usage of <b>Kinds::Behaviour::get_explicit_I6_GPR_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Kinds::Behaviour::get_explicit_I6_GPR on null kind"</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrong way to handle object grammar"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">explicit_i6_GPR</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">explicit_i6_GPR</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. </b>Can the kind have a GPR of any kind in the final code?
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::offers_I6_GPR<button class="popup" onclick="togglePopup('usagePopup155')">...<span class="popuptext" id="usagePopup155">Usage of <b>Kinds::Behaviour::offers_I6_GPR</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">has_i6_GPR</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. </b>Request that a GPR be compiled for this kind; the return value tell us whether
this will be allowed or not.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::request_I6_GPR<button class="popup" onclick="togglePopup('usagePopup156')">...<span class="popuptext" id="usagePopup156">Usage of <b>Kinds::Behaviour::request_I6_GPR</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-kc.html#SP9">Kinds::Compare::le</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrong way to handle object grammar"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">has_i6_GPR</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="comment"> can't oblige</span>
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">I6_GPR_needed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="comment"> make note to oblige later</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. </b>Do we need to compile a GPR of our own for this kind?
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::needs_I6_GPR<button class="popup" onclick="togglePopup('usagePopup157')">...<span class="popuptext" id="usagePopup157">Usage of <b>Kinds::Behaviour::needs_I6_GPR</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">I6_GPR_needed</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP37"></a><b>&#167;37. </b>For the following, see the explanation in "Texts.i6t" in the template: a
recognition-only GPR is used for matching specific data in the course of
parsing names of objects, but not as a grammar token in its own right.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_recognition_only_GPR<button class="popup" onclick="togglePopup('usagePopup158')">...<span class="popuptext" id="usagePopup158">Usage of <b>Kinds::Behaviour::get_recognition_only_GPR</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">recognition_only_GPR</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_recognition_only_GPR_as_iname<button class="popup" onclick="togglePopup('usagePopup159')">...<span class="popuptext" id="usagePopup159">Usage of <b>Kinds::Behaviour::get_recognition_only_GPR_as_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext"><a href="2-uk.html#SP37">Kinds::Behaviour::get_recognition_only_GPR</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Produce::find_by_name</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">N</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP38"></a><b>&#167;38. (K) Indexing and documentation. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_documentation_reference<button class="popup" onclick="togglePopup('usagePopup160')">...<span class="popuptext" id="usagePopup160">Usage of <b>Kinds::Behaviour::get_documentation_reference</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">documentation_reference</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::set_documentation_reference<button class="popup" onclick="togglePopup('usagePopup161')">...<span class="popuptext" id="usagePopup161">Usage of <b>Kinds::Behaviour::set_documentation_reference</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">dr</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">documentation_reference</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">dr</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP39"></a><b>&#167;39. </b>The following is used in the Kinds index, in the table showing the default
values for each kind:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_index_default_value<button class="popup" onclick="togglePopup('usagePopup162')">...<span class="popuptext" id="usagePopup162">Usage of <b>Kinds::Behaviour::get_index_default_value</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">index_default_value</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_index_minimum_value<button class="popup" onclick="togglePopup('usagePopup163')">...<span class="popuptext" id="usagePopup163">Usage of <b>Kinds::Behaviour::get_index_minimum_value</b>:<br>Dimensions - <a href="2-dmn.html#SP32_2_1">&#167;32.2.1</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">index_minimum_value</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_index_maximum_value<button class="popup" onclick="togglePopup('usagePopup164')">...<span class="popuptext" id="usagePopup164">Usage of <b>Kinds::Behaviour::get_index_maximum_value</b>:<br>Dimensions - <a href="2-dmn.html#SP32_2_2">&#167;32.2.2</a></span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">index_maximum_value</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::get_index_priority<button class="popup" onclick="togglePopup('usagePopup165')">...<span class="popuptext" id="usagePopup165">Usage of <b>Kinds::Behaviour::get_index_priority</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">index_priority</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::indexed_grey_if_empty<button class="popup" onclick="togglePopup('usagePopup166')">...<span class="popuptext" id="usagePopup166">Usage of <b>Kinds::Behaviour::indexed_grey_if_empty</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">indexed_grey_if_empty</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP40"></a><b>&#167;40. </b>And every kind is allowed to have the specification pseudo-property &mdash; a little
text used only on the index pages, and not existing at run-time. This is
set explicitly in the source text, but initialised for built-in kinds from
the I6 template files.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::Behaviour::set_specification_text<button class="popup" onclick="togglePopup('usagePopup167')">...<span class="popuptext" id="usagePopup167">Usage of <b>Kinds::Behaviour::set_specification_text</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">desc</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't set specification for null kind"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">K</span><span class="plain">-&gt;</span><span class="element">construct</span><span class="plain">-&gt;</span><span class="element">specification_text</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">desc</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kinds::Behaviour::get_specification_text<button class="popup" onclick="togglePopup('usagePopup168')">...<span class="popuptext" id="usagePopup168">Usage of <b>Kinds::Behaviour::get_specification_text</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't get specification of null kind"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-&gt;</span><span class="identifier">construct</span><span class="plain">-&gt;</span><span class="element">specification_text</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-ki.html">Back to 'Kind Interpreter'</a></li><li><a href="2-dk.html">Continue with 'Describing Kinds'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-04-14 19:56:54 +03:00
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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>
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>