mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
1744 lines
175 KiB
HTML
1744 lines
175 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>9/rpt</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '9/tc' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</a></li><li><a href="index.html">core</a></li><li><a href="index.html#9">Chapter 9: The A-Parser</a></li><li><b>The Creator</b></li></ul><p class="purpose">This is where all objects, kinds of object, named values, kinds of value and global variables are made.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Creations to match unrecognised names</a></li><li><a href="#SP5">§5. Acting on creations</a></li><li><a href="#SP8">§8. Creations to instantiate</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Creations to match unrecognised names. </b>The model contains objects, their properties and their relationships, and
|
|
this section is where all of the objects are created — not only world
|
|
objects (like rooms and people) but also named values.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The model world is initially empty. It grows gradually as sentences are
|
|
read in, or to be more accurate as they are traversed in the first major
|
|
pass through assertions. For example, we reach:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Fifi is in the wicker basket.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The two sides of the assertion are, respectively, <code class="display"><span class="extract">px</span></code>:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">node:PROPER_NOUN_NT <fifi> (no article)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">And <code class="display"><span class="extract">py</span></code>:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">node:RELATIONSHIP_NT <in> (type:standard)</span>
|
|
<span class="plain"> node:PROPER_NOUN_NT <wicker basket> (definite)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The Creator is not alas a cultured gentleman with a white-pointed beard, a
|
|
roll of architect's plans and a set square, perhaps played by an American
|
|
character actor in a movie like "The Matrix". It's just a routine which
|
|
returns either <code class="display"><span class="extract">TRUE</span></code> or <code class="display"><span class="extract">FALSE</span></code>, giving permission for reading of the
|
|
sentence to continue; and it always grants this permission unless a problem
|
|
message had to be issued during its work.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">problem_count_when_creator_started</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::consult_the_creator</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
|
|
<span class="identifier">problem_count_when_creator_started</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">existential</span><span class="plain">-</span><span class="identifier">np</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Perform creation duties on a "There is..." sentence</span> <span class="cwebmacronumber">1.1</span>>
|
|
<span class="reserved">else</span>
|
|
<<span class="cwebmacro">Perform creation duties on a copular sentence</span> <span class="cwebmacronumber">1.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> > </span><span class="identifier">problem_count_when_creator_started</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">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="endnote">The function Assertions::Creator::consult_the_creator is used in 9/tbath (<a href="9-tbath.html#SP5">§5</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b>This is the simpler case. Usually what goes on in the <code class="display"><span class="extract">px</span></code> side affects what
|
|
creations we make in the <code class="display"><span class="extract">py</span></code> side and vice versa, but here there's no
|
|
information on the <code class="display"><span class="extract">px</span></code> side, "there" being essentially a meaningless
|
|
placeholder in English, like the "it" in "it is raining".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that only the most primitive "there is" sentences turn up here.
|
|
Something like "There is a man in the Dining Room" is given a tree form
|
|
equivalent to "A man is in the Dining Room", and falls into the copular
|
|
case below. The only sentences coming here are things like "There is a
|
|
room."
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Perform creation duties on a "There is..." sentence</span> <span class="cwebmacronumber">1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2"></a><b>§1.2. </b>More generally we need to work out what <code class="display"><span class="extract">px</span></code> tells us about creations in <code class="display"><span class="extract">py</span></code>,
|
|
and vice versa. In particular, in terms of the kind of value involved. For
|
|
example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A man is in the Dining Room. Red is a colour.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">In each case <code class="display"><span class="extract">px</span></code> describes something which will need to be created, but <code class="display"><span class="extract">py</span></code>
|
|
tells us what kind it has: a colour in the second sentence here, but an object
|
|
in the first. (We do not need to decide the kind of object here, and
|
|
don't: it's sufficient to pin it down as far as "object".) The information
|
|
about this kind of value sometimes comes from a particular node somewhere
|
|
in <code class="display"><span class="extract">py</span></code>, which (if it exists) we'll call its "governing node".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Perform creation duties on a copular sentence</span> <span class="cwebmacronumber">1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Take care of two ambiguities to do with actions</span> <span class="cwebmacronumber">1.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">govx</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">govy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kindx</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">kindy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Work out the kinds of value expressed by each side, and find their governing nodes</span> <span class="cwebmacronumber">1.2.2</span>><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">kindy</span><span class="plain">, </span><span class="identifier">govy</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">kindx</span><span class="plain">, </span><span class="identifier">govx</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_1"></a><b>§1.2.1. </b>The first case here is to take care of a sentence like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Taking something is proactive behaviour.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Here <code class="display"><span class="extract">Assertions::Refiner::refine</span></code> will correctly report that "proactive behaviour" is
|
|
a new term, and give it a <code class="display"><span class="extract">CREATED_NT</span></code> node. But we don't want it to become an
|
|
object or a value — it will become a named kind of action instead. So we
|
|
amend the node to <code class="display"><span class="extract">ACTION_NT</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The second case occurs much less often — for instance, the only time it comes
|
|
up in the test suite is in the example "Chronic Hinting Syndrome":
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Setting is a kind of value. The settings are bright and dull.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Here the first sentence wants to create something called "setting", which
|
|
ought to have a <code class="display"><span class="extract">CREATED_NT</span></code> node type, but doesn't because it has been read
|
|
as an action instead. We correct the spurious <code class="display"><span class="extract">ACTION_NT</span></code> to a <code class="display"><span class="extract">CREATED_NT</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Take care of two ambiguities to do with actions</span> <span class="cwebmacronumber">1.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Assertions::Creator::actionlike</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="constant">CREATED_NT</span><span class="plain">))</span>
|
|
<span class="identifier">ParseTree::set_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="constant">ACTION_NT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Assertions::Creator::actionlike</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) && (</span><span class="functiontext">Assertions::Creator::actionlike</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Assertions::Creator::to_action_node</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Creator::to_action_node</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="constant">ACTION_NT</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">KIND_NT</span><span class="plain">))</span>
|
|
<span class="identifier">ParseTree::set_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="constant">CREATED_NT</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2_2"></a><b>§1.2.2. </b>There are two ways to know the kind being expressed. One is that the sentence
|
|
makes unambiguous use of a relation which forces the kinds on each side. For
|
|
example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The ball is on the box.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">uses the binary predicate supports, which requires its terms to be
|
|
objects. (In fact it requires them to be a thing and a supporter, but we
|
|
weaken those into just "object", since that's all we need to know for
|
|
creation purposes.) The code we use here looks asymmetric since it searches
|
|
<code class="display"><span class="extract">py</span></code> ahead of <code class="display"><span class="extract">px</span></code>, but in fact the two sides can't both contain a relation
|
|
without throwing a problem message (e.g., "In the trunk is on the table."),
|
|
so the code here is completely symmetrical in <code class="display"><span class="extract">px</span></code> and <code class="display"><span class="extract">py</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Containment is a slight exception because, for reasons to do with the
|
|
ambiguity between direct and indirect containment, it does not force the
|
|
kind of its second term. So we do so on its behalf.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The other way to find the kinds is to look at what the two sides explicitly say:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Green is a colour.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work out the kinds of value expressed by each side, and find their governing nodes</span> <span class="cwebmacronumber">1.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::bp_of_subtree</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::bp_of_subtree</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain">) {</span>
|
|
<span class="identifier">kindx</span><span class="plain"> = </span><span class="identifier">Kinds::weaken</span><span class="plain">(</span><span class="functiontext">BinaryPredicates::term_kind</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, 0));</span>
|
|
<span class="identifier">kindy</span><span class="plain"> = </span><span class="identifier">Kinds::weaken</span><span class="plain">(</span><span class="functiontext">BinaryPredicates::term_kind</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, 1));</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">BinaryPredicates::get_reversal</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">) == </span><span class="identifier">R_containment</span><span class="plain">)) { </span><span class="identifier">kindx</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">; </span><span class="identifier">kindy</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">; }</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kindx</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">kindy</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="identifier">kindx</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, &</span><span class="identifier">govx</span><span class="plain">);</span>
|
|
<span class="identifier">kindy</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, &</span><span class="identifier">govy</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_2">§1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::actionlike</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="constant">ACTION_NT</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="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_stored_action</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>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::to_action_node</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="constant">ACTION_NT</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_stored_action</span><span class="plain">)) {</span>
|
|
<span class="identifier">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_action_pattern</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">ACTION_NT</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_action_meaning</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"misapplied to_action_node"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::actionlike is used in <a href="#SP1_2_1">§1.2.1</a>.</p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::to_action_node is used in <a href="#SP1_2_1">§1.2.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>So that just leaves the algorithms for finding the relation of a subtree:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Assertions::Creator::bp_of_subtree</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">ParseTree::get_relationship</span><span class="plain">(</span><span class="identifier">p</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="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::bp_of_subtree is used in <a href="#SP1_2_2">§1.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And the kind of a subtree.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> **</span><span class="identifier">governing</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</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">switch</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">AND_NT</span><span class="plain">: </span><<span class="cwebmacro">Recurse downwards, preferring the leftmost item in a list</span> <span class="cwebmacronumber">4.1</span>><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">WITH_NT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">, </span><span class="identifier">governing</span><span class="plain">); </span> <span class="comment">the owner, not the property</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">KIND_NT</span><span class="plain">: </span><<span class="cwebmacro">Handle the kind of a "kind of..." clause</span> <span class="cwebmacronumber">4.2</span>><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Kinds of variable and of value produce the obvious kind as result</span> <span class="cwebmacronumber">4.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Initially values produce their own weakened kind</span> <span class="cwebmacronumber">4.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Descriptions produce the kind of whatever's described</span> <span class="cwebmacronumber">4.6</span>><span class="character">;</span>
|
|
<<span class="cwebmacro">Property names coinciding with kinds are considered with their kind meanings</span> <span class="cwebmacronumber">4.5</span>><span class="plain">;</span>
|
|
<span class="plain">}</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="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::kind_of_subtree is used in <a href="#SP1_2_2">§1.2.2</a>, <a href="#SP4_1">§4.1</a>, <a href="#SP5_2">§5.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Recurse downwards, preferring the leftmost item in a list</span> <span class="cwebmacronumber">4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">left</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">, </span><span class="identifier">governing</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">right</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">governing</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">left</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">left</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">right</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_2"></a><b>§4.2. </b>Refinement has already parsed a KIND subtree and left the resulting domain
|
|
in the node's subject, so this case is easy.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Handle the kind of a "kind of..." clause</span> <span class="cwebmacronumber">4.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">governing</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">InferenceSubjects::domain</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_3"></a><b>§4.3. </b>Less surprisingly, "number that varies" and "number" return <code class="display"><span class="extract">K_number</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Kinds of variable and of value produce the obvious kind as result</span> <span class="cwebmacronumber">4.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">found</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))</span>
|
|
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">K_value</span><span class="plain">; </span> <span class="comment">Specifications::kind_of_new_variable_like(spec);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) </span><span class="identifier">found</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain">) {</span>
|
|
<span class="plain">*</span><span class="identifier">governing</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">found</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">K_object</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">found</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_4"></a><b>§4.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Initially values produce their own weakened kind</span> <span class="cwebmacronumber">4.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">INITIALLY_CE</span><span class="plain">) || (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">CERTAIN_CE</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Lvalues::is_constant_NONLOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) {</span>
|
|
<span class="plain">*</span><span class="identifier">governing</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::weaken</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_5"></a><b>§4.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Property names coinciding with kinds are considered with their kind meanings</span> <span class="cwebmacronumber">4.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">CON_property</span><span class="plain">)) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_property</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Properties::is_either_or</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Properties::Valued::coincides_with_kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_6"></a><b>§4.6. </b>And similarly "even number" returns <code class="display"><span class="extract">K_number</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Descriptions produce the kind of whatever's described</span> <span class="cwebmacronumber">4.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">governing</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Acting on creations. </b>Building and refining the parse tree was a compositional process, in a linguistic
|
|
sense: what you do at any given position depends only on the current phrase and
|
|
its contents, or equivalently, on the current node and its children.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The creator is not compositional. What it does to the phrase "Miss Bianca",
|
|
words with no meaning as yet, depends on the rest of the sentence, as these
|
|
two alternatives show:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>[1] Miss Bianca is an animal. [2] Miss Bianca is a number that varies.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Nevertheless, the code has been structured to minimise the extent to which
|
|
information moves across the tree rather than upwards. When <code class="display"><span class="extract">Assertions::Creator::noun_creator</span></code>
|
|
is applied to a given node, it is allowed access to that node and all its
|
|
children, and can otherwise see only two pieces of information: the kind
|
|
for any creation ("animal" or "number", above) and, in some cases, also
|
|
a reference to which node in the tree determined this — the "governor".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We recurse downwards, looking only for <code class="display"><span class="extract">CALLED_NT</span></code> and <code class="display"><span class="extract">CREATED_NT</span></code> nodes,
|
|
both of which are excised and replaced with <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> or
|
|
<code class="display"><span class="extract">PROPER_NOUN_NT</span></code> nodes as appropriate.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">table</span><span class="plain"> *</span><span class="identifier">allow_tabular_definitions_from</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::tabular_definitions</span><span class="plain">(</span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
|
|
<span class="identifier">allow_tabular_definitions_from</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">governor</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLED_NT</span><span class="plain">: </span><<span class="cwebmacro">Check we are sure about this</span> <span class="cwebmacronumber">5.1</span>><span class="plain">; </span><<span class="cwebmacro">Perform creation on a CALLED node</span> <span class="cwebmacronumber">5.2</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CREATED_NT</span><span class="plain">: </span><<span class="cwebmacro">Check we are sure about this</span> <span class="cwebmacronumber">5.1</span>><span class="plain">; </span><<span class="cwebmacro">Perform creation on a CREATED node</span> <span class="cwebmacronumber">5.4</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">; </span><span class="identifier">ch</span><span class="plain">; </span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) </span><span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">ch</span><span class="plain">, </span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">governor</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::tabular_definitions is used in 19/tod (<a href="19-tod.html#SP6_3">§6.3</a>).</p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::noun_creator is used in <a href="#SP1_1">§1.1</a>, <a href="#SP1_2">§1.2</a>, <a href="#SP5_2">§5.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Check we are sure about this</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">IMPOSSIBLE_CE</span><span class="plain">) || (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">UNLIKELY_CE</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NegativeCreation</span><span class="plain">),</span>
|
|
<span class="string">"sentences are only allowed to say that things do exist"</span><span class="plain">,</span>
|
|
<span class="string">"not that they don't."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a> (twice), <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b>CALLED nodes allow a much more generous range of names to be used — that's
|
|
the whole point of them. Really they contain the whole language in miniature,
|
|
because a "called" clause can specify not only the name but also its kind,
|
|
some properties which it has, and so forth. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>There is a recurring scene called Expedited Banana Shipment.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Thus the CALLED subtree sometimes has "local" information about what to
|
|
make which overrides any information coming down from the tree above. This
|
|
is important for sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A man called Peter is in the Dining Room.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The tree above mandates that a creation in "A man called Peter" has to be
|
|
an object, but we know locally that Peter must further have the kind "man".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Perform creation on a CALLED node</span> <span class="cwebmacronumber">5.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">what_to_make_node</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">; </span> <span class="comment">e.g., "a man"</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">called_name_node</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">; </span> <span class="comment">a <code class="display"><span class="extract">CREATED_NT</span></code> node, e.g., "Peter"</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">) != </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">) != </span><span class="identifier">WITH_NT</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Complain that nothing else can be called</span> <span class="cwebmacronumber">5.2.3</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">local_governor</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">local_create_as</span><span class="plain"> = </span><span class="functiontext">Assertions::Creator::kind_of_subtree</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">, &</span><span class="identifier">local_governor</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">local_create_as</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">local_create_as</span><span class="plain"> = </span><span class="identifier">create_as</span><span class="plain">; </span><span class="identifier">local_governor</span><span class="plain"> = </span><span class="identifier">governor</span><span class="plain">; }</span>
|
|
<span class="functiontext">Assertions::Creator::noun_creator</span><span class="plain">(</span><span class="identifier">called_name_node</span><span class="plain">, </span><span class="identifier">local_create_as</span><span class="plain">, </span><span class="identifier">local_governor</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Replace the CALLED subtree with the new creation, mutatis mutandis</span> <span class="cwebmacronumber">5.2.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">If the CALLED name used the definite article, make a note of that</span> <span class="cwebmacronumber">5.2.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2_1"></a><b>§5.2.1. </b>This is where we act on the miniature sentence implied by the CALLED
|
|
subtree. We replace the subtree with a single node — the result of creation
|
|
on the <code class="display"><span class="extract">called_name_node</span></code> side — but then apply to it any kind, proposition
|
|
or adjectives specified in the <code class="display"><span class="extract">what_to_make_node</span></code> side.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Replace the CALLED subtree with the new creation, mutatis mutandis</span> <span class="cwebmacronumber">5.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p_sibling</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">ParseTree::copy</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">called_name_node</span><span class="plain">); </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">p_sibling</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">new_creation</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">its_domain</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">new_creation</span><span class="plain">) && (</span><span class="identifier">its_domain</span><span class="plain">))</span>
|
|
<span class="functiontext">Calculus::Propositions::Abstract::assert_kind_of_subject</span><span class="plain">(</span><span class="identifier">new_creation</span><span class="plain">, </span><span class="identifier">its_domain</span><span class="plain">,</span>
|
|
<span class="functiontext">Specifications::to_proposition</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">)));</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">what_to_make_node</span><span class="plain">) == </span><span class="identifier">WITH_NT</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_list</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">what_to_make_node</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_2">§5.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2_2"></a><b>§5.2.2. </b>Ordinarily the use of the definite article doesn't tell us much, but
|
|
consider the following two sentences:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>There is a man called the Assessor. There is a man called Eric Eve.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Clearly "Eric Eve" is a proper name, but "Assessor" is not; the use of
|
|
"the" here was significant. (We only allow proper names for objects, which
|
|
is why the following only applies to those.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">If the CALLED name used the definite article, make a note of that</span> <span class="cwebmacronumber">5.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">called_name_node</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">called_name_node</span><span class="plain">, </span><span class="identifier">nounphrase_article_ANNOT</span><span class="plain">) == </span><span class="identifier">DEF_ART</span><span class="plain">)) {</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_a_kind_of_object</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">)))</span>
|
|
<span class="identifier">PL::Naming::object_takes_definite_article</span><span class="plain">(</span><span class="identifier">subj</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="endnote">This code is used in <a href="#SP5_2">§5.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2_3"></a><b>§5.2.3. </b>Note that even in this problem case, the <code class="display"><span class="extract">CALLED_NT</span></code> node is removed. It
|
|
disappears from the tree entirely when the creator has finished work.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Complain that nothing else can be called</span> <span class="cwebmacronumber">5.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">what_to_make_node</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CalledWithoutKind</span><span class="plain">),</span>
|
|
<span class="string">"I can only make 'a something called whatever' when the something is a kind I know"</span><span class="plain">,</span>
|
|
<span class="string">"possibly qualified with adjectives. For instance, 'an open door called the Marble "</span>
|
|
<span class="string">"Door' is fine because 'door' is the name of a kind and 'open' is an adjective "</span>
|
|
<span class="string">"which means something for doors. But 'a grand archway called the Great Gates' "</span>
|
|
<span class="string">"would not normally mean anything to me, because 'archway' is not one of the "</span>
|
|
<span class="string">"standard kinds in Inform. (Try consulting the Kinds index.)"</span><span class="plain">);</span>
|
|
<span class="comment">now recover from the error as best we can:</span>
|
|
<span class="identifier">ParseTree::set_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">CREATED_NT</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">called_name_node</span><span class="plain">));</span>
|
|
<span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_2">§5.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_3"></a><b>§5.3. </b>Names are not permitted to contain brackets, but we do allow them as an indicator
|
|
of grammatical gender for languages other than English.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">grammatical</span><span class="plain">-</span><span class="identifier">gender</span><span class="plain">-</span><span class="identifier">marker</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( <</span><span class="identifier">grammatical</span><span class="plain">-</span><span class="identifier">gender</span><span class="plain">-</span><span class="identifier">abbreviation</span><span class="plain">> ) ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">grammatical</span><span class="plain">-</span><span class="identifier">gender</span><span class="plain">-</span><span class="identifier">abbreviation</span><span class="plain">> ::=</span>
|
|
<span class="identifier">n</span><span class="plain"> |</span>
|
|
<span class="identifier">m</span><span class="plain"> |</span>
|
|
<span class="identifier">f</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4"></a><b>§5.4. </b>That's it for callings; on to the main case, where we have a <code class="display"><span class="extract">CREATED_NT</span></code>
|
|
node which invites us to make something of it. In every case it becomes one
|
|
of <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> (e.g., "Colour is a kind of value"); or <code class="display"><span class="extract">PROPER_NOUN_NT</span></code>
|
|
(e.g., "Miss Bianca is an animal"). Thus every <code class="display"><span class="extract">CREATED_NT</span></code> node disappears
|
|
from the tree.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Perform creation on a CREATED node</span> <span class="cwebmacronumber">5.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<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">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"CREATED node without name"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">grammatical</span><span class="plain">-</span><span class="identifier">gender</span><span class="plain">-</span><span class="identifier">marker</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">grammatical</span><span class="plain">-</span><span class="identifier">gender</span><span class="plain">-</span><span class="identifier">marker</span><span class="plain">>, 1);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">gender_reference_ANNOT</span><span class="plain">, -(<<</span><span class="identifier">r</span><span class="plain">>> + 1));</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">creation</span><span class="plain">-</span><span class="identifier">problem</span><span class="plain">-</span><span class="identifier">diagnosis</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">create_as</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">))) &&</span>
|
|
<span class="plain">(</span><span class="identifier">prevailing_mood</span><span class="plain"> != </span><span class="identifier">INITIALLY_CE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">prevailing_mood</span><span class="plain"> != </span><span class="identifier">CERTAIN_CE</span><span class="plain">)) {</span>
|
|
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">recent_creation</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><<span class="cwebmacro">Create an object or kind of object rather than a value</span> <span class="cwebmacronumber">5.4.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">recent_creation</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_infs</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="functiontext">Instances::as_subject</span><span class="plain">(</span><span class="identifier">recent_creation</span><span class="plain">));</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><<span class="cwebmacro">Create a value rather than an object</span> <span class="cwebmacronumber">5.4.2</span>><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_value</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) </span><span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</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="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>There now follows a pretty tedious trawl through reasons to object to names.
|
|
The crash hieroglyphs exist only so that the Inform test suite can verify that
|
|
it handles crashes correctly.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">creation</span><span class="plain">-</span><span class="identifier">problem</span><span class="plain">-</span><span class="identifier">diagnosis</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">article</span><span class="plain">> | ==> </span><<span class="cwebmacro">Issue PM_NameIsArticle problem</span> <span class="cwebmacronumber">6.1</span>>
|
|
<span class="plain">(/)/(- *** | ==> </span><<span class="cwebmacro">Issue PM_NameWithBrackets problem</span> <span class="cwebmacronumber">6.2</span>>
|
|
<span class="plain">*** (/)/(- | ==> </span><<span class="cwebmacro">Issue PM_NameWithBrackets problem</span> <span class="cwebmacronumber">6.2</span>>
|
|
<span class="plain">... (/)/(- ... | ==> </span><<span class="cwebmacro">Issue PM_NameWithBrackets problem</span> <span class="cwebmacronumber">6.2</span>>
|
|
<span class="identifier">ni</span><span class="plain">--</span><span class="identifier">crash</span><span class="plain">--1 | ==> </span><<span class="cwebmacro">Issue PM_Crash1 problem</span> <span class="cwebmacronumber">6.3</span>>
|
|
<span class="identifier">ni</span><span class="plain">--</span><span class="identifier">crash</span><span class="plain">--10 | ==> </span><<span class="cwebmacro">Issue PM_Crash10 problem</span> <span class="cwebmacronumber">6.4</span>>
|
|
<span class="identifier">ni</span><span class="plain">--</span><span class="identifier">crash</span><span class="plain">--11 | ==> </span><<span class="cwebmacro">Issue PM_Crash11 problem</span> <span class="cwebmacronumber">6.5</span>>
|
|
<span class="plain">, ... | ==> </span><<span class="cwebmacro">Issue PM_StartsWithComma problem</span> <span class="cwebmacronumber">6.6</span>>
|
|
<span class="plain">... , | ==> </span><<span class="cwebmacro">Issue PM_EndsWithComma problem</span> <span class="cwebmacronumber">6.7</span>>
|
|
<span class="plain">... </span><span class="identifier">when</span><span class="plain">/</span><span class="reserved">while</span><span class="plain"> ... | ==> </span><<span class="cwebmacro">Issue PM_ObjectIncWhen problem</span> <span class="cwebmacronumber">6.8</span>>
|
|
<span class="plain">*** <</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">> *** | ==> </span><<span class="cwebmacro">Issue PM_NameWithText problem</span> <span class="cwebmacronumber">6.9</span>>
|
|
<span class="identifier">condition</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">conditions</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">storage</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">storages</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">variable</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">variables</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="reserved">property</span><span class="plain">-</span><span class="identifier">value</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="reserved">property</span><span class="plain">-</span><span class="identifier">values</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="reserved">table</span><span class="plain">-</span><span class="identifier">reference</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="reserved">table</span><span class="plain">-</span><span class="identifier">references</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">list</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain"> | ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
<span class="identifier">list</span><span class="plain">-</span><span class="identifier">entries</span><span class="plain"> ==> </span><<span class="cwebmacro">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_NameIsArticle problem</span> <span class="cwebmacronumber">6.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NameIsArticle</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give something a name which consists only of an article"</span><span class="plain">,</span>
|
|
<span class="string">"that is, 'a', 'an', 'the' or 'some'. This is not allowed since the "</span>
|
|
<span class="string">"potential for confusion is too high. (If you need, say, a room which "</span>
|
|
<span class="string">"the player sees as just 'A', you can get this effect with: 'A-Room is "</span>
|
|
<span class="string">"a room with printed name \</span><span class="plain">"</span><span class="string">A\</span><span class="plain">"</span><span class="string">.')"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_2"></a><b>§6.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_NameWithBrackets problem</span> <span class="cwebmacronumber">6.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NameWithBrackets</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give something a name which contains brackets '(' or ')'"</span><span class="plain">,</span>
|
|
<span class="string">"which is not allowed since the potential for confusion with other uses "</span>
|
|
<span class="string">"for brackets in Inform source text is too high. (If you need, say, a "</span>
|
|
<span class="string">"room which the player sees as 'Fillmore (West)', you can get this "</span>
|
|
<span class="string">"effect with: 'Fillmore West is a room with printed name \</span><span class="plain">"</span><span class="string">Fillmore "</span>
|
|
<span class="string">"(West)\</span><span class="plain">"</span><span class="string">.')"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a> (three times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_3"></a><b>§6.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_Crash1 problem</span> <span class="cwebmacronumber">6.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"*** Exit(1) requested for testing purposes ***\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Crash1</span><span class="plain">),</span>
|
|
<span class="string">"this uses the first secret hieroglyph of dreadful power"</span><span class="plain">,</span>
|
|
<span class="string">"which forces me to crash. (It's for testing the way I crash, in fact. "</span>
|
|
<span class="string">"If this is a genuine inconvenience to you, get in touch with my authors.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Fatal::exit</span><span class="plain">(1);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_4"></a><b>§6.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_Crash10 problem</span> <span class="cwebmacronumber">6.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"*** Exit(10) requested for testing purposes ***\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Crash10</span><span class="plain">),</span>
|
|
<span class="string">"this uses the second secret hieroglyph of dreadful power"</span><span class="plain">,</span>
|
|
<span class="string">"which forces me to crash. (It's for testing the way I crash, in fact. "</span>
|
|
<span class="string">"If this is a genuine inconvenience to you, get in touch with my authors.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Fatal::exit</span><span class="plain">(10);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_5"></a><b>§6.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_Crash11 problem</span> <span class="cwebmacronumber">6.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"*** Exit(11) requested for testing purposes ***\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Crash11</span><span class="plain">),</span>
|
|
<span class="string">"this uses the third secret hieroglyph of dreadful power"</span><span class="plain">,</span>
|
|
<span class="string">"which forces me to crash. (It's for testing the way I crash, in fact. "</span>
|
|
<span class="string">"If this is a genuine inconvenience to you, get in touch with my authors.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Fatal::exit</span><span class="plain">(11);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_6"></a><b>§6.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_StartsWithComma problem</span> <span class="cwebmacronumber">6.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_StartsWithComma</span><span class="plain">),</span>
|
|
<span class="string">"this seems to refer to something whose name begins with a comma"</span><span class="plain">,</span>
|
|
<span class="string">"which is forbidden. Perhaps you used a comma in punctuating a sentence? "</span>
|
|
<span class="string">"Inform generally doesn't like this because it reserves commas for "</span>
|
|
<span class="string">"specific purposes such as dividing rules or 'if' phrases."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_7"></a><b>§6.7. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_EndsWithComma problem</span> <span class="cwebmacronumber">6.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EndsWithComma</span><span class="plain">),</span>
|
|
<span class="string">"this seems to refer to something whose name ends with a comma"</span><span class="plain">,</span>
|
|
<span class="string">"which is forbidden. Perhaps you used a comma in punctuating a sentence? "</span>
|
|
<span class="string">"Inform generally doesn't like this because it reserves commas for "</span>
|
|
<span class="string">"specific purposes such as dividing rules or 'if' phrases."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_8"></a><b>§6.8. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_ObjectIncWhen problem</span> <span class="cwebmacronumber">6.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ObjectIncWhen</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to be talking about a previously unknown room or "</span>
|
|
<span class="string">"thing called %2. Ordinarily, I would create this, but because the name "</span>
|
|
<span class="string">"contains the word 'when' or 'while' I'm going to say no. %P"</span>
|
|
<span class="string">"That's because this far more often happens by mistake than deliberately. "</span>
|
|
<span class="string">"For instance, people sometimes type lines like 'Jumping when the actor "</span>
|
|
<span class="string">"is on the trampoline is high-jumping.' But in fact although 'jumping' "</span>
|
|
<span class="string">"is an action, 'Jumping when...' is not - 'when' can't be used here "</span>
|
|
<span class="string">"(though it can be used in rule preambles). So the sentence is instead "</span>
|
|
<span class="string">"read as making an object 'jumping when the actor' and putting it on top "</span>
|
|
<span class="string">"of another one, 'trampoline is high-jumping'. This can lead to a lot of "</span>
|
|
<span class="string">"confusion. %P"</span>
|
|
<span class="string">"If you genuinely do want an object whose name contains the word 'when', "</span>
|
|
<span class="string">"try something like: 'In the box is a thing called When worlds collide.'"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_9"></a><b>§6.9. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_NameWithText problem</span> <span class="cwebmacronumber">6.9</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NameWithText</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give something a name which contains "</span>
|
|
<span class="string">"double-quoted text"</span><span class="plain">,</span>
|
|
<span class="string">"which is not allowed. If you do need quotes in a name, one option "</span>
|
|
<span class="string">"would be to write something like 'In the Saloon is 'Black' Jacques "</span>
|
|
<span class="string">"Bernoulli.'; but this problem message is often caused by an "</span>
|
|
<span class="string">"accident in punctuation, in which case you never intended to "</span>
|
|
<span class="string">"create an object - you thought that the text ended a sentence "</span>
|
|
<span class="string">"because it finished with sentence-ending punctuation, when in "</span>
|
|
<span class="string">"fact it didn't, so that I read the next words as following on."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_10"></a><b>§6.10. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_NameReserved problem</span> <span class="cwebmacronumber">6.10</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NameReserved</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give something a name which is reserved for Inform's "</span>
|
|
<span class="string">"own internal use"</span><span class="plain">,</span>
|
|
<span class="string">"so is not allowed. There are only a few of these - 'storage', "</span>
|
|
<span class="string">"'variable', 'condition', 'phrase' and 'action', for example. But "</span>
|
|
<span class="string">"whatever you were making here, you'll need to call it something "</span>
|
|
<span class="string">"else."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a> (12 times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_1"></a><b>§5.4.1. </b>At this point we do something that might look odd: we check to see if the
|
|
text of the <code class="display"><span class="extract">CREATED_NT</span></code> node is the name of an object already. That seems
|
|
pointless, since <code class="display"><span class="extract">CREATED_NT</span></code> nodes are only made when a name is meaningless.
|
|
But that was a little while ago, before we started to make creations within
|
|
the current sentence.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This all hangs on the interpretation of sentences like so:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Malcolm believes Malcolm.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">which make the first mentions of "Malcolm". These are both <code class="display"><span class="extract">CREATED_NT</span></code>
|
|
nodes; the first causes "Malcolm" to be created; and then, when we reach
|
|
the second one, we find that <code class="display"><span class="extract">recent_creation</span></code> points to it, so we do not
|
|
need to make a second creation. The two Malcolms are, in fact, references
|
|
to the same object.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We do insist, however, on the names being given in exactly the same form.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Malcolm X believes Malcolm.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">creates two different objects with different names, even though references
|
|
to abbreviated forms of object names are normally allowed.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Create an object or kind of object rather than a value</span> <span class="cwebmacronumber">5.4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">recent_creation</span><span class="plain"> = </span><span class="functiontext">Instances::parse_object</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">recent_creation</span><span class="plain">) {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">RW</span><span class="plain"> = </span><span class="functiontext">Instances::get_name</span><span class="plain">(</span><span class="identifier">recent_creation</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="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">RW</span><span class="plain">)) && (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">RW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">recent_creation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">recent_creation</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><<span class="cwebmacro">Actually create a fresh object</span> <span class="cwebmacronumber">5.4.1.1</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4">§5.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_1_1"></a><b>§5.4.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Actually create a fresh object</span> <span class="cwebmacronumber">5.4.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_a_kind</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="identifier">governor</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">governor</span><span class="plain">) == </span><span class="identifier">KIND_NT</span><span class="plain">)) </span><span class="identifier">is_a_kind</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">is_a_kind</span><span class="plain">)</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Abstract::to_make_a_kind</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">));</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">is_a_kind</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">recent_creation</span><span class="plain"> = </span><span class="identifier">latest_instance</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">plural_reference_ANNOT</span><span class="plain">))</span>
|
|
<span class="identifier">PL::Naming::object_now_has_plural_name</span><span class="plain">(</span><span class="identifier">recent_creation</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">nounphrase_article_ANNOT</span><span class="plain">) == </span><span class="identifier">NO_ART</span><span class="plain">)</span>
|
|
<span class="identifier">PL::Naming::object_now_has_proper_name</span><span class="plain">(</span><span class="identifier">recent_creation</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">gender_reference_ANNOT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">g</span><span class="plain"> != 0) &&</span>
|
|
<span class="plain">(</span><span class="identifier">P_grammatical_gender</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">no_ggs_recorded</span><span class="plain"> == </span><span class="constant">NO_GRAMMATICAL_GENDERS</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">LIKELY_CE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">g</span><span class="plain"> < 0) { </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">CERTAIN_CE</span><span class="plain">; </span><span class="identifier">g</span><span class="plain"> = -</span><span class="identifier">g</span><span class="plain">; }</span>
|
|
<span class="functiontext">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_grammatical_gender</span><span class="plain">,</span>
|
|
<span class="functiontext">Instances::as_subject</span><span class="plain">(</span><span class="identifier">recent_creation</span><span class="plain">),</span>
|
|
<span class="functiontext">Rvalues::from_instance</span><span class="plain">(</span><span class="identifier">grammatical_genders</span><span class="plain">[</span><span class="identifier">g</span><span class="plain">-1]),</span>
|
|
<span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">latest_base_kind_of_value</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_value</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</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="endnote">This code is used in <a href="#SP5_4_1">§5.4.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2"></a><b>§5.4.2. </b>Something of a rag-bag, this: it's everything else that can be created.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Create a value rather than an object</span> <span class="cwebmacronumber">5.4.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">governing_spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">governor</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">governor</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">governor</span><span class="plain">) == </span><span class="identifier">KIND_NT</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Create a new kind of value</span> <span class="cwebmacronumber">5.4.2.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">governing_spec</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">INITIALLY_CE</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">CERTAIN_CE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Create a new variable</span> <span class="cwebmacronumber">5.4.2.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">) == </span><span class="identifier">CON_rulebook</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Create a new rulebook</span> <span class="cwebmacronumber">5.4.2.4</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">) == </span><span class="identifier">CON_activity</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Create a new activity</span> <span class="cwebmacronumber">5.4.2.5</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)) && (</span><span class="identifier">Kinds::Behaviour::is_quasinumerical</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Issue a problem for trying to create an instance of a unit</span> <span class="cwebmacronumber">5.4.2.6</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Tables::Defining::defined_by_table</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Tables::Defining::defined_by_table</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">) != </span><span class="identifier">allow_tabular_definitions_from</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Issue a problem for trying to create an instance of a table-defined kind</span> <span class="cwebmacronumber">5.4.2.7</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)) && (</span><span class="identifier">Kinds::Behaviour::has_named_constant_values</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Create an instance of an enumerated kind</span> <span class="cwebmacronumber">5.4.2.3</span>>
|
|
<span class="reserved">else</span>
|
|
<<span class="cwebmacro">Issue an unable-to-create problem message</span> <span class="cwebmacronumber">5.4.2.8</span>><span class="plain">;</span>
|
|
<span class="identifier">Index::DocReferences::position_of_symbol</span><span class="plain">(&</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4">§5.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_1"></a><b>§5.4.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create a new kind of value</span> <span class="cwebmacronumber">5.4.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Abstract::to_make_a_kind</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">));</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">latest_base_kind_of_value</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_2"></a><b>§5.4.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create a new variable</span> <span class="cwebmacronumber">5.4.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">domain</span><span class="plain"> = </span><span class="identifier">ParseTree::get_kind_of_value</span><span class="plain">(</span><span class="identifier">governing_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">domain</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">domain</span><span class="plain"> = </span><span class="identifier">Kinds::weaken</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">governing_spec</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">governing_spec</span><span class="plain">))</span>
|
|
<span class="identifier">domain</span><span class="plain"> = </span><span class="functiontext">Specifications::kind_of_new_variable_like</span><span class="plain">(</span><span class="identifier">governing_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::contains</span><span class="plain">(</span><span class="identifier">domain</span><span class="plain">, </span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K_understanding</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Issue a problem for topics that vary</span> <span class="cwebmacronumber">5.4.2.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">domain</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">CERTAIN_CE</span><span class="plain">)</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Abstract::to_make_a_const</span><span class="plain">());</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Abstract::to_make_a_var</span><span class="plain">());</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Lvalues::new_actual_NONLOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">latest_nonlocal_variable</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_3"></a><b>§5.4.2.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create an instance of an enumerated kind</span> <span class="cwebmacronumber">5.4.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">such_that</span><span class="plain"> = </span><span class="identifier">ParseTree::get_creation_proposition</span><span class="plain">(</span><span class="identifier">governor</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">such_that</span><span class="plain">) </span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">such_that</span><span class="plain">);</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Rvalues::from_instance</span><span class="plain">(</span><span class="identifier">latest_instance</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_4"></a><b>§5.4.2.4. </b>Lastly: rulebooks and activities are not part of the model, because they would
|
|
make it enormously larger, and because they describe only the run-time evolution
|
|
of the state of play and have no effect on the initial state. So we don't create
|
|
them by asserting propositions to be true; we act directly.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Create a new rulebook</span> <span class="cwebmacronumber">5.4.2.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">basis</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">producing</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">Kinds::binary_construction_material</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, &</span><span class="identifier">basis</span><span class="plain">, &</span><span class="identifier">producing</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">basis</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">)) </span><span class="identifier">basis</span><span class="plain"> = </span><span class="identifier">K_action_name</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">producing</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">)) </span><span class="identifier">producing</span><span class="plain"> = </span><span class="identifier">K_nil</span><span class="plain">;</span>
|
|
<span class="identifier">create_as</span><span class="plain"> = </span><span class="identifier">Kinds::binary_construction</span><span class="plain">(</span><span class="identifier">CON_rulebook</span><span class="plain">, </span><span class="identifier">basis</span><span class="plain">, </span><span class="identifier">producing</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">governor</span><span class="plain">)</span>
|
|
<span class="identifier">ParseTree::set_evaluation</span><span class="plain">(</span><span class="identifier">governor</span><span class="plain">,</span>
|
|
<span class="functiontext">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">));</span>
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Hierarchy::local_package</span><span class="plain">(</span><span class="constant">RULEBOOKS_HAP</span><span class="plain">);</span>
|
|
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain"> = </span><span class="functiontext">Rulebooks::new</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Rvalues::from_rulebook</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">, </span><span class="constant">clears_pronouns_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_5"></a><b>§5.4.2.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create a new activity</span> <span class="cwebmacronumber">5.4.2.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain"> = </span><span class="functiontext">Activities::new</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Rvalues::from_activity</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">, </span><span class="constant">clears_pronouns_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_2_1"></a><b>§5.4.2.2.1. </b>And to wind up, sundry problem messages.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for topics that vary</span> <span class="cwebmacronumber">5.4.2.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NoTopicsThatVary</span><span class="plain">),</span>
|
|
<span class="string">"'topics that vary' are not allowed"</span><span class="plain">,</span>
|
|
<span class="string">"that is, a variable is not allowed to have 'topic' as its kind of value. "</span>
|
|
<span class="string">"(This would cause too much ambiguity with text variables, whose values "</span>
|
|
<span class="string">"look exactly the same.)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2_2">§5.4.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_6"></a><b>§5.4.2.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for trying to create an instance of a unit</span> <span class="cwebmacronumber">5.4.2.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="reserved">equation</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">create_as</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MixedConstantsEquation</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 reads to me as if '%2' refers to something "</span>
|
|
<span class="string">"I should create as brand new - %3. But that can't be right, "</span>
|
|
<span class="string">"and I suspect this may be because you've tried to create an "</span>
|
|
<span class="string">"Equation but not given it a new paragraph."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">create_as</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MixedConstants</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 reads to me as if '%2' refers to something "</span>
|
|
<span class="string">"I should create as brand new - %3. But that can't be right, "</span>
|
|
<span class="string">"because this is a kind of value where I can't simply invent "</span>
|
|
<span class="string">"new values. (Just as the numbers are ..., 1, 2, 3, ... and "</span>
|
|
<span class="string">"I can't invent a new one called 'Susan'.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_7"></a><b>§5.4.2.7. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for trying to create an instance of a table-defined kind</span> <span class="cwebmacronumber">5.4.2.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">create_as</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_table</span><span class="plain">(4, </span><span class="functiontext">Tables::Defining::defined_by_table</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TableOfExistingKind2</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 reads to me as if '%2' refers to something "</span>
|
|
<span class="string">"I should create as brand new - %3. That looks reasonable, since "</span>
|
|
<span class="string">"this is a kind which does have named values, but it's not "</span>
|
|
<span class="string">"allowed because this is a kind which is defined by the rows "</span>
|
|
<span class="string">"of a table (%4), not in isolated sentences like this one."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4_2_8"></a><b>§5.4.2.8. </b>This is often a problem already reported, so we issue a fresh message only
|
|
if nothing has already been said:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Issue an unable-to-create problem message</span> <span class="cwebmacronumber">5.4.2.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count_when_creator_started</span><span class="plain"> == </span><span class="identifier">problem_count</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W: $u\</span><span class="plain">n</span><span class="string">$T\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">create_as</span><span class="plain">, </span><span class="identifier">governor</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">create_as</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NoNewInstances</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 reads to me as if '%2' refers to something "</span>
|
|
<span class="string">"I should create as brand new - %3. But that can't be right, "</span>
|
|
<span class="string">"because this is a kind of value where I can't simply invent "</span>
|
|
<span class="string">"new values. (Just as the numbers are ..., 1, 2, 3, ... and "</span>
|
|
<span class="string">"I can't invent a new one called 'Susan'.) %P"</span>
|
|
<span class="string">"Perhaps you wanted not to invent a constant but to make a "</span>
|
|
<span class="string">"variable - that is, to give a name for a value which will "</span>
|
|
<span class="string">"change during play. If so, try something like 'The bonus "</span>
|
|
<span class="string">"is a number which varies'. %P"</span>
|
|
<span class="string">"Or perhaps you wanted to create a name as an alias for a "</span>
|
|
<span class="string">"constant value. If so, try something like 'The lucky number "</span>
|
|
<span class="string">"is always 8.' But this only makes a new name for the existing "</span>
|
|
<span class="string">"number 8, it doesn't invent a new number."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5_4_2">§5.4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>It turns out to be useful to have the same policing rules elsewhere:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::vet_name</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">creation</span><span class="plain">-</span><span class="identifier">problem</span><span class="plain">-</span><span class="identifier">diagnosis</span><span class="plain">>(</span><span class="identifier">W</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">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="endnote">The function Assertions::Creator::vet_name is used in 19/tc (<a href="19-tc.html#SP13_2">§13.2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Creations to instantiate. </b>The <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> node sometimes means to talk about things in general,
|
|
sometimes things in particular; consider the two sentences
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A container is usually open. A container is in the Box Room.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">We cannot easily differentiate these meanings. We will only be able to do so
|
|
by looking carefully at what the assertion does; studying the two sides of the
|
|
tree separately won't be good enough. So instantiation is done only at a few
|
|
points in "Make Assertions", and not as part of the process above.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Instantiation only ever creates objects, since values aren't allowed to be
|
|
nameless.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">So: when it turns out that the <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> is to be made into something nameless
|
|
but tangible, as in the second sentence above, the following routine is used
|
|
to transform it into a suitable <code class="display"><span class="extract">PROPER_NOUN_NT</span></code> referring to the newly created
|
|
object.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">name_stubs_count</span><span class="plain"> = 0;</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::convert_instance_to_nounphrase</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">hinge_relation</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Check we are sure about this</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">confect_name_flag</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="identifier">hinge_relation</span><span class="plain">) && (</span><span class="functiontext">BinaryPredicates::is_the_wrong_way_round</span><span class="plain">(</span><span class="identifier">hinge_relation</span><span class="plain">)))</span>
|
|
<span class="identifier">hinge_relation</span><span class="plain"> = </span><span class="functiontext">BinaryPredicates::get_reversal</span><span class="plain">(</span><span class="identifier">hinge_relation</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hinge_relation</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) </span><span class="identifier">confect_name_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">instance_count</span><span class="plain">;</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span> <span class="comment">the calling</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">ending</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">))) {</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">ending</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">>, 1)); </span> <span class="comment">the text before the bracketed clause</span>
|
|
<span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">ending</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">>, 2); </span> <span class="comment">the bracketed text</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">article</span><span class="plain">>(</span><span class="identifier">CW</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Issue a problem for calling something an article</span> <span class="cwebmacronumber">8.2</span>><span class="plain">;</span>
|
|
<span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">instance_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)))</span>
|
|
<span class="identifier">instance_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Kinds::Behaviour::has_named_constant_values</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Point out that it's impossible to create values implicitly for this kind</span> <span class="cwebmacronumber">8.1</span>><span class="character">;</span>
|
|
<<span class="cwebmacro">Calculate the instance count, that is, the number of duplicates to be made</span> <span class="cwebmacronumber">8.3</span>><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">list_subtree</span><span class="plain"> = </span><span class="identifier">ParseTree::new</span><span class="plain">(</span><span class="constant">COMMON_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">original_next</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Construct a list subtree containing the right number of duplicates</span> <span class="cwebmacronumber">8.4</span>><span class="plain">;</span>
|
|
<span class="identifier">ParseTree::copy</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">list_subtree</span><span class="plain">);</span>
|
|
<span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">original_next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Creator::convert_instance_to_nounphrase is used in 9/tbath (<a href="9-tbath.html#SP7">§7</a>), 9/ma (<a href="9-ma.html#SP3_3_34_2">§3.3.34.2</a>, <a href="9-ma.html#SP3_3_34_4">§3.3.34.4</a>, <a href="9-ma.html#SP3_3_35">§3.3.35</a>, <a href="9-ma.html#SP7">§7</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_1"></a><b>§8.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Point out that it's impossible to create values implicitly for this kind</span> <span class="cwebmacronumber">8.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(2, </span><span class="identifier">instance_kind</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantCreateImplicitly</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to be asking me to create a new value (%2) "</span>
|
|
<span class="string">"in order to be part of a relationship, but this isn't a kind of "</span>
|
|
<span class="string">"value which I can just create new values for."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="identifier">instance_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">multiplicity_ANNOT</span><span class="plain">, 1);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_2"></a><b>§8.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for calling something an article</span> <span class="cwebmacronumber">8.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">CW</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CalledArticle</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to be asking me to create something whose "</span>
|
|
<span class="string">"name, '%2', is just an article - this isn't allowed."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_3"></a><b>§8.3. </b>Usually the instance count is 1, but noun phrases such as "six vehicles"
|
|
will raise it. The problem message here is almost a bit of social engineering:
|
|
we just don't think you're implementing it right if you think you need more
|
|
than 100 duplicate objects in one go. (Though it is true what the problem
|
|
message says about performance, too.)
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_DUPLICATES_AT_ONCE</span><span class="plain"> 100 </span> <span class="comment">change the problem message below if this is changed</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Calculate the instance count, that is, the number of duplicates to be made</span> <span class="cwebmacronumber">8.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">instance_count</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">multiplicity_ANNOT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">instance_count</span><span class="plain"> < 1) </span><span class="identifier">instance_count</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">instance_count</span><span class="plain"> > </span><span class="constant">MAX_DUPLICATES_AT_ONCE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TooManyDuplicates</span><span class="plain">),</span>
|
|
<span class="string">"at most 100 duplicates can be made at any one time"</span><span class="plain">,</span>
|
|
<span class="string">"so '157 chairs are in the UN General Assembly' will not be allowed. The "</span>
|
|
<span class="string">"system for handling duplicates during play becomes too slow and awkward "</span>
|
|
<span class="string">"when there are so many."</span><span class="plain">);</span>
|
|
<span class="identifier">instance_count</span><span class="plain"> = </span><span class="constant">MAX_DUPLICATES_AT_ONCE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4"></a><b>§8.4. </b>For instance, "six vehicles" would make a binary tree here in which the
|
|
intermediate nodes are <code class="display"><span class="extract">AND_NT</span></code> and the leaves <code class="display"><span class="extract">PROPER_NOUN_NT</span></code>, each referring
|
|
to a different vehicle object.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Construct a list subtree containing the right number of duplicates</span> <span class="cwebmacronumber">8.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">attach_to</span><span class="plain"> = </span><span class="identifier">list_subtree</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="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1; </span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">instance_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">new_instance</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Fashion a new object matching the description in the COMMON NOUN node</span> <span class="cwebmacronumber">8.4.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> < </span><span class="identifier">instance_count</span><span class="plain">) {</span>
|
|
<span class="identifier">ParseTree::set_type_and_clear_annotations</span><span class="plain">(</span><span class="identifier">attach_to</span><span class="plain">, </span><span class="identifier">AND_NT</span><span class="plain">);</span>
|
|
<span class="identifier">attach_to</span><span class="plain">-</span><span class="element">>down</span><span class="plain"> = </span><span class="identifier">ParseTree::new</span><span class="plain">(</span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_infs</span><span class="plain">(</span><span class="identifier">attach_to</span><span class="plain">-</span><span class="element">>down</span><span class="plain">, </span><span class="identifier">new_instance</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">attach_to</span><span class="plain">-</span><span class="element">>down</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="identifier">attach_to</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">ParseTree::new</span><span class="plain">(</span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="identifier">attach_to</span><span class="plain"> = </span><span class="identifier">attach_to</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_infs</span><span class="plain">(</span><span class="identifier">attach_to</span><span class="plain">, </span><span class="identifier">new_instance</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">attach_to</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4_1"></a><b>§8.4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Fashion a new object matching the description in the COMMON NOUN node</span> <span class="cwebmacronumber">8.4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">named_after</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NAW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">propriety</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Confect a name for the new object, if that's the bag we're into</span> <span class="cwebmacronumber">8.4.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Check that the new name is non-empty and distinct from all existing ones</span> <span class="cwebmacronumber">8.4.1.2</span>><span class="plain">;</span>
|
|
<span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">Wordings::truncate</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">, 32); </span> <span class="comment">truncate to the maximum length</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pz</span><span class="plain"> = </span><span class="identifier">ParseTree::new</span><span class="plain">(</span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Abstract::to_create_something</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">);</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="identifier">new_instance</span><span class="plain"> = </span><span class="functiontext">Instances::as_subject</span><span class="plain">(</span><span class="identifier">latest_instance</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">named_after</span><span class="plain">) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="identifier">PL::Naming::transfer_details</span><span class="plain">(</span><span class="identifier">named_after</span><span class="plain">, </span><span class="identifier">new_instance</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="functiontext">Assertions::Assemblies::name_object_after</span><span class="plain">(</span><span class="identifier">new_instance</span><span class="plain">, </span><span class="identifier">named_after</span><span class="plain">, </span><span class="identifier">NAW</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">named_after</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_a_kind_of_object</span><span class="plain">(</span><span class="identifier">named_after</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">propriety</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">propriety</span><span class="plain">) </span><span class="identifier">PL::Naming::now_has_proper_name</span><span class="plain">(</span><span class="identifier">new_instance</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_infs</span><span class="plain">(</span><span class="identifier">pz</span><span class="plain">, </span><span class="identifier">new_instance</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">pz</span><span class="plain">, </span><span class="constant">creation_site_ANNOT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">pz</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8_4">§8.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4_1_1"></a><b>§8.4.1.1. </b>The following is used only in assemblies, where the instance count is always
|
|
1, and confects a name like "Cleopatra's nose" from an owner object, "Cleopatra",
|
|
and an <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> node, "nose".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Confect a name for the new object, if that's the bag we're into</span> <span class="cwebmacronumber">8.4.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain"> = </span><span class="identifier">ParseTree::get_implicit_in_creation_of</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">owner</span><span class="plain">) && (</span><span class="identifier">instance_count</span><span class="plain"> == 1) &&</span>
|
|
<span class="plain">((</span><span class="identifier">confect_name_flag</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">)))) {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="functiontext">InferenceSubjects::get_name_text</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">subject_here</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subject_here</span><span class="plain">) {</span>
|
|
<span class="identifier">NW</span><span class="plain"> = </span><span class="functiontext">InferenceSubjects::get_name_text</span><span class="plain">(</span><span class="identifier">subject_here</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">)) && (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) && (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">))) {</span>
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" its "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">);</span>
|
|
<span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">CW</span><span class="plain">)) {</span>
|
|
<span class="identifier">named_after</span><span class="plain"> = </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="identifier">NAW</span><span class="plain"> = </span><span class="identifier">NW</span><span class="plain">;</span>
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">CW</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">third</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">>(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Insert the appropriate possessive</span> <span class="cwebmacronumber">8.4.1.1.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">pronoun</span><span class="plain">>(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Insert the appropriate name</span> <span class="cwebmacronumber">8.4.1.1.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">NOUN_RESOLUTION</span><span class="plain">, </span><span class="string">"Confecting the name: <%W>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8_4_1">§8.4.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4_1_1_1"></a><b>§8.4.1.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Insert the appropriate possessive</span> <span class="cwebmacronumber">8.4.1.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">genitive_form</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::irregular_genitive</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">genitive_form</span><span class="plain">, &</span><span class="identifier">propriety</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="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">) > 1)</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">Wordings::trim_last_word</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">));</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">genitive_form</span><span class="plain">, </span><span class="string">"%+W's "</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">)));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Feeds::feed_stream_expanding_strings</span><span class="plain">(</span><span class="identifier">genitive_form</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">genitive_form</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8_4_1_1">§8.4.1.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4_1_1_2"></a><b>§8.4.1.1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Insert the appropriate name</span> <span class="cwebmacronumber">8.4.1.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8_4_1_1">§8.4.1.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_4_1_2"></a><b>§8.4.1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Check that the new name is non-empty and distinct from all existing ones</span> <span class="cwebmacronumber">8.4.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">))</span>
|
|
<span class="identifier">SW</span><span class="plain"> = </span><span class="functiontext">InferenceSubjects::get_name_text</span><span class="plain">(</span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">instance_kind</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">constant</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">>(</span><span class="identifier">NW</span><span class="plain">)) </span><span class="identifier">SW</span><span class="plain"> = </span><span class="identifier">NW</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">)) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">textual_count</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">textual_count</span><span class="plain">, </span><span class="string">" %d "</span><span class="plain">, ++</span><span class="identifier">name_stubs_count</span><span class="plain">);</span>
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream_expanding_strings</span><span class="plain">(</span><span class="identifier">textual_count</span><span class="plain">);</span>
|
|
<span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">textual_count</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8_4_1">§8.4.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>This is how callings are parsed, both in assertions and conditions: that is,
|
|
names occurring in noun phrases with the shape "blah blah (called the rhubarb
|
|
rhubarb)". (For tedious reasons it would be inefficient to parse the second
|
|
of these using the first.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">ending</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( </span><span class="identifier">called</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> ... ) |</span>
|
|
<span class="plain">... ( </span><span class="identifier">called</span><span class="plain"> ... )</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">including</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( </span><span class="identifier">called</span><span class="plain"> ... ) ***</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>Many names are rejected because they clash unfortunately with other things,
|
|
or for other high-level reasons, but there are also some basic syntactic
|
|
blunders. Most of the time those are caught by the Creator above, but in a few
|
|
cases (declaring new figures, for instance) it's possible to get around
|
|
the standard checks, and in that case problems are picked up here.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><unfortunate-name> is a stricter test than <unsuitable-name>.
|
|
For example, property names can't be unsuitable, but they can be unfortunate.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">article</span><span class="plain">> |</span>
|
|
<span class="plain">*** (/)/{/}/,/./(- *** |</span>
|
|
<span class="plain">*** <</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">> ***</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="reserved">for</span><span class="plain">-</span><span class="identifier">locals</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">> |</span>
|
|
<span class="plain">*** (/)/{/}/,/. *** |</span>
|
|
<span class="plain">*** <</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">> ***</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">unfortunate</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> ::=</span>
|
|
<span class="plain">... </span><span class="identifier">with</span><span class="plain">/</span><span class="identifier">having</span><span class="plain">/</span><span class="identifier">and</span><span class="plain">/</span><span class="identifier">or</span><span class="plain"> ... |</span>
|
|
<span class="plain"><</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">></span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>Which powers:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Creator::vet_name_for_noun</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">unfortunate</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NameBestAvoided</span><span class="plain">),</span>
|
|
<span class="string">"this is a name which is best avoided"</span><span class="plain">,</span>
|
|
<span class="string">"because it would lead to confusion inside Inform. In general, try "</span>
|
|
<span class="string">"to avoid punctuation, quotation marks, or the words 'with' or "</span>
|
|
<span class="string">"'having' in names like this. (Hyphens are fine, so by all means "</span>
|
|
<span class="string">"use a name like 'Church-with-Spire', if that will help.)"</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>
|
|
<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="endnote">The function Assertions::Creator::vet_name_for_noun is used in 3/pd (<a href="3-pd.html#SP2">§2</a>).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="9-rpt.html">Back to 'Refine Parse Tree'</a></li><li><a href="9-ma.html">Continue with 'Make Assertions'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</body>
|
|
</html>
|
|
|