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

540 lines
76 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Either-Or Properties</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<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>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</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>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</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>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Either-Or 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>Either-Or Properties</b></li></ul><p class="purpose">Properties which can either be present or not, but have no value attached.</p>
2019-03-17 14:40:57 +02:00
<ul class="toc"><li><a href="15-ep.html#SP1">&#167;1. A design choice</a></li><li><a href="15-ep.html#SP3">&#167;3. Requesting new named properties</a></li><li><a href="15-ep.html#SP4">&#167;4. Requesting new nameless properties</a></li><li><a href="15-ep.html#SP5">&#167;5. Initialising details</a></li><li><a href="15-ep.html#SP9">&#167;9. Assertion</a></li><li><a href="15-ep.html#SP10">&#167;10. Compilation</a></li><li><a href="15-ep.html#SP12">&#167;12. Either/or properties as adjectives</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. A design choice. </b>A property name structure with the either/or flag set represents one which is
true or false. It's not obvious what the best way to handle these properties
would be. A traditional computer-science view would be that a property like
"open" is really just another valued property, whose kind of value is
"truth state" &mdash; that is, "true" or "false". The word "closed" would
then be no property at all, only a sort of syntactic sugar for a particular
way to initialise the "open" property.
</p>
<p class="inwebparagraph">But in natural language, there seems no reason why "open" should be somehow
more real than "closed". Source text ought to regard them as linguistically
the same, and might talk about "the closed property" just as readily as
"the open property". It's true that at some low-level implementation level
these two properties, "open" and "closed", are tied together, but
otherwise they ought both to be just as valid.
</p>
<p class="inwebparagraph">The language is the same either way, but the compiler has to choose which of
these tacks it will take in implementing either/or properties. The first
approach involves messy higher-level code pretending that certain linguistic
features are properties even when they don't map onto <code class="display"><span class="extract">property</span></code>
structures, which is bad; the second approach involves messy lower-level code
coping with the fact that two different <code class="display"><span class="extract">property</span></code> structures are somehow
the same, which is also bad. In the end, we went with the second approach (but
about every two years consider stripping it out and rewriting the other way,
just the same).
</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The rule, therefore, is:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) If an either/or property has one named form for when it is present and
another for when it is absent, both forms are considered either/or properties.
Each has a <code class="display"><span class="extract">property</span></code> structure. We call these a "pair".
</li></ul>
<ul class="items"><li>(b) Within a pair, the <code class="display"><span class="extract">negation</span></code> field of each member points to the other.
Thus it points from the "open" structure to the "closed" one, and vice
versa.
</li></ul>
<ul class="items"><li>(c) Exactly one member of the pair has <code class="display"><span class="extract">stored_in_negation</span></code> set. This one is
the ghostly one not existing at run-time; for example, in the Standard Rules,
"open" is the stored one and "closed" is the ghost, so "closed" has
<code class="display"><span class="extract">stored_in_negation</span></code> set.
</li></ul>
<ul class="items"><li>(d) If an either/or property has no named form for when it is absent, it is
a "singleton" and not a member of any pair. Its <code class="display"><span class="extract">negation</span></code> field is <code class="display"><span class="extract">NULL</span></code>,
and <code class="display"><span class="extract">stored_in_negation</span></code> is clear.
</li></ul>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Requesting new named properties. </b>This is how the either/or properties declared by the source text are made.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::obtain<button class="popup" onclick="togglePopup('usagePopup1126')">...<span class="popuptext" id="usagePopup1126">Usage of <b>Properties::EitherOr::obtain</b>:<br>Property Declarations - <a href="9-pd.html#SP5_9">&#167;5.9</a>, <a href="9-pd.html#SP5_10">&#167;5.10</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">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
2020-04-14 19:56:54 +03:00
<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_KindAdjectiveClash</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"this tries to create a new either/or adjective with the same name "</span>
<span class="string">"as an existing kind"</span><span class="plain">,</span>
<span class="string">"which isn't allowed. For example, 'A hopper can be a container.' is "</span>
<span class="string">"not allowed because something either is, or is not, a 'container', "</span>
<span class="string">"and that can never change during play. 'Container' is a kind, and "</span>
<span class="string">"those are fixed. 'A hopper is a container' would be allowed, because "</span>
<span class="string">"that makes a definite statement."</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<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#SP4">Properties::obtain</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">either_or</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<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#SP21">InferenceSubjects::domain</a></span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_meaning_registered</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="functiontext"><a href="15-ep.html#SP12">Properties::EitherOr::create_adjective_from_property</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">K</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">else</span>
<span class="functiontext"><a href="15-ep.html#SP12">Properties::EitherOr::make_new_adjective_sense_from_property</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">K</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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="SP4"></a><b>&#167;4. Requesting new nameless properties. </b>These are properties needed for implementation reasons by the template, and
which are added to the model by plugins here inside Inform, but which have
no existence at the source text level &mdash; and hence have no names.
</p>
<p class="inwebparagraph">Setting them up as adjectives may seem a little over the top, since they cannot
be encountered in source text, but the world model will have to set these properties
2019-03-17 14:40:57 +02:00
by asserting propositions to be true; and type-checking of those propositions
relies on adjectival meanings.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::new_nameless<button class="popup" onclick="togglePopup('usagePopup1127')">...<span class="popuptext" id="usagePopup1127">Usage of <b>Properties::EitherOr::new_nameless</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">I6_form</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">wording</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">I6_form</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::synoptic_package</a></span><span class="plain">(</span><span class="constant">PROPERTIES_HAP</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="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">R</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext"><a href="15-pr.html#SP5">Properties::create</a></span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">either_or</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<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="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">I6_form</span><span class="plain">);</span>
<span class="functiontext"><a href="15-ep.html#SP12">Properties::EitherOr::create_adjective_from_property</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">run_time_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<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>&#167;5. Initialising details. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::initialise<button class="popup" onclick="togglePopup('usagePopup1128')">...<span class="popuptext" id="usagePopup1128">Usage of <b>Properties::EitherOr::initialise</b>:<br>Properties - <a href="15-pr.html#SP5_3">&#167;5.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>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">stored_in_negation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">implemented_as_attribute</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_meaning_registered</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_phrase_registered</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">eo_parsing_grammar</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>When created, all properties start out as singletons; the following joins
two together into a pair. It's allowed to rejoin an existing pair (either way
around), but not to break one.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::make_negations<button class="popup" onclick="togglePopup('usagePopup1129')">...<span class="popuptext" id="usagePopup1129">Usage of <b>Properties::EitherOr::make_negations</b>:<br>Property Declarations - <a href="9-pd.html#SP5_10">&#167;5.10</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</span><span class="plain"> *</span><span class="identifier">neg</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</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">NULL</span><span class="plain">) || (</span><span class="identifier">neg</span><span class="plain">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="identifier">negation</span><span class="plain">) || (</span><span class="identifier">neg</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="identifier">negation</span><span class="plain"> != </span><span class="identifier">neg</span><span class="plain">) || (</span><span class="identifier">neg</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain"> != </span><span class="identifier">prn</span><span class="plain">)) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(2, </span><span class="identifier">prn</span><span class="plain">);</span>
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(3, </span><span class="identifier">neg</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">) {</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(4, </span><span class="identifier">prn</span><span class="plain">);</span>
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(5, </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="identifier">negation</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(4, </span><span class="identifier">neg</span><span class="plain">);</span>
<span class="functiontext"><a href="2-sq.html#SP2">Problems::quote_property</a></span><span class="plain">(5, </span><span class="identifier">neg</span><span class="plain">-&gt;</span><span class="identifier">negation</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<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_BrokenNegationPair</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In %1, you proposed to set up the properties '%2' and '%3' as "</span>
<span class="string">"opposites of each other. But I can't allow that, because '%4' "</span>
<span class="string">"already has an opposite in another context ('%5')."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain"> = </span><span class="identifier">neg</span><span class="plain">; </span><span class="identifier">neg</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain"> = </span><span class="identifier">prn</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>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::get_negation<button class="popup" onclick="togglePopup('usagePopup1130')">...<span class="popuptext" id="usagePopup1130">Usage of <b>Properties::EitherOr::get_negation</b>:<br><a href="15-ep.html#SP15_1">&#167;15.1</a>, <a href="15-ep.html#SP15_2">&#167;15.2</a>, <a href="15-ep.html#SP17">&#167;17</a>, Implications - <a href="9-imp.html#SP6_1">&#167;6.1</a><br>Property Declarations - <a href="9-pd.html#SP5_8_3">&#167;5.8.3</a><br>RValues - <a href="14-rv.html#SP24_3_1">&#167;24.3.1</a><br>Properties - <a href="15-pr.html#SP15">&#167;15</a>, <a href="15-pr.html#SP21">&#167;21</a>, <a href="15-pr.html#SP22_2">&#167;22.2</a>, <a href="15-pr.html#SP23">&#167;23</a>, <a href="15-pr.html#SP26">&#167;26</a>, <a href="15-pr.html#SP27">&#167;27</a><br>Emit Property Values - <a href="15-epv.html#SP2">&#167;2</a>, <a href="15-epv.html#SP2_1">&#167;2.1</a>, <a href="15-epv.html#SP4">&#167;4</a><br>Property Permissions - <a href="16-pp.html#SP8">&#167;8</a><br>Inferences - <a href="16-in.html#SP14">&#167;14</a>, <a href="16-in.html#SP16">&#167;16</a>, <a href="16-in.html#SP17">&#167;17</a>, <a href="16-in.html#SP19">&#167;19</a><br>Complete Model World - <a href="16-cmw.html#SP1_2_2">&#167;1.2.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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::stored_in_negation<button class="popup" onclick="togglePopup('usagePopup1131')">...<span class="popuptext" id="usagePopup1131">Usage of <b>Properties::EitherOr::stored_in_negation</b>:<br><a href="15-ep.html#SP15_1">&#167;15.1</a>, <a href="15-ep.html#SP15_2">&#167;15.2</a>, RValues - <a href="14-rv.html#SP24_3_1">&#167;24.3.1</a><br>Emit Property Values - <a href="15-epv.html#SP2">&#167;2</a>, <a href="15-epv.html#SP2_1">&#167;2.1</a>, <a href="15-epv.html#SP3">&#167;3</a>, <a href="15-epv.html#SP4">&#167;4</a><br>Inferences - <a href="16-in.html#SP16">&#167;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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">stored_in_negation</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::make_stored_in_negation<button class="popup" onclick="togglePopup('usagePopup1132')">...<span class="popuptext" id="usagePopup1132">Usage of <b>Properties::EitherOr::make_stored_in_negation</b>:<br><a href="15-ep.html#SP6">&#167;6</a>, Properties - <a href="15-pr.html#SP22_2">&#167;22.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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</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">"singleton EO cannot store in negation"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">stored_in_negation</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">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">) </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">-&gt;</span><span class="element">stored_in_negation</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Miscellaneous details:
</p>
<pre class="display">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">grammar_verb</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::get_parsing_grammar<button class="popup" onclick="togglePopup('usagePopup1133')">...<span class="popuptext" id="usagePopup1133">Usage of <b>Properties::EitherOr::get_parsing_grammar</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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">eo_parsing_grammar</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::set_parsing_grammar<button class="popup" onclick="togglePopup('usagePopup1134')">...<span class="popuptext" id="usagePopup1134">Usage of <b>Properties::EitherOr::set_parsing_grammar</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="identifier">grammar_verb</span><span class="plain"> *</span><span class="identifier">gv</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">eo_parsing_grammar</span><span class="plain"> = </span><span class="identifier">gv</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::get_aph<button class="popup" onclick="togglePopup('usagePopup1135')">...<span class="popuptext" id="usagePopup1135">Usage of <b>Properties::EitherOr::get_aph</b>:<br><a href="15-ep.html#SP9">&#167;9</a>, Implications - <a href="9-imp.html#SP7_1_3">&#167;7.1.3</a><br>Propositions - <a href="11-pr.html#SP35_2">&#167;35.2</a><br>Sentence Conversions - <a href="11-sc.html#SP3_3">&#167;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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_phrase_registered</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Assertion. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::assert<button class="popup" onclick="togglePopup('usagePopup1136')">...<span class="popuptext" id="usagePopup1136">Usage of <b>Properties::EitherOr::assert</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>
2019-03-17 14:40:57 +02:00
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">certainty</span><span class="plain">) {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext"><a href="11-ap.html#SP20">Calculus::Atoms::unary_PREDICATE_from_aph</a></span><span class="plain">(</span>
<span class="functiontext"><a href="15-ep.html#SP8">Properties::EitherOr::get_aph</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">), (</span><span class="identifier">parity</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="12-ap.html#SP5">Calculus::Propositions::Assert::assert_true_about</a></span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">certainty</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Compilation. </b>Inform 6 provides "attributes" as a faster-access, more memory-efficient
form of object properties, stored at run-time in a bitmap rather than as
key-value pairs in a small dictionary. Because the bitmap is inflexibly sized,
only some of our either/or properties will be able to make use of it. See
"Properties of Objects" for how these are chosen; the following simply
keep a flag recording the outcome.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::implemented_as_attribute<button class="popup" onclick="togglePopup('usagePopup1137')">...<span class="popuptext" id="usagePopup1137">Usage of <b>Properties::EitherOr::implemented_as_attribute</b>:<br>Properties - <a href="15-pr.html#SP27">&#167;27</a><br>Emit Property Values - <a href="15-epv.html#SP2_1">&#167;2.1</a>, <a href="15-epv.html#SP4">&#167;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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">implemented_as_attribute</span><span class="plain"> == </span><span class="identifier">NOT_APPLICABLE</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">prn</span><span class="plain">-&gt;</span><span class="element">implemented_as_attribute</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::implement_as_attribute<button class="popup" onclick="togglePopup('usagePopup1138')">...<span class="popuptext" id="usagePopup1138">Usage of <b>Properties::EitherOr::implement_as_attribute</b>:<br>Emit Property Values - <a href="15-epv.html#SP3">&#167;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">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<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">-&gt;</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">"non-EO property"</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">implemented_as_attribute</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">) </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">negation</span><span class="plain">-&gt;</span><span class="element">implemented_as_attribute</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Otherwise, each either/or property is stored as either <code class="display"><span class="extract">true</span></code> or <code class="display"><span class="extract">false</span></code>
in a given cell of memory at run-time &mdash; wastefully since only 1 of the
16 or 32 bits in that memory word is used, but at least rapidly. The
following compiles this <code class="display"><span class="extract">true</span></code> or <code class="display"><span class="extract">false</span></code> value.
</p>
<p class="inwebparagraph">(Because of the way the attribute optimisation works, it's very important not to
change the strings of compiled code here without making a matching change in
"Properties of Objects".)
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::compile_value<button class="popup" onclick="togglePopup('usagePopup1139')">...<span class="popuptext" id="usagePopup1139">Usage of <b>Properties::EitherOr::compile_value</b>:<br>Properties - <a href="15-pr.html#SP26">&#167;26</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">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">val</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) {</span>
2019-08-24 13:21:48 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Holsters::data_acceptable</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Holsters::holster_pair</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2019-08-24 13:21:48 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Holsters::data_acceptable</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Holsters::holster_pair</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::compile_default_value<button class="popup" onclick="togglePopup('usagePopup1140')">...<span class="popuptext" id="usagePopup1140">Usage of <b>Properties::EitherOr::compile_default_value</b>:<br>Properties - <a href="15-pr.html#SP25">&#167;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">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">) {</span>
2019-08-24 13:21:48 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Holsters::data_acceptable</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">))</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Holsters::holster_pair</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Either/or properties as adjectives. </b>What makes either/or properties linguistically interesting is their use as
adjectives: an open door, a transparent container. Adjectival
meanings arising in this way are of the <code class="display"><span class="extract">EORP_KADJ</span></code> kind, and the following
is called every time an either/or property is created, to create its matching
adjectival meaning:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::create_adjective_from_property<button class="popup" onclick="togglePopup('usagePopup1141')">...<span class="popuptext" id="usagePopup1141">Usage of <b>Properties::EitherOr::create_adjective_from_property</b>:<br><a href="15-ep.html#SP3">&#167;3</a>, <a href="15-ep.html#SP4">&#167;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">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</span><span class="plain"> =</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="4-am.html#SP16">Adjectives::Meanings::new</a></span><span class="plain">(</span><span class="constant">EORP_KADJ</span><span class="plain">, </span><span class="identifier">STORE_POINTER_property</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="functiontext"><a href="4-am.html#SP7">Adjectives::Meanings::declare</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="functiontext"><a href="4-am.html#SP22">Adjectives::Meanings::set_domain_from_kind</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_phrase_registered</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP8">Adjectives::Meanings::get_aph_from_am</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_meaning_registered</span><span class="plain"> = </span><span class="identifier">am</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::make_new_adjective_sense_from_property<button class="popup" onclick="togglePopup('usagePopup1142')">...<span class="popuptext" id="usagePopup1142">Usage of <b>Properties::EitherOr::make_new_adjective_sense_from_property</b>:<br><a href="15-ep.html#SP3">&#167;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">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">aph</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">adjectival_phrase_registered</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-am.html#SP10">Adjectives::Meanings::applicable_to</a></span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</span><span class="plain"> =</span>
2020-04-14 19:56:54 +03:00
<span class="functiontext"><a href="4-am.html#SP16">Adjectives::Meanings::new</a></span><span class="plain">(</span><span class="constant">EORP_KADJ</span><span class="plain">, </span><span class="identifier">STORE_POINTER_property</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="functiontext"><a href="4-am.html#SP7">Adjectives::Meanings::declare</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
<span class="functiontext"><a href="4-am.html#SP22">Adjectives::Meanings::set_domain_from_kind</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>And here are the methods which define <code class="display"><span class="extract">EORP</span></code> adjectives. They arise other
than by parsing, as we've seen, so:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::ADJ_parse<button class="popup" onclick="togglePopup('usagePopup1143')">...<span class="popuptext" id="usagePopup1143">Usage of <b>Properties::EitherOr::ADJ_parse</b>:<br>Adjective Meanings - <a href="4-am.html#SP36">&#167;36</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">,</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sense</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">wording</span><span class="plain"> </span><span class="identifier">DNW</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CONW</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CALLW</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Compiling tests or assertions of these adjectives is easy, because it just
means using their schemata in the usual way...
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::ADJ_compile<button class="popup" onclick="togglePopup('usagePopup1144')">...<span class="popuptext" id="usagePopup1144">Usage of <b>Properties::EitherOr::ADJ_compile</b>:<br>Adjective Meanings - <a href="4-am.html#SP38">&#167;38</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">T</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">emit_flag</span><span class="plain">, </span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<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="SP15"></a><b>&#167;15. </b>...but writing those schemata is not so easy, partly because of the way
either/or properties may be paired, partly because of the attribute storage
optimisation applied to some but not all of them.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::ADJ_compiling_soon<button class="popup" onclick="togglePopup('usagePopup1145')">...<span class="popuptext" id="usagePopup1145">Usage of <b>Properties::EitherOr::ADJ_compiling_soon</b>:<br>Adjective Meanings - <a href="4-am.html#SP37">&#167;37</a></span></button></span><span class="plain">(</span><span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</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">T</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">am</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">"Unregistered adjectival either/or property in either/or atom"</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-am.html#SP31">Adjectives::Meanings::get_ready_flag</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="functiontext"><a href="4-am.html#SP31">Adjectives::Meanings::set_ready_flag</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP23">Adjectives::Meanings::get_domain</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Set the schemata for an either/or property adjective with objects as domain</span> <span class="cwebmacronumber">15.1</span>&gt;
<span class="reserved">else</span>
&lt;<span class="cwebmacro">Set the schemata for an either/or property adjective with some other domain</span> <span class="cwebmacronumber">15.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15_1"></a><b>&#167;15.1. </b>The "objects" domain is not really very different, but it's the one used
overwhelmingly most often, so we will call the relevant routines directly rather
than accessing them via the unifying routines <code class="display"><span class="extract">GProperty</span></code> and <code class="display"><span class="extract">WriteGProperty</span></code> &mdash;
which would work just as well, but more slowly.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set the schemata for an either/or property adjective with objects as domain</span> <span class="cwebmacronumber">15.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-ep.html#SP7">Properties::EitherOr::stored_in_negation</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">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>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">identifier</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">neg</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"GetEitherOrProperty(*1, %n) == false"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_TRUE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"SetEitherOrProperty(*1, %n, true)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_FALSE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"SetEitherOrProperty(*1, %n, false)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">identifier</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>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"GetEitherOrProperty(*1, %n)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_TRUE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"SetEitherOrProperty(*1, %n, false)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_FALSE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"SetEitherOrProperty(*1, %n, true)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="15-ep.html#SP15">&#167;15</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP15_2"></a><b>&#167;15.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Set the schemata for an either/or property adjective with some other domain</span> <span class="cwebmacronumber">15.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-ep.html#SP7">Properties::EitherOr::stored_in_negation</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">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>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"GProperty(%k, *1, %n) == false"</span><span class="plain">, </span><span class="identifier">K</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">neg</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_TRUE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"WriteGProperty(%k, *1, %n)"</span><span class="plain">, </span><span class="identifier">K</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">neg</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_FALSE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"WriteGProperty(%k, *1, %n, true)"</span><span class="plain">, </span><span class="identifier">K</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">neg</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"GProperty(%k, *1, %n)"</span><span class="plain">, </span><span class="identifier">K</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>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_TRUE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"WriteGProperty(%k, *1, %n, true)"</span><span class="plain">, </span><span class="identifier">K</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>
2019-03-17 14:40:57 +02:00
2020-04-14 19:56:54 +03:00
<span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP27">Adjectives::Meanings::set_i6_schema</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">NOW_ADJECTIVE_FALSE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"WriteGProperty(%k, *1, %n)"</span><span class="plain">, </span><span class="identifier">K</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>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="15-ep.html#SP15">&#167;15</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>To assert an adjective like "open" is to draw an inference about its
property.
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::ADJ_assert<button class="popup" onclick="togglePopup('usagePopup1146')">...<span class="popuptext" id="usagePopup1146">Usage of <b>Properties::EitherOr::ADJ_assert</b>:<br>Adjective Meanings - <a href="4-am.html#SP39">&#167;39</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>
2019-03-17 14:40:57 +02:00
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs_to_assert_on</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val_to_assert_on</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain">) {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parity</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext"><a href="16-in.html#SP9">World::Inferences::draw_negated_property</a></span><span class="plain">(</span><span class="identifier">infs_to_assert_on</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">else</span><span class="plain"> </span><span class="functiontext"><a href="16-in.html#SP9">World::Inferences::draw_property</a></span><span class="plain">(</span><span class="identifier">infs_to_assert_on</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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="SP17"></a><b>&#167;17. </b>And finally:
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::EitherOr::ADJ_index<button class="popup" onclick="togglePopup('usagePopup1147')">...<span class="popuptext" id="usagePopup1147">Usage of <b>Properties::EitherOr::ADJ_index</b>:<br>Adjective Meanings - <a href="4-am.html#SP40">&#167;40</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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</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>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"either/or property"</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="15-pr.html#SP14">Properties::permission_list</a></span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" of "</span><span class="plain">); </span><span class="functiontext"><a href="16-pp.html#SP11">World::Permissions::index</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">prn</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">neg</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="15-pr.html#SP14">Properties::permission_list</a></span><span class="plain">(</span><span class="identifier">neg</span><span class="plain">))) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" of "</span><span class="plain">); </span><span class="functiontext"><a href="16-pp.html#SP11">World::Permissions::index</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">neg</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">neg</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", opposite of &lt;/i&gt;%+W&lt;i&gt;"</span><span class="plain">, </span><span class="identifier">neg</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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>
<hr class="tocbar">
<ul class="toc"><li><a href="15-pr.html">Back to 'Properties'</a></li><li><a href="15-vp.html">Continue with 'Valued Properties'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-04-14 19:56:54 +03:00
<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">
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>