1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/15-vp.html
2019-08-24 11:21:48 +01:00

364 lines
47 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>15/ep</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/vp' 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>Valued Properties</b></li></ul><p class="purpose">Properties which consist of an attached value, always having a given kind.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Requesting new named properties</a></li><li><a href="#SP3">&#167;3. Requesting new nameless properties</a></li><li><a href="#SP4">&#167;4. Initialising details</a></li><li><a href="#SP5">&#167;5. Details</a></li><li><a href="#SP10">&#167;10. Assertion</a></li><li><a href="#SP11">&#167;11. Compilation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Requesting new named properties. </b>The following asserts that <code class="display"><span class="extract">(w1, w2)</span></code> is certainly a property; if it does not
exist, it will be created.
</p>
<pre class="display">
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::obtain</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">return</span><span class="plain"> </span><span class="functiontext">Properties::obtain</span><span class="plain">(</span><span class="identifier">W</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 Properties::Valued::obtain is used in 7/oaf (<a href="7-oaf.html#SP8">&#167;8</a>), 9/ma (<a href="9-ma.html#SP3_3_13">&#167;3.3.13</a>, <a href="9-ma.html#SP3_3_26">&#167;3.3.26</a>), 9/pd (<a href="9-pd.html#SP6_1">&#167;6.1</a>), 15/cp (<a href="15-cp.html#SP3">&#167;3</a>), 19/tod (<a href="19-tod.html#SP6_4_1">&#167;6.4.1</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Now the same: except that we require the property to have a given kind of
value, so that the process can go awry. (But we are allowed to avoid this
possibility by widening the kind, when this can be done.)
</p>
<pre class="display">
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::obtain_within_kind</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="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">Kinds::weaken</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">prn</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">existing_kind</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">existing_kind</span><span class="plain">)) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SOMETIMES_MATCH</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">existing_kind</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">) != </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">; </span> <span class="comment">widen the kind of the property to make this fit</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEVER_MATCH</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::obtain</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</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">The function Properties::Valued::obtain_within_kind is used in 6/rlt (<a href="6-rlt.html#SP9_3_8">&#167;9.3.8</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.1</span>&gt; =
</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_BadKOVForRelationProperty</span><span class="plain">),</span>
<span class="string">"that property already exists and contains a kind of value incompatible with "</span>
<span class="string">"what we need here"</span><span class="plain">,</span>
<span class="string">"so you will need to give it a different name."</span><span class="plain">);</span>
<span class="reserved">return</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="#SP2">&#167;2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Requesting new nameless properties. </b>Sometimes we will want a property which exists at run-time but which
has no name or visible existence at the Inform source text level. For
instance, the run-time code needs a property called <code class="display"><span class="extract">vector</span></code> in which to
store partial results when finding routes through maps, but <code class="display"><span class="extract">vector</span></code> is
nameless in the source text, unrecorded in the Index, and generally invisible
to the end user.
</p>
<p class="inwebparagraph">Core Inform creates no such properties, but many of the plugins do.
</p>
<pre class="display">
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::new_nameless</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">I6_form</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">I6_form</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"new nameless property without kind"</span><span class="plain">);</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Hierarchy::synoptic_package</span><span class="plain">(</span><span class="constant">PROPERTIES_HAP</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="constant">PROPERTY_NAME_HMD</span><span class="plain">, </span><span class="identifier">I6_form</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">using_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">PROPERTY_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">W</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">Properties::create</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">using_iname</span><span class="plain">);</span>
<span class="functiontext">Properties::exclude_from_index</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="functiontext">Properties::set_translation_S</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">I6_form</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;setting_bp</span><span class="plain"> = </span><span class="functiontext">Properties::SettingRelations::make_set_nameless_property_BP</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;stored_bp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;run_time_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::new_nameless_using</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">using</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"new nameless property without kind"</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">Properties::create</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">using</span><span class="plain">);</span>
<span class="functiontext">Properties::exclude_from_index</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;setting_bp</span><span class="plain"> = </span><span class="functiontext">Properties::SettingRelations::make_set_nameless_property_BP</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;stored_bp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;run_time_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Properties::set_translation_S</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="functiontext">Emit::to_text</span><span class="plain">(</span><span class="identifier">using</span><span class="plain">));</span>
<span class="reserved">return</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">The function Properties::Valued::new_nameless is used in 16/ic (<a href="16-ic.html#SP12_1">&#167;12.1</a>, <a href="16-ic.html#SP12_2">&#167;12.2</a>).</p>
<p class="endnote">The function Properties::Valued::new_nameless_using is used in 16/ic (<a href="16-ic.html#SP12_2">&#167;12.2</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Initialising details. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::initialise</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="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;setting_bp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;used_for_non_typesafe_relation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;also_a_type</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="functiontext">Properties::Conditions::initialise</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::make_setting_relation</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="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">Properties::SettingRelations::find_set_property_BP</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">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">Properties::SettingRelations::make_set_property_BP</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Properties::SettingRelations::fix_property_bp</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">);</span>
<span class="functiontext">Properties::SettingRelations::fix_property_bp</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">prn</span><span class="plain">-</span><span class="element">&gt;setting_bp</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::initialise is used in 15/pr (<a href="15-pr.html#SP5_3">&#167;5.3</a>).</p>
<p class="endnote">The function Properties::Valued::make_setting_relation is used in 15/pr (<a href="15-pr.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Details. </b>The most important fact about a valued property is what the kind of value is:
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::kind</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</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="comment">for better type-checking Problems</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::set_kind</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="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to set null kind"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</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">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;do_not_compile</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(1, </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_kind</span><span class="plain">(2, </span><span class="identifier">K</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_PropertyIndefinite</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_sentence</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(3, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In the sentence %3, I am unable to create the property '%1', because "</span>
<span class="string">"it has too vague a kind ('%2'). I need to know exactly what kind of "</span>
<span class="string">"value goes into each property: for instance, it's not enough to say "</span>
<span class="string">"'A door has a list of values called the access list', because I don't "</span>
<span class="string">"know what the entries in this list would have to be - 'A door has a "</span>
<span class="string">"list of people called the access list' would be better."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I am unable to create the property '%1', because it has too vague "</span>
<span class="string">"a kind ('%2'). I need to know exactly what kind of value goes into each "</span>
<span class="string">"property: for instance, it's not enough to say 'A door has a list of values "</span>
<span class="string">"called the access list', because I don't know what the entries in this "</span>
<span class="string">"list would have to be - 'A door has a list of people called the access "</span>
<span class="string">"list' would be better."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;property_value_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::kind is used in <a href="#SP11">&#167;11</a>, 5/ins (<a href="5-ins.html#SP10">&#167;10</a>), 9/tc (<a href="9-tc.html#SP4_5">&#167;4.5</a>), 9/ma (<a href="9-ma.html#SP3_3_25">&#167;3.3.25</a>, <a href="9-ma.html#SP3_3_41_7">&#167;3.3.41.7</a>), 9/pk (<a href="9-pk.html#SP4">&#167;4</a>), 9/pd (<a href="9-pd.html#SP5_11">&#167;5.11</a>, <a href="9-pd.html#SP7_1">&#167;7.1</a>), 11/tc (<a href="11-tc.html#SP7_1">&#167;7.1</a>), 11/sc (<a href="11-sc.html#SP3_3">&#167;3.3</a>), 14/rv (<a href="14-rv.html#SP23_3">&#167;23.3</a>), 14/lv (<a href="14-lv.html#SP10">&#167;10</a>, <a href="14-lv.html#SP12_5">&#167;12.5</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_2_1">&#167;11.9.1.1.2.1</a>, <a href="14-ds2.html#SP11_9_1_1_3_1_1">&#167;11.9.1.1.3.1.1</a>, <a href="14-ds2.html#SP13">&#167;13</a>, <a href="14-ds2.html#SP19_3_1">&#167;19.3.1</a>), 15/pr (<a href="15-pr.html#SP15">&#167;15</a>), 15/ma (<a href="15-ma.html#SP8_2">&#167;8.2</a>), 15/spr2 (<a href="15-spr2.html#SP8">&#167;8</a>, <a href="15-spr2.html#SP9">&#167;9</a>), 15/epv (<a href="15-epv.html#SP1_1_4">&#167;1.1.4</a>), 16/in (<a href="16-in.html#SP14">&#167;14</a>, <a href="16-in.html#SP16">&#167;16</a>), 19/tod (<a href="19-tod.html#SP6_4_1">&#167;6.4.1</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_11">&#167;3.1.1.4.11</a>).</p>
<p class="endnote">The function Properties::Valued::set_kind is used in <a href="#SP6">&#167;6</a>, 6/rlt (<a href="6-rlt.html#SP9_3_8">&#167;9.3.8</a>, <a href="6-rlt.html#SP9_12">&#167;9.12</a>), 9/pd (<a href="9-pd.html#SP7_1">&#167;7.1</a>), 15/pr (<a href="15-pr.html#SP5_6">&#167;5.6</a>), 19/tod (<a href="19-tod.html#SP6_4_1">&#167;6.4.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Sometimes the name of a property is the same as that of a kind of value.
For instance, we might define a kind of value called "weight", and
then say that a thing has a weight: that makes a property also called
"weight", which is a value property whose value is always a weight.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::make_coincide_with_kind</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="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="functiontext">Properties::Valued::set_kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_grammatical_gender</span><span class="plain">)) </span><span class="identifier">P_grammatical_gender</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;also_a_type</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Properties::Conditions::name_can_coincide_with_property</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">))</span>
<span class="functiontext">Instances::make_kind_coincident</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Valued::coincides_with_kind</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;also_a_type</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::make_coincide_with_kind is used in 15/pr (<a href="15-pr.html#SP5_4">&#167;5.4</a>).</p>
<p class="endnote">The function Properties::Valued::coincides_with_kind is used in 9/rpt (<a href="9-rpt.html#SP9_7_3">&#167;9.7.3</a>), 9/tc (<a href="9-tc.html#SP4_5">&#167;4.5</a>), 9/ma (<a href="9-ma.html#SP3_3_25">&#167;3.3.25</a>, <a href="9-ma.html#SP3_3_41_7">&#167;3.3.41.7</a>), 11/sc (<a href="11-sc.html#SP3_3">&#167;3.3</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_3_1_1">&#167;11.9.1.1.3.1.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Every valued property has an associated relation to set its value.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::get_setting_bp</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;setting_bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::get_setting_bp is used in 11/tc (<a href="11-tc.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Some value properties are used for relation storage:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::set_stored_relation</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="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;stored_bp</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::Valued::get_stored_relation</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;stored_bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::set_stored_relation is used in 6/rlt (<a href="6-rlt.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Properties::Valued::get_stored_relation is used in 14/ds2 (<a href="14-ds2.html#SP10_1_1_3_1_3">&#167;10.1.1.3.1.3</a>), 16/in (<a href="16-in.html#SP20_3_3">&#167;20.3.3</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>When a property is used to store certain forms of relation, it then needs
to store either a value within one of the domains, or else a null value used
to mean "this is not set at the moment". Since that null value isn't
a member of the domain, it follows that the property is breaking type safety
when it stores it. This means we need to relax typechecking to enable this
all to work; the following keep a flag to mark that.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::now_used_for_non_typesafe_relation</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;used_for_non_typesafe_relation</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Valued::is_used_for_non_typesafe_relation</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"non-value property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;used_for_non_typesafe_relation</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::now_used_for_non_typesafe_relation is used in 6/rlt (<a href="6-rlt.html#SP9_3_8">&#167;9.3.8</a>).</p>
<p class="endnote">The function Properties::Valued::is_used_for_non_typesafe_relation is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Assertion. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::assert</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="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">owner</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="reserved">int</span><span class="plain"> </span><span class="identifier">certainty</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_set_property</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="functiontext">Calculus::Propositions::Assert::assert_true_about</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">certainty</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::assert is used in 6/rlt (<a href="6-rlt.html#SP26_1">&#167;26.1</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">&#167;5.4.1.1</a>), 15/ia (<a href="15-ia.html#SP1">&#167;1</a>, <a href="15-ia.html#SP2">&#167;2</a>), 16/ic (<a href="16-ic.html#SP12_1">&#167;12.1</a>, <a href="16-ic.html#SP12_3_1">&#167;12.3.1</a>, <a href="16-ic.html#SP12_3_2">&#167;12.3.2</a>, <a href="16-ic.html#SP12_3_3">&#167;12.3.3</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Compilation. </b>When we compile the value of a valued property, the following is called.
In theory the result could depend on the property name; in practice it doesn't.
(But this would enable us to implement certain properties with different
storage methods at run-time if we wanted.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::compile_value</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</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="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) </span><span class="functiontext">Specifications::Compiler::compile_constant_to_kind_vh</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="constant">DEREFERENCE_POINTERS_CMODE</span><span class="plain">);</span>
<span class="functiontext">Specifications::Compiler::compile_inner</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="constant">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Valued::compile_default_value</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</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="reserved">if</span><span class="plain"> (</span><span class="functiontext">Properties::Valued::is_used_for_non_typesafe_relation</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Holsters::data_acceptable</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">))</span>
<span class="identifier">Holsters::holster_pair</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Kinds::RunTime::compile_default_value_vh</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="string">"property"</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(1, </span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</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_PropertyUninitialisable</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"I am unable to put any value into the property '%1', because "</span>
<span class="string">"it seems to have a kind of value which has no actual values."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Valued::compile_value is used in 15/pr (<a href="15-pr.html#SP26">&#167;26</a>).</p>
<p class="endnote">The function Properties::Valued::compile_default_value is used in 15/pr (<a href="15-pr.html#SP25">&#167;25</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="15-ep.html">Back to 'Either-Or Properties'</a></li><li><a href="15-cp.html">Continue with 'Condition Properties'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>