mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
423 lines
89 KiB
HTML
423 lines
89 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Specifications</title>
|
|
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
|
|
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
MathJax = {
|
|
tex: {
|
|
inlineMath: '$', '$'], ['\\(', '\\)'
|
|
},
|
|
svg: {
|
|
fontCache: 'global'
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
|
</script>
|
|
|
|
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body class="commentary-font">
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-assets/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Services</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../calculus-module/index.html">calculus</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
<!--Weave of 'Specifications' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Specifications</b></li></ul></div>
|
|
<p class="purpose">To create, manage and compare specifications.</p>
|
|
|
|
<ul class="toc"><li><a href="14-sp.html#SP1">§1. Kinds vs specifications</a></li><li><a href="14-sp.html#SP6">§6. Pretty-printing specifications</a></li><li><a href="14-sp.html#SP7">§7. Sorting</a></li><li><a href="14-sp.html#SP8">§8. The Unknown</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Kinds vs specifications. </b>Specifications are portions of the parse tree representing data, or conditions
|
|
on data, or ways to manipulate it. This chapter contains utility routines
|
|
for creating and using them.
|
|
</p>
|
|
|
|
<p class="commentary">Kinds can be faithfully represented as specifications, but not vice versa:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::from_kind</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Specifications::from_kind</span></span>:<br/><a href="14-sp.html#SP5">§5</a><br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_3">§4.1.3</a><br/>Refine Parse Tree - <a href="5-rpt.html#SP7_1">§7.1</a><br/>The Creator - <a href="5-tc.html#SP5_4_1_1">§5.4.1.1</a>, <a href="5-tc.html#SP5_4_2_1">§5.4.2.1</a>, <a href="5-tc.html#SP5_4_2_4">§5.4.2.4</a><br/>Assertions - <a href="5-ass.html#SP6_3_25">§6.3.25</a>, <a href="5-ass.html#SP6_3_41_7">§6.3.41.7</a><br/>Adjective Meanings - <a href="7-am.html#SP26_6">§26.6</a><br/>Constants and Descriptions - <a href="10-cad.html#SP16">§16</a><br/>Type Expressions and Values - <a href="10-teav.html#SP2">§2</a><br/>Assert Propositions - <a href="12-ap.html#SP8_5_2">§8.5.2</a><br/>Dash - <a href="14-ds2.html#SP18_3_1">§18.3.1</a>, <a href="14-ds2.html#SP24">§24</a><br/>Inference Subjects - <a href="16-is.html#SP17">§17</a><br/>Tables - <a href="19-tb.html#SP21_1">§21.1</a>, <a href="19-tb.html#SP21_2">§21.2</a><br/>Describing Phrase Type Data - <a href="22-dptd.html#SP18_1">§18.1</a>, <a href="22-dptd.html#SP19">§19</a>, <a href="22-dptd.html#SP20_3_2">§20.3.2</a><br/>Parse Invocations - <a href="25-pi.html#SP4_2">§4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-ds.html#SP3" class="function-link"><span class="function-syntax">Descriptions::from_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::to_kind</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Specifications::to_kind</span></span>:<br/><a href="14-sp.html#SP5">§5</a><br/>Supplementary Quotes - <a href="2-sq.html#SP4">§4</a><br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_1">§4.1.1</a><br/>New Property Requests - <a href="4-npr.html#SP5_6">§5.6</a><br/>Refine Parse Tree - <a href="5-rpt.html#SP7_1">§7.1</a>, <a href="5-rpt.html#SP11_8_2_3_1">§11.8.2.3.1</a><br/>The Creator - <a href="5-tc.html#SP4_3">§4.3</a>, <a href="5-tc.html#SP4_4">§4.4</a>, <a href="5-tc.html#SP4_6">§4.6</a>, <a href="5-tc.html#SP5_4_2_2">§5.4.2.2</a>, <a href="5-tc.html#SP8">§8</a><br/>Assertions - <a href="5-ass.html#SP6_3_25">§6.3.25</a>, <a href="5-ass.html#SP6_3_26_1">§6.3.26.1</a>, <a href="5-ass.html#SP6_3_34">§6.3.34</a>, <a href="5-ass.html#SP6_3_39">§6.3.39</a>, <a href="5-ass.html#SP6_3_39_1">§6.3.39.1</a>, <a href="5-ass.html#SP6_3_39_5">§6.3.39.5</a>, <a href="5-ass.html#SP6_3_40">§6.3.40</a>, <a href="5-ass.html#SP6_3_40_1">§6.3.40.1</a>, <a href="5-ass.html#SP6_3_41">§6.3.41</a>, <a href="5-ass.html#SP6_3_41_8">§6.3.41.8</a><br/>Property Knowledge - <a href="5-pk.html#SP2">§2</a>, <a href="5-pk.html#SP3">§3</a><br/>Adjective Meanings - <a href="7-am.html#SP26">§26</a><br/>Constants and Descriptions - <a href="10-cad.html#SP19_2">§19.2</a><br/>Propositions - <a href="11-pr.html#SP22">§22</a><br/>Simplifications - <a href="11-sm.html#SP11">§11</a><br/>Type Check Propositions - <a href="11-tcp.html#SP7">§7</a><br/>The Equality Relation - <a href="12-ter.html#SP7_5">§7.5</a><br/>Assert Propositions - <a href="12-ap.html#SP11">§11</a><br/>I6 Schemas - <a href="12-is.html#SP7">§7</a>, <a href="12-is.html#SP8">§8</a><br/>Compile Atoms - <a href="12-ca.html#SP5_6">§5.6</a><br/>Deciding to Defer - <a href="12-dtd.html#SP9">§9</a>, <a href="12-dtd.html#SP15">§15</a>, <a href="12-dtd.html#SP17">§17</a>, <a href="12-dtd.html#SP23">§23</a>, <a href="12-dtd.html#SP27">§27</a><br/>Cinders and Deferrals - <a href="12-cad.html#SP3">§3</a>, <a href="12-cad.html#SP6">§6</a><br/>RValues - <a href="14-rv.html#SP21">§21</a><br/>Lvalues - <a href="14-lv.html#SP11_4">§11.4</a>, <a href="14-lv.html#SP13_3">§13.3</a><br/>Conditions - <a href="14-cn.html#SP12">§12</a><br/>Descriptions - <a href="14-ds.html#SP11">§11</a><br/>Compiling from Specifications - <a href="14-cfs.html#SP6">§6</a>, <a href="14-cfs.html#SP7">§7</a>, <a href="14-cfs.html#SP8">§8</a><br/>Dash - <a href="14-ds2.html#SP9_1_1_3_1">§9.1.1.3.1</a>, <a href="14-ds2.html#SP10_6">§10.6</a>, <a href="14-ds2.html#SP10_9_1_1_3_1_1">§10.9.1.1.3.1.1</a>, <a href="14-ds2.html#SP10_9_1_1_4">§10.9.1.1.4</a>, <a href="14-ds2.html#SP10_9_1_1_5">§10.9.1.1.5</a>, <a href="14-ds2.html#SP10_9_1_1_5_2">§10.9.1.1.5.2</a>, <a href="14-ds2.html#SP10_9_1_2_2">§10.9.1.2.2</a>, <a href="14-ds2.html#SP10_9_1_2_3">§10.9.1.2.3</a>, <a href="14-ds2.html#SP10_9_1_2_3_3">§10.9.1.2.3.3</a>, <a href="14-ds2.html#SP10_9_1_2_4">§10.9.1.2.4</a>, <a href="14-ds2.html#SP12">§12</a>, <a href="14-ds2.html#SP13_1_1">§13.1.1</a>, <a href="14-ds2.html#SP18_5_1">§18.5.1</a>, <a href="14-ds2.html#SP18_5_3">§18.5.3</a>, <a href="14-ds2.html#SP18_5_4">§18.5.4</a>, <a href="14-ds2.html#SP18_6_1">§18.6.1</a>, <a href="14-ds2.html#SP18_6_1_1">§18.6.1.1</a>, <a href="14-ds2.html#SP18_6_2_1">§18.6.2.1</a>, <a href="14-ds2.html#SP24">§24</a>, <a href="14-ds2.html#SP26">§26</a><br/>Inference Subjects - <a href="16-is.html#SP16">§16</a><br/>Inferences - <a href="16-in.html#SP13">§13</a><br/>List Constants - <a href="18-lc.html#SP7_1">§7.1</a><br/>Tables - <a href="19-tb.html#SP22">§22</a>, <a href="19-tb.html#SP22_1">§22.1</a><br/>Equations - <a href="20-eq.html#SP16_1">§16.1</a><br/>Rulebooks - <a href="21-rl2.html#SP13">§13</a><br/>Activities - <a href="21-ac.html#SP6">§6</a><br/>Describing Phrase Type Data - <a href="22-dptd.html#SP3_1_2_1">§3.1.2.1</a>, <a href="22-dptd.html#SP20_2_1">§20.2.1</a><br/>Local Variables - <a href="24-lv.html#SP33">§33</a><br/>Parse Invocations - <a href="25-pi.html#SP4_2">§4.2</a>, <a href="25-pi.html#SP5">§5</a>, <a href="25-pi.html#SP5_2">§5.2</a><br/>Compile Invocations - <a href="25-ci.html#SP2_1_1_1">§2.1.1.1</a>, <a href="25-ci.html#SP2_2_3_1_1">§2.2.3.1.1</a><br/>Compile Invocations Inline - <a href="25-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>, <a href="25-cii.html#SP3_5_3">§3.5.3</a>, <a href="25-cii.html#SP3_5_4">§3.5.4</a>, <a href="25-cii.html#SP3_5_7_1">§3.5.7.1</a>, <a href="25-cii.html#SP3_5_8_1">§3.5.8.1</a>, <a href="25-cii.html#SP3_7_1">§3.7.1</a>, <a href="25-cii.html#SP7">§7</a><br/>Compile Phrases - <a href="25-cp.html#SP4_3_5">§4.3.5</a><br/>Internal Test Cases - <a href="26-itc.html#SP4">§4</a>, <a href="26-itc.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">AMBIGUITY_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">spec</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-ds.html#SP3" class="function-link"><span class="function-syntax">Descriptions::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_lvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-lv.html#SP11" class="function-link"><span class="function-syntax">Lvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_rvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-rv.html#SP22" class="function-link"><span class="function-syntax">Rvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::to_true_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_lvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-lv.html#SP11" class="function-link"><span class="function-syntax">Lvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_rvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-rv.html#SP22" class="function-link"><span class="function-syntax">Rvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::to_true_kind_disambiguated</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Specifications::to_true_kind_disambiguated</span></span>:<br/>RValues - <a href="14-rv.html#SP17">§17</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">AMBIGUITY_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">spec</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="constant-syntax">TEST_VALUE_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">spec</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_lvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-lv.html#SP11" class="function-link"><span class="function-syntax">Lvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_rvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-rv.html#SP22" class="function-link"><span class="function-syntax">Rvalues::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>We say that a specification is "kind-like" if it's one of those which could
|
|
result from <span class="extract"><span class="extract-syntax">Specifications::from_kind</span></span>: for example, the description "numbers"
|
|
is kind-like, but "even numbers" is not.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::is_kind_like</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Specifications::is_kind_like</span></span>:<br/><a href="14-sp.html#SP5">§5</a><br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_1">§4.1.1</a>, <a href="4-dbtr.html#SP4_1_3">§4.1.3</a><br/>The Creator - <a href="5-tc.html#SP4_3">§4.3</a>, <a href="5-tc.html#SP8">§8</a><br/>Assertions - <a href="5-ass.html#SP6_3_26">§6.3.26</a>, <a href="5-ass.html#SP6_3_26_1">§6.3.26.1</a>, <a href="5-ass.html#SP6_3_39">§6.3.39</a>, <a href="5-ass.html#SP6_3_41_5">§6.3.41.5</a><br/>Dash - <a href="14-ds2.html#SP10_4_1">§10.4.1</a>, <a href="14-ds2.html#SP10_8_1">§10.8.1</a>, <a href="14-ds2.html#SP10_9_1_1_3_1_1">§10.9.1.1.3.1.1</a>, <a href="14-ds2.html#SP13_1_1">§13.1.1</a>, <a href="14-ds2.html#SP18_6_2_1">§18.6.2.1</a><br/>Properties - <a href="15-pr.html#SP4_2">§4.2</a><br/>Inference Subjects - <a href="16-is.html#SP16">§16</a><br/>Tables - <a href="19-tb.html#SP22_2">§22.2</a><br/>Runtime Support for Tables - <a href="19-rsft.html#SP1_1_1_1_1_4">§1.1.1.1.1.4</a><br/>Activities - <a href="21-ac.html#SP6">§6</a><br/>Describing Phrase Type Data - <a href="22-dptd.html#SP3_1_2_1">§3.1.2.1</a><br/>Local Variables - <a href="24-lv.html#SP32_2">§32.2</a>, <a href="24-lv.html#SP33">§33</a><br/>Parse Invocations - <a href="25-pi.html#SP4_2">§4.2</a>, <a href="25-pi.html#SP5">§5</a>, <a href="25-pi.html#SP5_2">§5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-ds.html#SP7" class="function-link"><span class="function-syntax">Descriptions::is_kind_like</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Another useful characterisation is "description-like". Most nouns are not
|
|
description-like, but names of objects are. Thus "Mrs Jones" is description-like,
|
|
but "12" is not.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::is_description_like</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Specifications::is_description_like</span></span>:<br/>Adjective Meanings - <a href="7-am.html#SP26_4">§26.4</a><br/>Verbal and Relative Clauses - <a href="10-varc.html#SP3_2">§3.2</a>, <a href="10-varc.html#SP8_1">§8.1</a><br/>Sentence Conversions - <a href="11-sc.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-rv.html#SP4" class="function-link"><span class="function-syntax">Rvalues::is_object</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-rv.html#SP6" class="function-link"><span class="function-syntax">Rvalues::is_nothing_object_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::is_description</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Specifications::is_description</span></span>:<br/><a href="14-sp.html#SP1">§1</a>, <a href="14-sp.html#SP4">§4</a>, <a href="14-sp.html#SP7">§7</a><br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_1">§4.1.1</a><br/>New Property Requests - <a href="4-npr.html#SP5_8_1">§5.8.1</a>, <a href="4-npr.html#SP5_8_3">§5.8.3</a>, <a href="4-npr.html#SP5_11_1">§5.11.1</a><br/>Refine Parse Tree - <a href="5-rpt.html#SP2">§2</a>, <a href="5-rpt.html#SP11_8_2">§11.8.2</a><br/>The Creator - <a href="5-tc.html#SP4_6">§4.6</a><br/>Assertions - <a href="5-ass.html#SP6_3_26">§6.3.26</a>, <a href="5-ass.html#SP6_3_39">§6.3.39</a><br/>New Property Assertions - <a href="5-npa.html#SP2_1_1_1">§2.1.1.1</a><br/>Property Knowledge - <a href="5-pk.html#SP3">§3</a>, <a href="5-pk.html#SP3_2">§3.2</a><br/>Constants and Descriptions - <a href="10-cad.html#SP19_3">§19.3</a><br/>Verbal and Relative Clauses - <a href="10-varc.html#SP12_4_1">§12.4.1</a><br/>Propositions - <a href="11-pr.html#SP34">§34</a><br/>Assert Propositions - <a href="12-ap.html#SP11">§11</a><br/>Conditions - <a href="14-cn.html#SP12">§12</a>, <a href="14-cn.html#SP15">§15</a><br/>Descriptions - <a href="14-ds.html#SP1">§1</a>, <a href="14-ds.html#SP2">§2</a>, <a href="14-ds.html#SP4">§4</a>, <a href="14-ds.html#SP5">§5</a>, <a href="14-ds.html#SP6">§6</a>, <a href="14-ds.html#SP7">§7</a>, <a href="14-ds.html#SP9">§9</a>, <a href="14-ds.html#SP10">§10</a><br/>Dash - <a href="14-ds2.html#SP10_9_1_1_3_1_1">§10.9.1.1.3.1.1</a>, <a href="14-ds2.html#SP10_9_1_2_3">§10.9.1.2.3</a>, <a href="14-ds2.html#SP18_5_3">§18.5.3</a>, <a href="14-ds2.html#SP18_6_2">§18.6.2</a>, <a href="14-ds2.html#SP24">§24</a><br/>Properties - <a href="15-pr.html#SP4_2">§4.2</a><br/>Tables - <a href="19-tb.html#SP22_2">§22.2</a><br/>Rulebooks - <a href="21-rl2.html#SP13">§13</a><br/>Activities - <a href="21-ac.html#SP6">§6</a>, <a href="21-ac.html#SP12">§12</a><br/>Describing Phrase Type Data - <a href="22-dptd.html#SP3_1_2_1">§3.1.2.1</a><br/>Local Variables - <a href="24-lv.html#SP33">§33</a><br/>Parse Invocations - <a href="25-pi.html#SP4_2">§4.2</a>, <a href="25-pi.html#SP5_2">§5.2</a><br/>Compile Invocations - <a href="25-ci.html#SP2_2_3_4_1_1_1">§2.2.3.4.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">TEST_VALUE_NT</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> (</span><a href="14-rv.html#SP19" class="function-link"><span class="function-syntax">Rvalues::is_CONSTANT_construction</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">CON_description</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::to_proposition</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Specifications::to_proposition</span></span>:<br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_1_2">§4.1.1.2</a><br/>Refine Parse Tree - <a href="5-rpt.html#SP11_8_2_3_1">§11.8.2.3.1</a><br/>The Creator - <a href="5-tc.html#SP5_2_1">§5.2.1</a><br/>Assertions - <a href="5-ass.html#SP6_3_8">§6.3.8</a><br/>Property Knowledge - <a href="5-pk.html#SP3_2">§3.2</a><br/>Verbal and Relative Clauses - <a href="10-varc.html#SP12_3">§12.3</a><br/>Propositions - <a href="11-pr.html#SP34">§34</a><br/>Sentence Conversions - <a href="11-sc.html#SP3">§3</a><br/>Deciding to Defer - <a href="12-dtd.html#SP5">§5</a>, <a href="12-dtd.html#SP17">§17</a>, <a href="12-dtd.html#SP23">§23</a><br/>Conditions - <a href="14-cn.html#SP14">§14</a>, <a href="14-cn.html#SP15">§15</a><br/>Descriptions - <a href="14-ds.html#SP1">§1</a><br/>Dash - <a href="14-ds2.html#SP18_4">§18.4</a><br/>Chronology - <a href="24-ch.html#SP6_4_1">§6.4.1</a><br/>Compile Phrases - <a href="25-cp.html#SP4_3_2">§4.3.2</a><br/>Internal Test Cases - <a href="26-itc.html#SP4_1">§4.1</a>, <a href="26-itc.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-ds.html#SP1" class="function-link"><span class="function-syntax">Descriptions::to_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_proposition</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::to_subject</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Specifications::to_subject</span></span>:<br/>Refine Parse Tree - <a href="5-rpt.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::to_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><a href="11-pr.html#SP23" class="function-link"><span class="function-syntax">Calculus::Propositions::describes_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="16-is.html#SP16" class="function-link"><span class="function-syntax">InferenceSubjects::from_specification</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="11-bas.html#SP15" class="function-link"><span class="function-syntax">Calculus::Variables::kind_of_variable_0</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="13-kak.html#SP1" class="function-link"><span class="function-syntax">Kinds::Knowledge::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="16-is.html#SP16" class="function-link"><span class="function-syntax">InferenceSubjects::from_specification</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Specifications which talk about objects lie in two different families:
|
|
"Mrs Jones" is a CONSTANT with kind "object", but "the open Bronze Gateway"
|
|
is a DESCRIPTION. The following extracts the object, if any, from either case:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::object_exactly_described_if_any</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Specifications::object_exactly_described_if_any</span></span>:<br/><a href="14-sp.html#SP7">§7</a><br/>Define by Table Requests - <a href="4-dbtr.html#SP4_1_1">§4.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-ds.html#SP5" class="function-link"><span class="function-syntax">Descriptions::to_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-rv.html#SP4" class="function-link"><span class="function-syntax">Rvalues::is_object</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-rv.html#SP6" class="function-link"><span class="function-syntax">Rvalues::is_nothing_object_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-rv.html#SP3" class="function-link"><span class="function-syntax">Rvalues::to_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>It's convenient to use specifications to represent the requirement on a
|
|
new variable declaration, such as that in "The tally is a number that varies."
|
|
We do this with the kind-like specification for "K that varies". Such a node
|
|
is called "new-variable-like".
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::new_new_variable_like</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Specifications::new_new_variable_like</span></span>:<br/>Type Expressions and Values - <a href="10-teav.html#SP4">§4</a>, <a href="10-teav.html#SP4_1">§4.1</a>, <a href="10-teav.html#SP4_2">§4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::unary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP1" class="function-link"><span class="function-syntax">Specifications::from_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">spec</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::kind_of_new_variable_like</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Specifications::kind_of_new_variable_like</span></span>:<br/>The Creator - <a href="5-tc.html#SP4_3">§4.3</a>, <a href="5-tc.html#SP5_4_2_2">§5.4.2.2</a><br/>Assertions - <a href="5-ass.html#SP6_3_39">§6.3.39</a>, <a href="5-ass.html#SP6_3_39_1">§6.3.39.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP1" class="function-link"><span class="function-syntax">Specifications::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::unary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::is_new_variable_like</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Specifications::is_new_variable_like</span></span>:<br/>The Creator - <a href="5-tc.html#SP4_3">§4.3</a>, <a href="5-tc.html#SP5_4_2">§5.4.2</a>, <a href="5-tc.html#SP5_4_2_2">§5.4.2.2</a><br/>Assertions - <a href="5-ass.html#SP6_3_38_1">§6.3.38.1</a>, <a href="5-ass.html#SP6_3_38_2">§6.3.38.2</a>, <a href="5-ass.html#SP6_3_39">§6.3.39</a>, <a href="5-ass.html#SP6_3_39_1">§6.3.39.1</a><br/>New Property Assertions - <a href="5-npa.html#SP2_1_1_1">§2.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="14-sp.html#SP2" class="function-link"><span class="function-syntax">Specifications::is_kind_like</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><a href="14-sp.html#SP1" class="function-link"><span class="function-syntax">Specifications::to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) == </span><span class="identifier-syntax">CON_variable</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Pretty-printing specifications. </b>We need to be able to print legible forms of translations in order to
|
|
produce good error messages, and also in order to describe phrases in the
|
|
Index; those have to be English language forms.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::write_out_in_English</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Specifications::write_out_in_English</span></span>:<br/>Supplementary Quotes - <a href="2-sq.html#SP1">§1</a><br/>Describing Phrase Type Data - <a href="22-dptd.html#SP3_1_2_1">§3.1.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"something unknown"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_lvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><a href="14-lv.html#SP10" class="function-link"><span class="function-syntax">Lvalues::write_out_in_English</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_rvalue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><a href="14-rv.html#SP21" class="function-link"><span class="function-syntax">Rvalues::write_out_in_English</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_condition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) </span><a href="14-cn.html#SP12" class="function-link"><span class="function-syntax">Conditions::write_out_in_English</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">AMBIGUITY_NT</span><span class="plain-syntax">)) </span><a href="14-sp.html#SP6" class="function-link"><span class="function-syntax">Specifications::write_out_in_English</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"something unrecognised"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Sorting. </b>Some specifications are used to describe the applicability of rules and phrases,
|
|
and since those must be sorted in order of how specific they are, we will need
|
|
a way of telling when one specification is more specific than another. For
|
|
instance, "Will Parker in the vineyard" beats "Will Parker" beats
|
|
"a man" beats "a person" beats "an object" beats "a value".
|
|
</p>
|
|
|
|
<p class="commentary">The following is one of Inform's standardised comparison routines, which
|
|
takes a pair of objects A, B and returns 1 if A makes a more specific
|
|
description than B, 0 if they seem equally specific, or \(-1\) if B makes a
|
|
more specific description than A. This is transitive, and intended to be
|
|
used in sorting algorithms.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cco</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="comment-syntax"> comparison count: used to make the debugging log vaguely searchable</span>
|
|
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">c_s_stage_law</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> name of the law being applied, which caused this to be called</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Specifications::compare_specificity</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Specifications::compare_specificity</span></span>:<br/>Phrase Runtime Context Data - <a href="22-prcd.html#SP7_3">§7.3</a><br/>Phrase Type Data - <a href="22-ptd.html#SP20_5_2">§20.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wont_mix</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPECIFICITIES</span><span class="plain-syntax">, </span><span class="string-syntax">"Law %S (test %d): comparing $P with $P\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">c_s_stage_law</span><span class="plain-syntax">, </span><span class="identifier-syntax">cco</span><span class="plain-syntax">++, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec2</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Existence is itself something specific</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP3" class="function-link"><span class="function-syntax">Specifications::is_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I1</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP4" class="function-link"><span class="function-syntax">Specifications::object_exactly_described_if_any</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I2</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP4" class="function-link"><span class="function-syntax">Specifications::object_exactly_described_if_any</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">An actual specification is more specific than a generic one</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">An exact object is more specific than a vague one</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I1</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_4" class="named-paragraph-link"><span class="named-paragraph">Enclosing regions beat enclosed ones, and regions beat rooms</span><span class="named-paragraph-number">7.4</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wont_mix</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_5" class="named-paragraph-link"><span class="named-paragraph">If one matches the other, but not vice versa, it must be more specific</span><span class="named-paragraph-number">7.5</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">a</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">b</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">)) { </span><span class="comment-syntax"> case 1: both are descriptions</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="14-ds.html#SP12" class="function-link"><span class="function-syntax">Descriptions::compare_specificity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">a</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">b</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) { </span><span class="comment-syntax"> case 2: neither is a description</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_6" class="named-paragraph-link"><span class="named-paragraph">Table entries are more specific than other non-descriptions</span><span class="named-paragraph-number">7.6</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="comment-syntax"> case 3: one is a description, the other isn't</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="14-sp.html#SP7_7" class="named-paragraph-link"><span class="named-paragraph">When is a description more specific than a non-description?</span><span class="named-paragraph-number">7.7</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b>Whether or not, as Bertrand Russell thought in 1894, existence is itself a good
|
|
("Great God in Boots! Э the ontological argument is sound!"), a specification
|
|
which exists is certainly more significant than one which does not; and there
|
|
is nothing to choose between two specifications, neither of which exists.
|
|
</p>
|
|
|
|
<p class="commentary">A God who wears boots is an incongruous thought. Sandals, possibly. But maybe
|
|
Russell meant the local Cambridge branch of Boots, the chemist's shop. At any
|
|
rate he changed his mind in 1896.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Existence is itself something specific</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">spec1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">spec2</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">spec1</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">spec2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">spec1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">spec2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>Hard to argue with this one: "34", for instance, is more specific than
|
|
"a number". (We might quibble about whether or not "a number which equals
|
|
34" is really less specific than "34" — Inform says it is; but in fact
|
|
it doesn't much matter either way.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">An actual specification is more specific than a generic one</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">aa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">a</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">I1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="identifier-syntax">aa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ba</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">b</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">I2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="identifier-syntax">ba</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">aa</span><span class="plain-syntax">) && (!</span><span class="identifier-syntax">ba</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((!</span><span class="identifier-syntax">aa</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">ba</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>§7.3. </b>For instance, "the open Marble Door" is more specific than "an open door"
|
|
or even just "a door", even though the latter is linguistically simpler.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">An exact object is more specific than a vague one</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">I1</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">I2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">I1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">I2</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>§7.4. </b>Suppose both specifications exactly describe objects, <span class="extract"><span class="extract-syntax">I1</span></span> and <span class="extract"><span class="extract-syntax">I2</span></span>, and
|
|
all other considerations are equal. It's not quite true that one object is as
|
|
good as another, because a region can be thought of as a set of rooms.
|
|
(Without the following criterion, rules such as "After waiting in Russia"
|
|
and "After waiting in Vladivostok Railway Station Waiting Room" would have
|
|
equal status.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Enclosing regions beat enclosed ones, and regions beat rooms</span><span class="named-paragraph-number">7.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPECIFICITIES</span><span class="plain-syntax">, </span><span class="string-syntax">"Test %d: Comparing specificity of instances $O and $O\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">cco</span><span class="plain-syntax">, </span><span class="identifier-syntax">I1</span><span class="plain-syntax">, </span><span class="identifier-syntax">I2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pref</span><span class="plain-syntax"> = </span><a href="26-pc.html#SP7" class="function-link"><span class="function-syntax">Plugins::Call::more_specific</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I1</span><span class="plain-syntax">, </span><span class="identifier-syntax">I2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pref</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pref</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_5" class="paragraph-anchor"></a><b>§7.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If one matches the other, but not vice versa, it must be more specific</span><span class="named-paragraph-number">7.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ev1</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">a</span><span class="plain-syntax">) || (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ev2</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">b</span><span class="plain-syntax">) || (</span><a href="8-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-lv.html#SP7" class="function-link"><span class="function-syntax">Lvalues::get_storage_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">) == </span><span class="constant-syntax">PROPERTY_VALUE_NT</span><span class="plain-syntax">) </span><span class="identifier-syntax">ev1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-lv.html#SP7" class="function-link"><span class="function-syntax">Lvalues::get_storage_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">) == </span><span class="constant-syntax">PROPERTY_VALUE_NT</span><span class="plain-syntax">) </span><span class="identifier-syntax">ev2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">ev1</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">ev2</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">x</span><span class="plain-syntax"> = </span><a href="14-ds2.html#SP26" class="function-link"><span class="function-syntax">Dash::compatible_with_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">y</span><span class="plain-syntax"> = </span><a href="14-ds2.html#SP26" class="function-link"><span class="function-syntax">Dash::compatible_with_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">x</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">y</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">y</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">x</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wont_mix</span><span class="plain-syntax">) *</span><span class="identifier-syntax">wont_mix</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_6" class="paragraph-anchor"></a><b>§7.6. </b>Here neither specification is a description or an actual object.
|
|
For the most part, then, we're left with two specifications of about equal
|
|
merit, and we don't choose between them. But in one case we do intervene: a
|
|
table entry reference beats anything else left, so that "Instead of taking
|
|
the magic key corresponding to Merlin in the Table of Arcana" is more
|
|
specific than "Instead of taking the brass key". It's questionable whether
|
|
this is a good convention, but users reported the previous absence of such
|
|
a convention as a bug, which is usually telling.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Table entries are more specific than other non-descriptions</span><span class="named-paragraph-number">7.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="constant-syntax">TABLE_ENTRY_NT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="constant-syntax">TABLE_ENTRY_NT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">t1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">t2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">t1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">t2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_7" class="paragraph-anchor"></a><b>§7.7. </b>To explicate the following: a description of an exact object beats any
|
|
non-description — thus "the open Marble Door" (a description) beats "the
|
|
Marble Door" (a constant instance). But any non-description beats a
|
|
description which is vague about the object — thus "the Marble Door" beats
|
|
"an open door", which is not news since rules above would enact that anyway,
|
|
but also "the tallest door in the Castle" (a phrase) beats "an open door".
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">When is a description more specific than a non-description?</span><span class="named-paragraph-number">7.7</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I1</span><span class="plain-syntax">) { </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">a</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1; }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">a</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">; }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="14-sp.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. The Unknown. </b>We begin with s-nodes used to represent text not yet parsed, or for which no
|
|
meaning could be found.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Specifications::new_UNKNOWN</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Specifications::new_UNKNOWN</span></span>:<br/>Refine Parse Tree - <a href="5-rpt.html#SP11_8_2_3">§11.8.2.3</a><br/>Nonlocal Variables - <a href="6-nv.html#SP16">§16</a><br/>Architecture of the S-Parser - <a href="10-aots.html#SP1">§1</a>, <a href="10-aots.html#SP2">§2</a>, <a href="10-aots.html#SP13">§13</a><br/>Constants and Descriptions - <a href="10-cad.html#SP19_3">§19.3</a>, <a href="10-cad.html#SP21">§21</a><br/>Type Expressions and Values - <a href="10-teav.html#SP12">§12</a>, <a href="10-teav.html#SP21">§21</a><br/>Verbal and Relative Clauses - <a href="10-varc.html#SP12">§12</a>, <a href="10-varc.html#SP12_4_1">§12.4.1</a><br/>RValues - <a href="14-rv.html#SP17">§17</a><br/>Descriptions - <a href="14-ds.html#SP6">§6</a><br/>List Constants - <a href="18-lc.html#SP3">§3</a><br/>Tables - <a href="19-tb.html#SP21">§21</a><br/>Activities - <a href="21-ac.html#SP4">§4</a>, <a href="21-ac.html#SP8_1">§8.1</a>, <a href="21-ac.html#SP8_6">§8.6</a><br/>Parse Invocations - <a href="25-pi.html#SP4_2">§4.2</a>, <a href="25-pi.html#SP5_2">§5.2</a><br/>Compile Invocations Inline - <a href="25-cii.html#SP8">§8</a><br/>Compile Phrases - <a href="25-cp.html#SP4_3_2">§4.3.2</a><br/>Internal Test Cases - <a href="26-itc.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Node::new_with_words</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<nav role="progress"><div class="progresscontainer">
|
|
<ul class="progressbar"><li class="progressprev"><a href="13-ki.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-bv.html">3</a></li><li class="progresschapter"><a href="4-dlr.html">4</a></li><li class="progresschapter"><a href="5-rpt.html">5</a></li><li class="progresschapter"><a href="6-lp.html">6</a></li><li class="progresschapter"><a href="7-am.html">7</a></li><li class="progresschapter"><a href="8-ptu.html">8</a></li><li class="progresschapter"><a href="9-ef.html">9</a></li><li class="progresschapter"><a href="10-its.html">10</a></li><li class="progresschapter"><a href="11-pr.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresscurrentchapter">14</li><li class="progresscurrent">sp</li><li class="progresssection"><a href="14-rv.html">rv</a></li><li class="progresssection"><a href="14-lv.html">lv</a></li><li class="progresssection"><a href="14-cn.html">cn</a></li><li class="progresssection"><a href="14-ds.html">ds</a></li><li class="progresssection"><a href="14-cfs.html">cfs</a></li><li class="progresssection"><a href="14-ds2.html">ds2</a></li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="14-rv.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|