mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
1053 lines
145 KiB
HTML
1053 lines
145 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Properties</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Properties' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Properties</b></li></ul><p class="purpose">Elements of the model world, such as objects, have properties associated with them. Here we look after the identities of these different properties.</p>
|
|
|
|
<ul class="toc"><li><a href="15-pr.html#SP1">§1. Definitions</a></li><li><a href="15-pr.html#SP4">§4. Creation</a></li><li><a href="15-pr.html#SP6">§6. As kinds</a></li><li><a href="15-pr.html#SP8">§8. Parsing property names</a></li><li><a href="15-pr.html#SP14">§14. Permissions</a></li><li><a href="15-pr.html#SP15">§15. Logging</a></li><li><a href="15-pr.html#SP16">§16. Access to details</a></li><li><a href="15-pr.html#SP21">§21. Translated names of properties</a></li><li><a href="15-pr.html#SP23">§23. Traversing properties</a></li><li><a href="15-pr.html#SP25">§25. Compiling property values</a></li><li><a href="15-pr.html#SP27">§27. Emitting to Inter</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The English word "property" is a little vague. It can mean a particular
|
|
property of a given thing — say, the weight of a car — or it
|
|
can mean the measurement in general terms as applied to a range of
|
|
things — say, the notion of weight.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">When we need to distinguish these, we'll call the latter a "property name".
|
|
In this and the following sections we will lay down the foundations for
|
|
knowledge about things by establishing how property names are created,
|
|
what makes some property names unlike others, and so on.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">They are divided into two groups: the either/or properties, which something
|
|
either has or doesn't have, such as "closed"; and the valued properties,
|
|
which something has in degrees or in different flavours, such as "carrying
|
|
capacity" or "colour". (These are called "valued" because they associate
|
|
a value with the owner; it isn't that either/or properties are unloved.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">property</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">name</span><span class="plain">; </span><span class="comment"> name of property</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ambiguous_name</span><span class="plain">; </span><span class="comment"> does this look like a property test, e.g., "point of view"?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">compilation_module</span><span class="plain"> *</span><span class="identifier">owning_module</span><span class="plain">; </span><span class="comment"> where defined</span>
|
|
|
|
<span class="comment"> the basic nature of this property</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">either_or</span><span class="plain">; </span><span class="comment"> is this an either/or property? if not, it is a valued one</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">property_permission</span><span class="plain"> *</span><span class="identifier">applicable_to</span><span class="plain">; </span><span class="comment"> lists who has permission to have this</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">do_not_compile</span><span class="plain">; </span><span class="comment"> for e.g. the "specification" pseudo-property</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">include_in_index</span><span class="plain">; </span><span class="comment"> is this property shown in the indexes?</span>
|
|
|
|
<span class="comment"> runtime implementation</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">metadata_table_offset</span><span class="plain">; </span><span class="comment"> position in the <code class="display"><span class="extract">property_metadata</span></code> word array at run-time</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">prop_package</span><span class="plain">; </span><span class="comment"> where to find:</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">prop_iname</span><span class="plain">; </span><span class="comment"> the identifier we would like to use at run-time for this property</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">translated</span><span class="plain">; </span><span class="comment"> has this been given an explicit translation?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">prn_emitted</span><span class="plain">; </span><span class="comment"> has this been emitted to Inter yet?</span>
|
|
|
|
<span class="comment"> temporary use only</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">indexed_already</span><span class="plain">; </span><span class="comment"> and has it been, thus far in index construction?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">visited_on_traverse</span><span class="plain">; </span><span class="comment"> for temporary use when compiling objects</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">possession_marker</span><span class="plain"> </span><span class="identifier">pom</span><span class="plain">; </span><span class="comment"> for temporary use when checking implications</span>
|
|
|
|
<span class="comment"> used only for either-or properties</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">implemented_as_attribute</span><span class="plain">; </span><span class="comment"> if so: is it an I6 attribute at run-time?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">property</span><span class="plain"> *</span><span class="identifier">negation</span><span class="plain">; </span><span class="comment"> and which property name (if any) negates it?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stored_in_negation</span><span class="plain">; </span><span class="comment"> this is the dummy half of an either/or pair</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">adjectival_meaning_registered</span><span class="plain">; </span><span class="comment"> and has it been made an adjective yet?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">adjectival_phrase_registered</span><span class="plain">; </span><span class="comment"> similarly</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">grammar_verb</span><span class="plain"> *</span><span class="identifier">eo_parsing_grammar</span><span class="plain">; </span><span class="comment"> exotic forms used in parsing</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
|
|
<span class="comment"> used only for valued properties</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">property_value_kind</span><span class="plain">; </span><span class="comment"> if not either/or, what kind of value does it hold?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">setting_bp</span><span class="plain">; </span><span class="comment"> and which relation sets it?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">stored_bp</span><span class="plain">; </span><span class="comment"> does it store the content of a relation?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">used_for_non_typesafe_relation</span><span class="plain">; </span><span class="comment"> expressing, e.g., a 1-1 relation to a kind</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">also_a_type</span><span class="plain">; </span><span class="comment"> and is its name the same as that of the kind of value?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">run_time_only</span><span class="plain">; </span><span class="comment"> does not correspond to an I7 property</span>
|
|
|
|
<span class="comment"> used only for condition properties, a special kind of valued properties</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">condition_of</span><span class="plain">; </span><span class="comment"> or is it a condition of an object?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">condition_anonymously_named</span><span class="plain">; </span><span class="comment"> if so, is it named just "... condition"?</span>
|
|
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">property</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure property is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/ep, 15/vp, 15/cp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 26/uo, 26/ts and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The only four properties which have special significance to core Inform
|
|
(though plugins are interested in many others):
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">P_specification</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> a pseudo-property for indexing kinds</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">P_variable_initial_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> a pseudo-property for initialising variables</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">P_indefinite_appearance_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">P_description</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> a text property for holding annotations</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">P_grammatical_gender</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> a value property describing names</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Creation. </b>We have two basic operations: (1) To find the structure corresponding to a
|
|
given textual name, creating it afresh if necessary. If we do obtain an
|
|
existing one, we need to make absolutely certain that we aren't using an
|
|
either/or property where a valued property is wanted, or vice versa.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::obtain<button class="popup" onclick="togglePopup('usagePopup1092')">...<span class="popuptext" id="usagePopup1092">Usage of <b>Properties::obtain</b>:<br>Either-Or Properties - <a href="15-ep.html#SP3">§3</a><br>Valued Properties - <a href="15-vp.html#SP1">§1</a>, <a href="15-vp.html#SP2">§2</a></span></button></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">int</span><span class="plain"> </span><span class="identifier">valued</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="constant">PROPERTY_MC</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="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext"><a href="15-pr.html#SP5">Properties::create</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NULL</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">valued</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP4">Properties::Valued::make_setting_relation</a></span><span class="plain">(</span><span class="identifier">prn</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="element">either_or</span><span class="plain"> = </span><span class="identifier">FALSE</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="element">either_or</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext"><a href="14-rv.html#SP2">Rvalues::to_property</a></span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">valued</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">"either/or property made into valued"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">valued</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">either_or</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"valued property made into either/or"</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="inwebparagraph"><a id="SP5"></a><b>§5. </b>And: (2) To create a new structure outright.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::create<button class="popup" onclick="togglePopup('usagePopup1093')">...<span class="popuptext" id="usagePopup1093">Usage of <b>Properties::create</b>:<br><a href="15-pr.html#SP4">§4</a>, Either-Or Properties - <a href="15-ep.html#SP4">§4</a><br>Valued Properties - <a href="15-vp.html#SP3">§3</a></span></button></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">package_request</span><span class="plain"> *</span><span class="identifier">using_package</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="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_article</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Ensure that the new property name is one we can live with</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">See if the property name already has a meaning, which may or may not be okay</span> <span class="cwebmacronumber">5.2</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">CREATE</span><span class="plain">(</span><span class="reserved">property</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Initialise the property name structure</span> <span class="cwebmacronumber">5.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Does the new property have the same name as a kind of value?</span> <span class="cwebmacronumber">5.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Note the significance of this property, if it needs compiler support</span> <span class="cwebmacronumber">5.6</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><<span class="cwebmacro">Register the property name as a noun</span> <span class="cwebmacronumber">5.8</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="15-pr.html#SP18">Properties::exclude_from_index</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PROPERTY_CREATIONS</span><span class="plain">, </span><span class="string">"Created property: $Y\n"</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Ensure that the new property name is one we can live with</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unfortunate</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((<</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) && (<<</span><span class="identifier">rp</span><span class="plain">>> == </span><span class="identifier">K_value</span><span class="plain">)) {</span>
|
|
<span class="identifier">unfortunate</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">),</span>
|
|
<span class="string">"the single word 'value' cannot be used as the name of a property"</span><span class="plain">,</span>
|
|
<span class="string">"because it has a much broader meaning already. Inform uses the "</span>
|
|
<span class="string">"word 'value' to mean any number, time of day, name of something, "</span>
|
|
<span class="string">"etcetera: and because of that very broadness, Inform cannot decide "</span>
|
|
<span class="string">"what kind of value a simple 'value' might be. So 'A door has "</span>
|
|
<span class="string">"a value' is not allowed; but 'A door has a number called the "</span>
|
|
<span class="string">"room number' would be fine."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) > </span><span class="identifier">MAX_WORDS_IN_ASSEMBLAGE</span><span class="plain">-2) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PropertyNameTooLong</span><span class="plain">),</span>
|
|
<span class="string">"this is too long a name for a single property to have"</span><span class="plain">,</span>
|
|
<span class="string">"and would become unwieldy."</span><span class="plain">);</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::truncate</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">MAX_WORDS_IN_ASSEMBLAGE</span><span class="plain">-2);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">unfortunate</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PropertyNameUnsuitable</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to create a new property called '%2', but "</span>
|
|
<span class="string">"this is not a good name, and I think I must have misread what "</span>
|
|
<span class="string">"you wanted. Maybe the punctuation is wrong?"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">unfortunate</span><span class="plain">) </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"problem recovery name"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b>Name clashes between properties and other constructs are surprisingly often
|
|
unproblematic, so we won't reject a name just because it already means
|
|
something.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">See if the property name already has a meaning, which may or may not be okay</span> <span class="cwebmacronumber">5.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">-</span><span class="identifier">or</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">okay</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="14-sp.html#SP2">Specifications::is_kind_like</a></span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) </span><span class="identifier">okay</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"><a href="14-rv.html#SP19">Rvalues::is_CONSTANT_construction</a></span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">CON_table_column</span><span class="plain">)) </span><span class="identifier">okay</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"><a href="14-rv.html#SP19">Rvalues::is_CONSTANT_construction</a></span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">CON_property</span><span class="plain">)) </span><span class="identifier">okay</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"><a href="14-sp.html#SP3">Specifications::is_description</a></span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) </span><span class="identifier">okay</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">NONLOCAL_VARIABLE_NT</span><span class="plain">)) </span><span class="identifier">okay</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">okay</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Existing meaning: $P"</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-sq.html#SP4">Problems::quote_kind_of</a></span><span class="plain">(3, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PropertyNameClash</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"You wrote %1, but '%2' is not free to be the name of a fresh "</span>
|
|
<span class="string">"property: it already has a meaning (as %3)."</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">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_3"></a><b>§5.3. </b>So by this point the new property will be allowed.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">UNSET_TABLE_OFFSET</span><span class="plain"> -654321</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Initialise the property name structure</span> <span class="cwebmacronumber">5.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">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="element">owning_module</span><span class="plain"> = </span><span class="functiontext"><a href="27-cm.html#SP5">Modules::find</a></span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">ambiguous_name</span><span class="plain"> = <</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">looking</span><span class="plain">-</span><span class="identifier">like</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">test</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="element">applicable_to</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">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_package</span><span class="plain"> = </span><span class="identifier">using_package</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_iname</span><span class="plain"> = </span><span class="identifier">using_iname</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">prn_emitted</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">translated</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">prn</span><span class="plain">-></span><span class="element">indexed_already</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">visited_on_traverse</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">include_in_index</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">metadata_table_offset</span><span class="plain"> = </span><span class="constant">UNSET_TABLE_OFFSET</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">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="15-ep.html#SP5">Properties::EitherOr::initialise</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP4">Properties::Valued::initialise</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4"></a><b>§5.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Does the new property have the same name as a kind of value?</span> <span class="cwebmacronumber">5.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">))</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP6">Properties::Valued::make_coincide_with_kind</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, <<</span><span class="identifier">rp</span><span class="plain">>>);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_5"></a><b>§5.5. </b>This is a collection of the English names of some properties which have
|
|
special significance to Inform. Each one is recognised as it is created
|
|
by the Standard Rules (which are in English, so there's no need to translate
|
|
this to any other language).
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">> ::=</span>
|
|
<span class="identifier">description</span><span class="plain"> |</span>
|
|
<span class="identifier">specification</span><span class="plain"> |</span>
|
|
<span class="identifier">indefinite</span><span class="plain"> </span><span class="identifier">appearance</span><span class="plain"> </span><span class="identifier">text</span><span class="plain"> |</span>
|
|
<span class="identifier">variable</span><span class="plain"> </span><span class="identifier">initial</span><span class="plain"> </span><span class="identifier">value</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_6"></a><b>§5.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Note the significance of this property, if it needs compiler support</span> <span class="cwebmacronumber">5.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>>) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">P_description</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">P_specification</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP5">Properties::Valued::set_kind</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">K_text</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">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">include_in_index</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="16-pp.html#SP9">World::Permissions::grant</a></span><span class="plain">(</span><span class="identifier">model_world</span><span class="plain">, </span><span class="identifier">P_specification</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">P_indefinite_appearance_text</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP5">Properties::Valued::set_kind</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">K_text</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">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">include_in_index</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="16-pp.html#SP9">World::Permissions::grant</a></span><span class="plain">(</span><span class="identifier">global_constants</span><span class="plain">,</span>
|
|
<span class="identifier">P_indefinite_appearance_text</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="identifier">P_variable_initial_value</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">do_not_compile</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP5">Properties::Valued::set_kind</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">include_in_index</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="16-pp.html#SP9">World::Permissions::grant</a></span><span class="plain">(</span><span class="identifier">nonlocal_variables</span><span class="plain">, </span><span class="identifier">P_variable_initial_value</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="26-pc.html#SP6">Plugins::Call::new_property_notify</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_7"></a><b>§5.7. </b>To clarify their meanings as nouns, the word "property" can be prepended;
|
|
thus "the property open", for instance. We achieve this by registering the
|
|
name in both forms. The following grammar is used to construct this prefix.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<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">construction</span><span class="plain">> ::=</span>
|
|
<span class="reserved">property</span><span class="plain"> ...</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_8"></a><b>§5.8. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Register the property name as a noun</span> <span class="cwebmacronumber">5.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
|
|
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
|
|
<span class="constant">PROPERTY_MC</span><span class="plain">, </span><span class="functiontext"><a href="14-rv.html#SP1">Rvalues::from_property</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> =</span>
|
|
<span class="identifier">Preform::Nonparsing::merge</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">construction</span><span class="plain">>, </span><span class="constant">0</span><span class="plain">,</span>
|
|
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">WordAssemblages::to_wording</span><span class="plain">(&</span><span class="identifier">wa</span><span class="plain">);</span>
|
|
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
|
|
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
|
|
<span class="constant">PROPERTY_MC</span><span class="plain">, </span><span class="functiontext"><a href="14-rv.html#SP1">Rvalues::from_property</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. As kinds. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Properties::to_kind<button class="popup" onclick="togglePopup('usagePopup1094')">...<span class="popuptext" id="usagePopup1094">Usage of <b>Properties::to_kind</b>:<br>RValues - <a href="14-rv.html#SP1">§1</a></span></button></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">internal_error</span><span class="plain">(</span><span class="string">"took kind of null property"</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">stored</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">if</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">stored</span><span class="plain"> = </span><span class="identifier">K_truth_state</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::unary_construction</span><span class="plain">(</span><span class="identifier">CON_property</span><span class="plain">, </span><span class="identifier">stored</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Properties::get_name<button class="popup" onclick="togglePopup('usagePopup1095')">...<span class="popuptext" id="usagePopup1095">Usage of <b>Properties::get_name</b>:<br>Same Property Relation - <a href="15-spr.html#SP2">§2</a></span></button></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="reserved">return</span><span class="plain"> </span><span class="identifier">EMPTY_WORDING</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">name</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Parsing property names. </b>The following matches any property name, optionally preceded by the definite
|
|
article:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<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">internal</span><span class="plain"> {</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</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="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">name</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) + </span><span class="identifier">Wordings::length</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="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>With two variants:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">either</span><span class="plain">-</span><span class="identifier">or</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">internal</span><span class="plain"> {</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</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="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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="element">either_or</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">name</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">value</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">internal</span><span class="plain"> {</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</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="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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="element">either_or</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</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="element">name</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>For tiresome internal reasons, we also need a version which is voracious
|
|
(and doesn't accept the definite article):
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<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">v</span><span class="plain">> </span><span class="identifier">internal</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::starts_with</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="element">name</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) + </span><span class="identifier">Wordings::length</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="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>We call a property name "ambiguous" if, syntactically, it looks like a
|
|
reference to a property of something. For example, "point of view" could
|
|
be mistaken for the "point" property of something called "view". Formally,
|
|
it's ambiguous if it matches the following:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">looking</span><span class="plain">-</span><span class="identifier">like</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">test</span><span class="plain">> ::=</span>
|
|
<span class="plain">*** </span><span class="identifier">of</span><span class="plain"> ***</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>And this internal is exactly like <property-name> except that it only
|
|
matches ambiguous cases.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">ambiguous</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">internal</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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="element">ambiguous_name</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::starts_with</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="element">name</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) + </span><span class="identifier">Wordings::length</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="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>But the following slow routine, not used very often, is also convenient for
|
|
finding the length of the longest property name at the start of an excerpt.
|
|
(The assertion parser uses this to break text like "carrying capacity 20".)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::match_longest<button class="popup" onclick="togglePopup('usagePopup1096')">...<span class="popuptext" id="usagePopup1096">Usage of <b>Properties::match_longest</b>:<br>Tree Conversions - <a href="11-tc.html#SP7_1_1">§7.1.1</a></span></button></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">int</span><span class="plain"> </span><span class="identifier">maxlen</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::starts_with</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="element">name</span><span class="plain">))</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">maxlen</span><span class="plain"> < </span><span class="identifier">Wordings::length</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="identifier">maxlen</span><span class="plain"> = </span><span class="identifier">Wordings::length</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="reserved">return</span><span class="plain"> </span><span class="identifier">maxlen</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Permissions. </b>Each property has a list of permissions for its usage attached. These are
|
|
important enough to have their own section: here, all we do is...
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">property_permission</span><span class="plain"> *</span><span class="functiontext">Properties::permission_list<button class="popup" onclick="togglePopup('usagePopup1097')">...<span class="popuptext" id="usagePopup1097">Usage of <b>Properties::permission_list</b>:<br>Instances - <a href="5-ins.html#SP37">§37</a><br>Either-Or Properties - <a href="15-ep.html#SP17">§17</a><br>Property Permissions - <a href="16-pp.html#SP7">§7</a>, <a href="16-pp.html#SP9_3">§9.3</a></span></button></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">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">applicable_to</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::set_permission_list<button class="popup" onclick="togglePopup('usagePopup1098')">...<span class="popuptext" id="usagePopup1098">Usage of <b>Properties::set_permission_list</b>:<br>Property Permissions - <a href="16-pp.html#SP9_3">§9.3</a></span></button></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">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">) {</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">applicable_to</span><span class="plain"> = </span><span class="identifier">pp</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Logging. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::log<button class="popup" onclick="togglePopup('usagePopup1099')">...<span class="popuptext" id="usagePopup1099">Usage of <b>Properties::log</b>:<br>Core Module - <a href="1-cm.html#SP5">§5</a>, <a href="1-cm.html#SP6_6">§6.6</a></span></button></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"><a href="15-pr.html#SP15">Properties::log_basic_pname</a></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">Streams::I6_escapes_enabled</span><span class="plain">(</span><span class="identifier">DL</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">return</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="element">either_or</span><span class="plain">) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">neg</span><span class="plain"> = </span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></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">neg</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"=~"</span><span class="plain">); </span><span class="functiontext"><a href="15-pr.html#SP15">Properties::log_basic_pname</a></span><span class="plain">(</span><span class="identifier">neg</span><span class="plain">); }</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"=$u"</span><span class="plain">, </span><span class="functiontext"><a href="15-vp.html#SP5">Properties::Valued::kind</a></span><span class="plain">(</span><span class="identifier">prn</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::log_basic_pname<button class="popup" onclick="togglePopup('usagePopup1100')">...<span class="popuptext" id="usagePopup1100">Usage of <b>Properties::log_basic_pname</b>:<br>none</span></button></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">LOG</span><span class="plain">(</span><span class="string">"<null-property>"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</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="identifier">LOG</span><span class="plain">(</span><span class="string">"'%W'"</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="reserved">else</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="element">prop_iname</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%n"</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_iname</span><span class="plain">); }</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"nameless"</span><span class="plain">); }</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Access to details. </b>As we have seen, there are two fundamentally different forms of property,
|
|
and for clarity we define two test routines, even though each is the negation
|
|
of the other:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::is_either_or<button class="popup" onclick="togglePopup('usagePopup1101')">...<span class="popuptext" id="usagePopup1101">Usage of <b>Properties::is_either_or</b>:<br><a href="15-pr.html#SP21">§21</a>, <a href="15-pr.html#SP23">§23</a>, <a href="15-pr.html#SP25">§25</a>, <a href="15-pr.html#SP26">§26</a>, <a href="15-pr.html#SP27">§27</a>, Instances - <a href="5-ins.html#SP10">§10</a><br>The Creator - <a href="9-tc.html#SP4_5">§4.5</a><br>Make Assertions - <a href="9-ma.html#SP3_3_41_7">§3.3.41.7</a><br>Property Knowledge - <a href="9-pk.html#SP4">§4</a><br>Implications - <a href="9-imp.html#SP6">§6</a><br>Property Declarations - <a href="9-pd.html#SP5_8_1">§5.8.1</a>, <a href="9-pd.html#SP5_8_3">§5.8.3</a>, <a href="9-pd.html#SP5_11_2">§5.11.2</a><br>Propositions - <a href="11-pr.html#SP35_2">§35.2</a><br>Tree Conversions - <a href="11-tc.html#SP7_1">§7.1</a><br>Sentence Conversions - <a href="11-sc.html#SP3_3">§3.3</a><br>RValues - <a href="14-rv.html#SP24_3_1">§24.3.1</a><br>Lvalues - <a href="14-lv.html#SP12_5">§12.5</a><br>Dash - <a href="14-ds2.html#SP11_9_1_2_3">§11.9.1.2.3</a>, <a href="14-ds2.html#SP13">§13</a><br>Properties of Values - <a href="15-pov.html#SP4_1">§4.1</a><br>Emit Property Values - <a href="15-epv.html#SP2">§2</a>, <a href="15-epv.html#SP2_1">§2.1</a>, <a href="15-epv.html#SP3">§3</a><br>Property Permissions - <a href="16-pp.html#SP8">§8</a><br>Inferences - <a href="16-in.html#SP14">§14</a>, <a href="16-in.html#SP16">§16</a>, <a href="16-in.html#SP17">§17</a>, <a href="16-in.html#SP19">§19</a><br>Complete Model World - <a href="16-cmw.html#SP1_2_2">§1.2.2</a>, <a href="16-cmw.html#SP1_2_2_1_1">§1.2.2.1.1</a><br>Compile Invocations Inline - <a href="25-cii.html#SP3_1_1_4_11">§3.1.1.4.11</a></span></button></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">return</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="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::is_value_property<button class="popup" onclick="togglePopup('usagePopup1102')">...<span class="popuptext" id="usagePopup1102">Usage of <b>Properties::is_value_property</b>:<br>Refine Parse Tree - <a href="9-rpt.html#SP9_7_3">§9.7.3</a><br>Dash - <a href="14-ds2.html#SP10_1_1_3_1_3">§10.1.1.3.1.3</a>, <a href="14-ds2.html#SP11_9_1_1_2_1">§11.9.1.1.2.1</a>, <a href="14-ds2.html#SP19_3_1">§19.3.1</a><br>The Provision Relation - <a href="15-tpr.html#SP7_1">§7.1</a><br>Same Property Relation - <a href="15-spr.html#SP2">§2</a><br>Inferences - <a href="16-in.html#SP20_3_3">§20.3.3</a></span></button></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="element">either_or</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>More miscellaneously: the following flags correspond to two ways
|
|
in which properties can be "unofficial". First, the pseudo-properties
|
|
like "indefinite appearance" have no existence at run-time, and can't
|
|
be compiled, so:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::can_be_compiled<button class="popup" onclick="togglePopup('usagePopup1103')">...<span class="popuptext" id="usagePopup1103">Usage of <b>Properties::can_be_compiled</b>:<br><a href="15-pr.html#SP25">§25</a>, Properties of Values - <a href="15-pov.html#SP4">§4</a><br>Emit Property Values - <a href="15-epv.html#SP2">§2</a></span></button></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">do_not_compile</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b>Second, a property might be missed out of the Index pages for clarity's
|
|
sake:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::is_shown_in_index<button class="popup" onclick="togglePopup('usagePopup1104')">...<span class="popuptext" id="usagePopup1104">Usage of <b>Properties::is_shown_in_index</b>:<br>Extension Files - <a href="8-ef.html#SP12_9">§12.9</a><br>Inferences - <a href="16-in.html#SP16">§16</a>, <a href="16-in.html#SP17">§17</a></span></button></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">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">include_in_index</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::exclude_from_index<button class="popup" onclick="togglePopup('usagePopup1105')">...<span class="popuptext" id="usagePopup1105">Usage of <b>Properties::exclude_from_index</b>:<br><a href="15-pr.html#SP5">§5</a>, Relations - <a href="6-rlt.html#SP9_3_8">§9.3.8</a><br>Either-Or Properties - <a href="15-ep.html#SP4">§4</a><br>Valued Properties - <a href="15-vp.html#SP3">§3</a></span></button></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">include_in_index</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b>During indexing we try to avoid mentioning properties more than once:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::set_indexed_already_flag<button class="popup" onclick="togglePopup('usagePopup1106')">...<span class="popuptext" id="usagePopup1106">Usage of <b>Properties::set_indexed_already_flag</b>:<br>Inferences - <a href="16-in.html#SP15">§15</a>, <a href="16-in.html#SP16">§16</a></span></button></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">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">indexed_already</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::get_indexed_already_flag<button class="popup" onclick="togglePopup('usagePopup1107')">...<span class="popuptext" id="usagePopup1107">Usage of <b>Properties::get_indexed_already_flag</b>:<br>Inferences - <a href="16-in.html#SP16">§16</a></span></button></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">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">indexed_already</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b>Used to support the run-time storage code: see "Properties of Objects".
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::offset_in_runtime_metadata_table_is<button class="popup" onclick="togglePopup('usagePopup1108')">...<span class="popuptext" id="usagePopup1108">Usage of <b>Properties::offset_in_runtime_metadata_table_is</b>:<br>none</span></button></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">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain">) {</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">metadata_table_offset</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::get_offset_in_runtime_metadata_table<button class="popup" onclick="togglePopup('usagePopup1109')">...<span class="popuptext" id="usagePopup1109">Usage of <b>Properties::get_offset_in_runtime_metadata_table</b>:<br>none</span></button></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">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">metadata_table_offset</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Translated names of properties. </b>Some properties have translated names mechanically generated by Inform (indeed
|
|
all properties initially have, as we saw above), but others must have names
|
|
corresponding to those used in the template: these are, we say, "translated".
|
|
The following routine accomplishes that. It is normally used in response to
|
|
explicit requests in the source text (see below), but can also be used by
|
|
plugins to give their favourite properties names which will help their own
|
|
run-time support code to work.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::set_translation<button class="popup" onclick="togglePopup('usagePopup1110')">...<span class="popuptext" id="usagePopup1110">Usage of <b>Properties::set_translation</b>:<br><a href="15-pr.html#SP22">§22</a>, Either-Or Properties - <a href="15-ep.html#SP4">§4</a></span></button></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">wchar_t</span><span class="plain"> *</span><span class="identifier">t</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">internal_error</span><span class="plain">(</span><span class="string">"translation set for null property"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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_in_negation</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP21">Properties::set_translation</a></span><span class="plain">(</span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; ((</span><span class="identifier">t</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) && (</span><span class="identifier">i</span><span class="plain"><31)); </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">])) || (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">])) || (</span><span class="identifier">t</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'_'</span><span class="plain">))</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="character">'_'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::change_translation</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-></span><span class="identifier">prop_iname</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::make_available</a></span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_iname</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">translated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::set_translation_S<button class="popup" onclick="togglePopup('usagePopup1111')">...<span class="popuptext" id="usagePopup1111">Usage of <b>Properties::set_translation_S</b>:<br>Valued Properties - <a href="15-vp.html#SP3">§3</a></span></button></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">text_stream</span><span class="plain"> *</span><span class="identifier">t</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">internal_error</span><span class="plain">(</span><span class="string">"translation set for null property"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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_in_negation</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP21">Properties::set_translation_S</a></span><span class="plain">(</span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isalpha</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) || (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">))</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="character">'_'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="constant">31</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::change_translation</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-></span><span class="identifier">prop_iname</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">translated</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::has_been_translated<button class="popup" onclick="togglePopup('usagePopup1112')">...<span class="popuptext" id="usagePopup1112">Usage of <b>Properties::has_been_translated</b>:<br>Properties of Values - <a href="15-pov.html#SP4_1">§4.1</a><br>Emit Property Values - <a href="15-epv.html#SP3_2">§3.2</a></span></button></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">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">translated</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b>And this is the routine which is called by the assertion parser in response
|
|
to sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The initial appearance property translates into I6 as "initial".</p>
|
|
|
|
</blockquote>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::translates<button class="popup" onclick="togglePopup('usagePopup1113')">...<span class="popuptext" id="usagePopup1113">Usage of <b>Properties::translates</b>:<br>Translate to Identifiers - <a href="26-tti.html#SP5_1">§5.1</a></span></button></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">parse_node</span><span class="plain"> *</span><span class="identifier">p2</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="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">wchar_t</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p2</span><span class="plain">)));</span>
|
|
|
|
<<span class="cwebmacro">Make sure this is a genuine and previously untranslated property</span> <span class="cwebmacronumber">22.1</span>><span class="plain">;</span>
|
|
|
|
<span class="functiontext"><a href="15-pr.html#SP21">Properties::set_translation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PROPERTY_TRANSLATIONS</span><span class="plain">, </span><span class="string">"Property <$Y> translates as <%w>\n"</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">text</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="element">either_or</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Check to see if a sense reversal has taken place in translation</span> <span class="cwebmacronumber">22.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_1"></a><b>§22.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make sure this is a genuine and previously untranslated property</span> <span class="cwebmacronumber">22.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<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">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonPropertyTranslated</span><span class="plain">),</span>
|
|
<span class="string">"this property does not exist"</span><span class="plain">,</span>
|
|
<span class="string">"so cannot be translated."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</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">translated</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">Produce::get_translation</span><span class="plain">(</span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)), </span><span class="identifier">text</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TranslatedTwice</span><span class="plain">),</span>
|
|
<span class="string">"this property has already been translated"</span><span class="plain">,</span>
|
|
<span class="string">"so there must be some duplication somewhere."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_2"></a><b>§22.2. </b>But there is a kick in the tail, which is that translation can reverse the
|
|
run-time parity of an either/or property. The Standard Rules normally say:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The open property translates into I6 as "open".</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">This means that information about openness is stored as <code class="display"><span class="extract">open</span></code> within the
|
|
template; an open door has <code class="display"><span class="extract">open</span></code> set, for instance. If we had written:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The closed property translates into I6 as "open".</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">then the relevant data would still have been stored as <code class="display"><span class="extract">open</span></code>, but with the
|
|
opposite sense; an open door would now be one with <code class="display"><span class="extract">open</span></code> cleared. (Of
|
|
course we'd never want to do something so confusing, but the facility
|
|
exists because Inform 7 made a few either/or properties opposite in sense
|
|
to their analogous Inform 6 ones.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check to see if a sense reversal has taken place in translation</span> <span class="cwebmacronumber">22.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">neg</span><span class="plain"> = </span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></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">neg</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="15-ep.html#SP7">Properties::EitherOr::make_stored_in_negation</a></span><span class="plain">(</span><span class="identifier">neg</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PROPERTY_TRANSLATIONS</span><span class="plain">, </span><span class="string">"Storing this way round: $Y\n"</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="15-pr.html#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. Traversing properties. </b>These routines are to help other parts of Inform to visit each property just
|
|
once, when working through some complicated search space. (Visiting an either/or
|
|
property also visits its negation.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">property_traverse_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::begin_traverse<button class="popup" onclick="togglePopup('usagePopup1114')">...<span class="popuptext" id="usagePopup1114">Usage of <b>Properties::begin_traverse</b>:<br>Emit Property Values - <a href="15-epv.html#SP1_1">§1.1</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="identifier">property_traverse_count</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::visited_in_traverse<button class="popup" onclick="togglePopup('usagePopup1115')">...<span class="popuptext" id="usagePopup1115">Usage of <b>Properties::visited_in_traverse</b>:<br>Emit Property Values - <a href="15-epv.html#SP2">§2</a></span></button></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="element">visited_on_traverse</span><span class="plain"> == </span><span class="identifier">property_traverse_count</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">visited_on_traverse</span><span class="plain"> = </span><span class="identifier">property_traverse_count</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prnbar</span><span class="plain"> = </span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></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">prnbar</span><span class="plain">) </span><span class="identifier">prnbar</span><span class="plain">-></span><span class="element">visited_on_traverse</span><span class="plain"> = </span><span class="identifier">property_traverse_count</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. </b>The "possession marker" is similarly used to keep tabs on which either/or
|
|
properties things seem to have, but only as temporary data used when working
|
|
on implications. Here we only make it available as storage.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">possession_marker</span><span class="plain"> *</span><span class="functiontext">Properties::get_possession_marker<button class="popup" onclick="togglePopup('usagePopup1116')">...<span class="popuptext" id="usagePopup1116">Usage of <b>Properties::get_possession_marker</b>:<br>Implications - <a href="9-imp.html#SP5_1">§5.1</a>, <a href="9-imp.html#SP6_1">§6.1</a>, <a href="9-imp.html#SP7_1">§7.1</a><br>Assert Propositions - <a href="12-ap.html#SP14_2">§14.2</a></span></button></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">return</span><span class="plain"> &(</span><span class="identifier">prn</span><span class="plain">-></span><span class="element">pom</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. Compiling property values. </b>Small as it may be, this routine contains two important principles: one, that
|
|
property values of something are drawn from the most specific knowledge we have
|
|
about it; and two, that if we have no knowledge of any specificity, then we fill
|
|
in a default value.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::compile_inferred_value<button class="popup" onclick="togglePopup('usagePopup1117')">...<span class="popuptext" id="usagePopup1117">Usage of <b>Properties::compile_inferred_value</b>:<br>Emit Property Values - <a href="15-epv.html#SP2">§2</a></span></button></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">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</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="functiontext"><a href="15-pr.html#SP17">Properties::can_be_compiled</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">infs</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP26">Properties::compile_property_value_inner</a></span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">infs</span><span class="plain"> = </span><span class="functiontext"><a href="16-is.html#SP14">InferenceSubjects::narrowest_broader_subject</a></span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">))</span>
|
|
<span class="functiontext"><a href="15-ep.html#SP11">Properties::EitherOr::compile_default_value</a></span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP11">Properties::Valued::compile_default_value</a></span><span class="plain">(</span><span class="identifier">VH</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="inwebparagraph"><a id="SP26"></a><b>§26. </b>Here we look for a specific subject's knowledge about our property, and if
|
|
we find it, we compile it and return <code class="display"><span class="extract">TRUE</span></code>; if not we do nothing and return
|
|
<code class="display"><span class="extract">FALSE</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::compile_property_value_inner<button class="popup" onclick="togglePopup('usagePopup1118')">...<span class="popuptext" id="usagePopup1118">Usage of <b>Properties::compile_property_value_inner</b>:<br><a href="15-pr.html#SP25">§25</a></span></button></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">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</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</span><span class="plain"> *</span><span class="identifier">inf</span><span class="plain">;</span>
|
|
<span class="identifier">KNOWLEDGE_LOOP</span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">, </span><span class="constant">PROPERTY_INF</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="16-in.html#SP11">World::Inferences::get_inference_type</a></span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">) == </span><span class="constant">PROPERTY_INF</span><span class="plain">) {</span>
|
|
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="functiontext"><a href="16-in.html#SP11">World::Inferences::where_inferred</a></span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sense</span><span class="plain"> = (</span><span class="functiontext"><a href="16-in.html#SP11">World::Inferences::get_certainty</a></span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">inferred_property</span><span class="plain"> = </span><span class="functiontext"><a href="16-in.html#SP11">World::Inferences::get_property</a></span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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">inferred_property</span><span class="plain"> == </span><span class="identifier">prn</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="15-ep.html#SP11">Properties::EitherOr::compile_value</a></span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">inferred_property</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inferred_property</span><span class="plain"> == </span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="15-ep.html#SP11">Properties::EitherOr::compile_value</a></span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">inferred_property</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">?</span><span class="identifier">FALSE:TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inferred_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">sense</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="functiontext"><a href="16-in.html#SP11">World::Inferences::get_property_value</a></span><span class="plain">(</span><span class="identifier">inf</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</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">"malformed property inference"</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="15-vp.html#SP11">Properties::Valued::compile_value</a></span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">inferred_property</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"valued property with negative certainty"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27"></a><b>§27. Emitting to Inter. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Properties::iname<button class="popup" onclick="togglePopup('usagePopup1119')">...<span class="popuptext" id="usagePopup1119">Usage of <b>Properties::iname</b>:<br><a href="15-pr.html#SP21">§21</a>, <a href="15-pr.html#SP22_1">§22.1</a>, Instances - <a href="5-ins.html#SP38_3">§38.3</a><br>Relations - <a href="6-rlt.html#SP9_3_8">§9.3.8</a>, <a href="6-rlt.html#SP15_1_3">§15.1.3</a><br>The Equality Relation - <a href="12-ter.html#SP8_1">§8.1</a><br>Deciding to Defer - <a href="12-dtd.html#SP19">§19</a>, <a href="12-dtd.html#SP22">§22</a><br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_6_1_2_2_5">§2.1.6.1.2.2.5</a>, <a href="12-cdp.html#SP2_1_6_1_2_2_6_1">§2.1.6.1.2.2.6.1</a><br>RValues - <a href="14-rv.html#SP24_3_1">§24.3.1</a><br>Either-Or Properties - <a href="15-ep.html#SP15_1">§15.1</a>, <a href="15-ep.html#SP15_2">§15.2</a><br>Measurement Adjectives - <a href="15-ma.html#SP14_1">§14.1</a><br>Comparative Relations - <a href="15-cr.html#SP7_1">§7.1</a><br>Same Property Relation - <a href="15-spr.html#SP2">§2</a><br>Setting Property Relation - <a href="15-spr2.html#SP8">§8</a>, <a href="15-spr2.html#SP11">§11</a><br>Emit Property Values - <a href="15-epv.html#SP4">§4</a><br>Instance Counting - <a href="16-ic.html#SP13">§13</a><br>Compile Invocations Inline - <a href="25-cii.html#SP8">§8</a><br>Emitting Inter - <a href="27-em.html#SP3">§3</a></span></button></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">internal_error</span><span class="plain">(</span><span class="string">"tried to find iname for null property"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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_in_negation</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></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="element">prop_iname</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">prop_package</span><span class="plain"> = </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::package</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-></span><span class="element">owning_module</span><span class="plain">, </span><span class="constant">PROPERTIES_HAP</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::markup_wording</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_package</span><span class="plain">, </span><span class="constant">PROPERTY_NAME_HMD</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="identifier">prn</span><span class="plain">-></span><span class="element">prop_iname</span><span class="plain"> = </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::make_iname_with_memo</a></span><span class="plain">(</span><span class="constant">PROPERTY_HL</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_package</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="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_iname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="functiontext">Properties::package<button class="popup" onclick="togglePopup('usagePopup1120')">...<span class="popuptext" id="usagePopup1120">Usage of <b>Properties::package</b>:<br>none</span></button></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">internal_error</span><span class="plain">(</span><span class="string">"tried to find package for null property"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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_in_negation</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="15-pr.html#SP27">Properties::package</a></span><span class="plain">(</span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prop_package</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::emit_single<button class="popup" onclick="togglePopup('usagePopup1121')">...<span class="popuptext" id="usagePopup1121">Usage of <b>Properties::emit_single</b>:<br>Emitting Inter - <a href="27-em.html#SP3">§3</a></span></button></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">internal_error</span><span class="plain">(</span><span class="string">"tried to find emit single for null property"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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_in_negation</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::emit_single</a></span><span class="plain">(</span><span class="functiontext"><a href="15-ep.html#SP6">Properties::EitherOr::get_negation</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-></span><span class="element">prn_emitted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></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="identifier">prn</span><span class="plain">-></span><span class="element">property_value_kind</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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="identifier">K_truth_state</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">"kindless property"</span><span class="plain">);</span>
|
|
<span class="identifier">prn</span><span class="plain">-></span><span class="element">prn_emitted</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="functiontext"><a href="27-em.html#SP3">Emit::property</a></span><span class="plain">(</span><span class="identifier">iname</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">prn</span><span class="plain">-></span><span class="element">run_time_only</span><span class="plain">) </span><span class="functiontext"><a href="27-em.html#SP3">Emit::permission</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">K_object</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">prn</span><span class="plain">-></span><span class="element">translated</span><span class="plain">) </span><span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">EXPLICIT_ATTRIBUTE_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">SOURCE_ORDER_IANN</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">prn</span><span class="plain">-></span><span class="identifier">allocation_id</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::emit<button class="popup" onclick="togglePopup('usagePopup1122')">...<span class="popuptext" id="usagePopup1122">Usage of <b>Properties::emit</b>:<br>How To Compile - <a href="1-htc.html#SP2_5">§2.5</a></span></button></span><span class="plain">(</span><span class="reserved">void</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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">prn</span><span class="plain">-></span><span class="element">property_value_kind</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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="element">stored_in_negation</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">K_truth_state</span><span class="plain">;</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">"kindless property"</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::emit_single</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="reserved">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_PERMISSIONS_FOR_PROPERTY</span><span class="plain">(</span><span class="identifier">pp</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">subj</span><span class="plain"> = </span><span class="identifier">pp</span><span class="plain">-></span><span class="element">property_owner</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subj</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">"unowned property"</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"><a href="16-is.html#SP19">InferenceSubjects::as_kind</a></span><span class="plain">(</span><span class="identifier">subj</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"><a href="27-em.html#SP3">Emit::permission</a></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="functiontext"><a href="15-pov.html#SP3">Properties::OfValues::annotate_table_storage</a></span><span class="plain">(</span><span class="identifier">pp</span><span class="plain">));</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::emit_default_values<button class="popup" onclick="togglePopup('usagePopup1123')">...<span class="popuptext" id="usagePopup1123">Usage of <b>Properties::emit_default_values</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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">prn</span><span class="plain">-></span><span class="element">property_value_kind</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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="element">stored_in_negation</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">K_truth_state</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="27-em.html#SP3">Emit::ensure_defaultvalue</a></span><span class="plain">(</span><span class="identifier">K</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::annotate_attributes<button class="popup" onclick="togglePopup('usagePopup1124')">...<span class="popuptext" id="usagePopup1124">Usage of <b>Properties::annotate_attributes</b>:<br>How To Compile - <a href="1-htc.html#SP2_7">§2.7</a></span></button></span><span class="plain">(</span><span class="reserved">void</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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="element">stored_in_negation</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">EITHER_OR_IANN</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-ep.html#SP10">Properties::EitherOr::implemented_as_attribute</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">ATTRIBUTE_IANN</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-></span><span class="element">name</span><span class="plain">))</span>
|
|
<span class="identifier">Produce::annotate_w</span><span class="plain">(</span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">PROPERTY_NAME_IANN</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="reserved">if</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">Produce::annotate_i</span><span class="plain">(</span><span class="functiontext"><a href="15-pr.html#SP27">Properties::iname</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), </span><span class="identifier">RTO_IANN</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="15-pr.html#SP27">Properties::emit_default_values</a></span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::emit_instance_permissions<button class="popup" onclick="togglePopup('usagePopup1125')">...<span class="popuptext" id="usagePopup1125">Usage of <b>Properties::emit_instance_permissions</b>:<br>Instances - <a href="5-ins.html#SP34">§34</a></span></button></span><span class="plain">(</span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="functiontext"><a href="5-ins.html#SP13">Instances::as_subject</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="reserved">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_PERMISSIONS_FOR_INFS</span><span class="plain">(</span><span class="identifier">pp</span><span class="plain">, </span><span class="identifier">subj</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">pp</span><span class="plain">-></span><span class="element">property_granted</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP16">Properties::is_either_or</a></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="element">stored_in_negation</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="27-em.html#SP3">Emit::instance_permission</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="functiontext"><a href="5-ins.html#SP34">Instances::emitted_iname</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><i>(This section begins Chapter 15: Properties.)</i></li><li><a href="15-ep.html">Continue with 'Either-Or Properties'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|