mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
364 lines
47 KiB
HTML
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">★</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">§1. Requesting new named properties</a></li><li><a href="#SP3">§3. Requesting new nameless properties</a></li><li><a href="#SP4">§4. Initialising details</a></li><li><a href="#SP5">§5. Details</a></li><li><a href="#SP10">§10. Assertion</a></li><li><a href="#SP11">§11. Compilation</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§8</a>), 9/ma (<a href="9-ma.html#SP3_3_13">§3.3.13</a>, <a href="9-ma.html#SP3_3_26">§3.3.26</a>), 9/pd (<a href="9-pd.html#SP6_1">§6.1</a>), 15/cp (<a href="15-cp.html#SP3">§3</a>), 19/tod (<a href="19-tod.html#SP6_4_1">§6.4.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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"> (<</span><span class="reserved">property</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">prn</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</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">>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>
|
|
<<span class="cwebmacro">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-</span><span class="element">>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>
|
|
<<span class="cwebmacro">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.1</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">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">>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">§9.3.8</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue an incompatible property kind message</span> <span class="cwebmacronumber">2.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_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">§2</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">§12.1</a>, <a href="16-ic.html#SP12_2">§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">§12.2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§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">>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">>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">>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">>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">>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">§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">§4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§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">>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">>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">>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">) && (</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">>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">>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">>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">§11</a>, 5/ins (<a href="5-ins.html#SP10">§10</a>), 9/tc (<a href="9-tc.html#SP4_5">§4.5</a>), 9/ma (<a href="9-ma.html#SP3_3_25">§3.3.25</a>, <a href="9-ma.html#SP3_3_41_7">§3.3.41.7</a>), 9/pk (<a href="9-pk.html#SP4">§4</a>), 9/pd (<a href="9-pd.html#SP5_11">§5.11</a>, <a href="9-pd.html#SP7_1">§7.1</a>), 11/tc (<a href="11-tc.html#SP7_1">§7.1</a>), 11/sc (<a href="11-sc.html#SP3_3">§3.3</a>), 14/rv (<a href="14-rv.html#SP23_3">§23.3</a>), 14/lv (<a href="14-lv.html#SP10">§10</a>, <a href="14-lv.html#SP12_5">§12.5</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_2_1">§11.9.1.1.2.1</a>, <a href="14-ds2.html#SP11_9_1_1_3_1_1">§11.9.1.1.3.1.1</a>, <a href="14-ds2.html#SP13">§13</a>, <a href="14-ds2.html#SP19_3_1">§19.3.1</a>), 15/pr (<a href="15-pr.html#SP15">§15</a>), 15/ma (<a href="15-ma.html#SP8_2">§8.2</a>), 15/spr2 (<a href="15-spr2.html#SP8">§8</a>, <a href="15-spr2.html#SP9">§9</a>), 15/epv (<a href="15-epv.html#SP1_1_4">§1.1.4</a>), 16/in (<a href="16-in.html#SP14">§14</a>, <a href="16-in.html#SP16">§16</a>), 19/tod (<a href="19-tod.html#SP6_4_1">§6.4.1</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_11">§3.1.1.4.11</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Valued::set_kind is used in <a href="#SP6">§6</a>, 6/rlt (<a href="6-rlt.html#SP9_3_8">§9.3.8</a>, <a href="6-rlt.html#SP9_12">§9.12</a>), 9/pd (<a href="9-pd.html#SP7_1">§7.1</a>), 15/pr (<a href="15-pr.html#SP5_6">§5.6</a>), 19/tod (<a href="19-tod.html#SP6_4_1">§6.4.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">>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">>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">>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">§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">§9.7.3</a>), 9/tc (<a href="9-tc.html#SP4_5">§4.5</a>), 9/ma (<a href="9-ma.html#SP3_3_25">§3.3.25</a>, <a href="9-ma.html#SP3_3_41_7">§3.3.41.7</a>), 11/sc (<a href="11-sc.html#SP3_3">§3.3</a>), 14/ds2 (<a href="14-ds2.html#SP11_9_1_1_3_1_1">§11.9.1.1.3.1.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§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">>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">>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">§4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">>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">>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">>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">>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">§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">§10.1.1.3.1.3</a>), 16/in (<a href="16-in.html#SP20_3_3">§20.3.3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§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">>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">>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">>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">>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">§9.3.8</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Valued::is_used_for_non_typesafe_relation is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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">§26.1</a>), 9/tc (<a href="9-tc.html#SP5_4_1_1">§5.4.1.1</a>), 15/ia (<a href="15-ia.html#SP1">§1</a>, <a href="15-ia.html#SP2">§2</a>), 16/ic (<a href="16-ic.html#SP12_1">§12.1</a>, <a href="16-ic.html#SP12_3_1">§12.3.1</a>, <a href="16-ic.html#SP12_3_2">§12.3.2</a>, <a href="16-ic.html#SP12_3_3">§12.3.3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§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">>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">>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">§26</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Valued::compile_default_value is used in 15/pr (<a href="15-pr.html#SP25">§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>
|
|
|