1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/15-ia.html
2019-04-22 15:42:10 +01:00

128 lines
11 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>15/cp</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 '15/ia' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Indefinite Appearance</b></li></ul><p class="purpose">To look after the indefinite appearance pseudo-property, used when the source text comments on something with a sentence consisting only of a double-quoted literal text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Inference</a></li><li><a href="#SP2">&#167;2. Reallocation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Inference. </b>The "indefinite appearance text" is a property given to something by the
A-parser when it appears as a double-quoted sentence with no other explanation.
For instance:
</p>
<blockquote>
<p>The drapery is in the Crypt. "The drapery hangs, poignantly waiting to fall."</p>
</blockquote>
<p class="inwebparagraph">This text will probably become a property of the drapery, but which property
depends on the drapery's kind. That means we can't decide until after the
source text is fully read, because we won't be certain of kinds until then.
So as an interim measure the text is inferred into a pseudo-property called
"indefinite appearance".
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Appearance::infer</span><span class="plain">(</span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</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="reserved">inference</span><span class="plain"> *</span><span class="identifier">inf</span><span class="plain">;</span>
<span class="identifier">KNOWLEDGE_LOOP</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="constant">PROPERTY_INF</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">World::Inferences::get_property</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">) == </span><span class="identifier">P_indefinite_appearance_text</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a problem for a second appearance</span> <span class="cwebmacronumber">1.1</span>&gt;<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="functiontext">InferenceSubjects::domain</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_within</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">, </span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">))))</span>
<span class="identifier">prevailing_mood</span><span class="plain"> = </span><span class="identifier">LIKELY_CE</span><span class="plain">;</span>
<span class="functiontext">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_indefinite_appearance_text</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Appearance::infer is used in 9/tfa (<a href="9-tfa.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>...but we produce a firm and explicit problem message if somebody sets it
ambiguously.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem for a second appearance</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Problems::Issue::infs_contradiction_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TwoAppearances</span><span class="plain">),</span>
<span class="functiontext">World::Inferences::where_inferred</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">), </span><span class="identifier">current_sentence</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">,</span>
<span class="string">"seems to have two different descriptions"</span><span class="plain">,</span>
<span class="string">"perhaps because you intended the second description to apply to something "</span>
<span class="string">"mentioned in between, but declared it in such a way that it was never the "</span>
<span class="string">"subject of an assertion. For instance, 'The Forest Clearing is northeast of "</span>
<span class="string">"the Woods.' makes the Forest Clearing the current room being discussed, but "</span>
<span class="string">"'Northeast of the Woods is the Forest Clearing.' leaves the room under "</span>
<span class="string">"discussion unchanged, because the Forest Clearing is not the subject of "</span>
<span class="string">"the sentence."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Reallocation. </b>Later, then, during model completion, we will have to make those decisions
about what property the indefinite appearance text should go into. This is
called "reallocation", and as can be seen the method is:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) See if any plugin wants to take action;
</li><li>(b) And otherwise reallocate to the "description" property, if that is
available;
</li><li>(c) But otherwise give up and issue a problem message.
</li></ul>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Appearance::reallocate</span><span class="plain">(</span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="reserved">inference</span><span class="plain"> *</span><span class="identifier">inf</span><span class="plain">;</span>
<span class="identifier">KNOWLEDGE_LOOP</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="constant">PROPERTY_INF</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">World::Inferences::get_property</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">) == </span><span class="identifier">P_indefinite_appearance_text</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">txt</span><span class="plain"> = </span><span class="functiontext">World::Inferences::get_property_value</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">);</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="functiontext">World::Inferences::where_inferred</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::default_appearance</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">, </span><span class="identifier">txt</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">P_description</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">World::Permissions::find</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">, </span><span class="identifier">P_description</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">))) {</span>
<span class="functiontext">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_description</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Problems::Issue::inference_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_IndefiniteTextMeaningless</span><span class="plain">),</span>
<span class="identifier">infs</span><span class="plain">, </span><span class="identifier">inf</span><span class="plain">, </span><span class="string">"is not allowed"</span><span class="plain">,</span>
<span class="string">"i.e., you can't write a double-quoted piece of text as a "</span>
<span class="string">"sentence all by itself here. Some kinds or kinds of value "</span>
<span class="string">"are allowed this - objects and scenes, for instance - but "</span>
<span class="string">"most are not. (They would need to provide a 'description' "</span>
<span class="string">"property.)"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Appearance::reallocate is used in 16/cmw (<a href="16-cmw.html#SP1_1">&#167;1.1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="15-cp.html">Back to 'Condition Properties'</a></li><li><a href="15-tpr.html">Continue with 'The Provision Relation'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>