1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/21-fao.html
2020-04-07 01:06:09 +01:00

730 lines
95 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>21/rl2</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="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</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="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '21/fao' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#21">Chapter 21: Rules and Rulebooks</a></li><li><b>Focus and Outcome</b></li></ul><p class="purpose">To look after the value or action on which a rulebook acts, and the possible outcomes it produces.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>When a rulebook is being worked through at run-time, a special value or
situation normally gives it a focus &mdash; something to work on. Rulebooks
can have two types:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(A) Action rulebooks, like "Instead of", which take a pattern match on
the current action as their focus: for instance, the rule "Instead of
eating something portable..." is in the "Instead of eating" rulebook but
uses "something portable" as focus.
</li></ul>
<ul class="items"><li>(P) Parametrised rulebooks, like "reaching inside", take (a pattern match
on) a single parameter as their focus. For instance, "A rule for reaching
inside the flask..." has the flask as focus.
</li></ul>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">ACTION_FOCUS</span><span class="plain"> </span><span class="constant">0</span>
<span class="definitionkeyword">define</span> <span class="constant">PARAMETER_FOCUS</span><span class="plain"> </span><span class="constant">1</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">focus</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rulebook_focus</span><span class="plain">; </span><span class="comment">always <code class="display"><span class="extract">ACTION_FOCUS</span></code> or <code class="display"><span class="extract">PARAMETER_FOCUS</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_of_parameter</span><span class="plain">; </span><span class="comment">if created as <code class="display"><span class="extract">NO_FOCUS</span></code>, this is <code class="display"><span class="extract">NULL</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rules_always_test_actor</span><span class="plain">; </span><span class="comment">for action-tied check, carry out, report</span>
<span class="plain">} </span><span class="reserved">focus</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure focus is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Each rulebook reaches one of three possible outcomes: success, failure and
neither (meaning that it proceeded through to the end without any positive
or negative news arising). If a rule does apply to the current
circumstances (i.e., if the parameter is matched successfully) then it can
explicitly choose to produce any of the three outcomes: if it makes no
decision, the result is that stored in the rulebook's
<code class="display"><span class="extract">default_rule_outcome</span></code> field. This is how
</p>
<blockquote>
<p>Instead of going north, say "The snow is too deep."</p>
</blockquote>
<blockquote>
<p>Before going north, say "Well, I'll try..."</p>
</blockquote>
<p class="inwebparagraph">behave differently: the instead rule halts the action, because the instead
rulebook has a default outcome of <code class="display"><span class="extract">FAILURE_OUTCOME</span></code>; the before rule allows
it to proceed, because the default is <code class="display"><span class="extract">NO_OUTCOME</span></code>.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain"> -1 </span><span class="comment">used in parsing only</span>
<span class="definitionkeyword">define</span> <span class="constant">NO_OUTCOME</span><span class="plain"> </span><span class="constant">0</span>
<span class="definitionkeyword">define</span> <span class="constant">SUCCESS_OUTCOME</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">FAILURE_OUTCOME</span><span class="plain"> </span><span class="constant">2</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">outcomes</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_outcome_declared</span><span class="plain">; </span><span class="comment">flag: whether author has declared this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_rule_outcome</span><span class="plain">; </span><span class="comment">success, failure or none: see above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">default_named_outcome</span><span class="plain">; </span><span class="comment">alternative to the above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">named_outcomes</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">value_outcome_kind</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">outcomes</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure outcomes is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>However, a rulebook is allowed to give special problem-specific names to
its outcomes.
</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">named_rulebook_outcome</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">; </span><span class="comment">Name in source text</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">nro_iname</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">named_rulebook_outcome</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">outcome_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kind_of_outcome</span><span class="plain">; </span><span class="comment">one of the three values above</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">rulebook_outcome</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure named_rulebook_outcome 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/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure rulebook_outcome is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ns, 7/oaf, 7/rs, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::initialise_outcomes</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain">) {</span>
<span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">value_outcome_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_outcome_declared</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">def</span><span class="plain">;</span>
<span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_named_outcome</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::set_default_outcome</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain">) {</span>
<span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">def</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_outcome_kind</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">value_outcome_kind</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::Outcomes::initialise_outcomes is used in 21/rl2 (<a href="21-rl2.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::set_default_outcome is used in 21/rl2 (<a href="21-rl2.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::get_outcome_kind is used in 21/rl2 (<a href="21-rl2.html#SP10">&#167;10</a>, <a href="21-rl2.html#SP22">&#167;22</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>There are only three nameless outcomes: a rulebook can end in success, in
failure, or with no outcome. Any of these can be the default outcome, that is,
can be what rulebook does if it none of its rules cause an outcome.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">default</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make this the rulebook's new default</span> <span class="cwebmacronumber">6.1</span>&gt;
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BadDefaultOutcome problem</span> <span class="cwebmacronumber">6.2</span>&gt;
<span class="plain">&lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; ::=</span>
<span class="identifier">success</span><span class="plain"> | ==&gt; </span><span class="constant">SUCCESS_OUTCOME</span>
<span class="identifier">failure</span><span class="plain"> | ==&gt; </span><span class="constant">FAILURE_OUTCOME</span>
<span class="identifier">no</span><span class="plain"> </span><span class="identifier">outcome</span><span class="plain"> ==&gt; </span><span class="constant">NO_OUTCOME</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make this the rulebook's new default</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_outcome_declared</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultOutcomeTwice</span><span class="plain">),</span>
<span class="string">"the default outcome for this rulebook has already been declared"</span><span class="plain">,</span>
<span class="string">"and this is something which can only be done once."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_outcome_declared</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1];</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BadDefaultOutcome problem</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadDefaultOutcome</span><span class="plain">),</span>
<span class="string">"the default outcome given for the rulebook isn't what I expected"</span><span class="plain">,</span>
<span class="string">"which would be one of 'default success', 'default failure' or "</span>
<span class="string">"'default no outcome'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</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="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Rulebooks can alternatively supply any number of named outcomes, though
each of these still has one of the three results noted above; which will be
"success" unless it's explicitly given.
</p>
<p class="inwebparagraph">The following parses a declaration of named outcomes. For example:
</p>
<blockquote>
<p>there is sufficient light (failure) and there is insufficient light (success)</p>
</blockquote>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; ::=</span>
<span class="plain">... | ==&gt; </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">preform_lookahead_mode</span><span class="plain">; </span><span class="comment">match only when looking ahead</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; | ==&gt; </span><span class="constant">0</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ==&gt; </span><span class="constant">0</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; ::=</span>
<span class="plain">, </span><span class="identifier">_and</span><span class="plain">/</span><span class="identifier">or</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; | ==&gt; </span><span class="constant">0</span>
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">and</span><span class="plain">/</span><span class="identifier">or</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; ==&gt; </span><span class="constant">0</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; ==&gt; </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">preform_lookahead_mode</span><span class="plain">) </span>&lt;<span class="cwebmacro">Adopt this new named rule outcome</span> <span class="cwebmacronumber">8.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; ::=</span>
<span class="plain">... ( &lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; - </span><span class="identifier">the</span><span class="plain"> </span><span class="reserved">default</span><span class="plain"> ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span>
<span class="plain">... ( &lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; - </span><span class="reserved">default</span><span class="plain"> ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span>
<span class="plain">... ( &lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span>
<span class="plain">... ( ... ) | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BadOutcomeClarification problem</span> <span class="cwebmacronumber">8.1</span>&gt;
<span class="plain">... ==&gt; </span><span class="constant">SUCCESS_OUTCOME</span><span class="plain">; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span>
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">outcomes</span><span class="plain">&gt; ::=</span>
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">very</span><span class="plain"> </span><span class="identifier">likely</span><span class="plain"> |</span>
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">likely</span><span class="plain"> |</span>
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">possible</span><span class="plain"> |</span>
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">unlikely</span><span class="plain"> |</span>
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">very</span><span class="plain"> </span><span class="identifier">unlikely</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BadOutcomeClarification problem</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadOutcomeClarification</span><span class="plain">),</span>
<span class="string">"the bracketed clarification isn't what I expected"</span><span class="plain">,</span>
<span class="string">"which would be one of '(success)', '(failure)' or '(no outcome)'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Adopt this new named rule outcome</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt;, </span><span class="constant">1</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</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">default_rbno_flag</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_named_outcome</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultNamedOutcomeTwice</span><span class="plain">),</span>
<span class="string">"at most one of the named outcomes from a rulebook "</span>
<span class="string">"can be the default"</span><span class="plain">,</span>
<span class="string">"and here we seem to have two."</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="identifier">def</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">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_outcome_declared</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultOutcomeAlready</span><span class="plain">),</span>
<span class="string">"the default outcome for this rulebook has already "</span>
<span class="string">"been declared"</span><span class="plain">,</span>
<span class="string">"and this is something which can only be done once."</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="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_outcome_declared</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="identifier">koo</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">koo</span><span class="plain"> != </span><span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain">) {</span>
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="functiontext">Rulebooks::Outcomes::rbno_by_name</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">, *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dup</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="identifier">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) </span><span class="identifier">dup</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">last</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dup</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DuplicateOutcome</span><span class="plain">),</span>
<span class="string">"this duplicates a previous assignment of the same outcome"</span><span class="plain">,</span>
<span class="string">"and to the same rulebook."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">nro</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">nro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain"> = </span><span class="identifier">rbno</span><span class="plain">;</span>
<span class="identifier">nro</span><span class="plain">-&gt;</span><span class="element">kind_of_outcome</span><span class="plain"> = </span><span class="identifier">koo</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">def</span><span class="plain">) </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">default_named_outcome</span><span class="plain"> = </span><span class="identifier">nro</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last</span><span class="plain">) </span><span class="identifier">last</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain"> = </span><span class="identifier">nro</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-&gt;</span><span class="element">named_outcomes</span><span class="plain"> = </span><span class="identifier">nro</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="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>This family of constants (named rulebook outcomes) is special because it
can be used in a void context as a sort of return-from-rule phrase.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; </span><span class="identifier">internal</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="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">K_rulebook_outcome</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">p</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>&#167;10. </b></p>
<pre class="display">
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::rbno_by_name</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">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">K_rulebook_outcome</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rvalues::to_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Hierarchy::local_package</span><span class="plain">(</span><span class="constant">OUTCOMES_HAP</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::markup_wording</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="constant">OUTCOME_NAME_HMD</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain"> = </span><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="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">));</span>
<span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">OUTCOME_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">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">outcomes</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = -1;</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO4_INAME_HL</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">i</span><span class="plain"> = </span><span class="constant">RBNO3_INAME_HL</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">i</span><span class="plain"> = </span><span class="constant">RBNO2_INAME_HL</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">i</span><span class="plain"> = </span><span class="constant">RBNO1_INAME_HL</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">4</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO0_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &gt;= </span><span class="constant">0</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">Hierarchy::find</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_iname_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</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">rbno</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::compile_default_outcome</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbo</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_named_outcome</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbo</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">rbo</span><span class="plain">-&gt;</span><span class="element">kind_of_outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbo</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">rtrue</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="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbo</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">rtrue</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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">rtrue</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="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">rtrue</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="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rtrue</span><span class="plain">) </span><span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::rbo_from_context</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">phrase_being_compiled</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</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">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_contains_ph</span><span class="plain">(</span><span class="functiontext">Rulebooks::first_booking</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">), </span><span class="identifier">ph</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ro</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">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::allow_outcome</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::Context::outcome_restrictions_waived</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">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">phrase_being_compiled</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</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">NULL</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_contains_ph</span><span class="plain">(</span><span class="functiontext">Rulebooks::first_booking</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">), </span><span class="identifier">ph</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="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</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="reserved">return</span><span class="plain"> </span><span class="identifier">rb</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">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::compile_outcome</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbo</span><span class="plain"> = </span><span class="functiontext">Rulebooks::Outcomes::rbo_from_context</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbo</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) {</span>
<span class="identifier">rbo</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">;</span>
<span class="reserved">break</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">rbo</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">"rbno with no rb context"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">rbo</span><span class="plain">-&gt;</span><span class="element">kind_of_outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</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">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NO_OUTCOME:</span>
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad RBO outcome kind"</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">Rulebooks::Outcomes::index_outcomes</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_outcome</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suppress_outcome</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="element">outcome_name</span><span class="plain">;</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;outcome&lt;/i&gt;&amp;nbsp;&amp;nbsp;"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">ro</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">ro</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt; (default)"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" - &lt;i&gt;"</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">ro</span><span class="plain">-&gt;</span><span class="identifier">kind_of_outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"a success"</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="identifier">FAILURE_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"a failure"</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="identifier">NO_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"no outcome"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/i&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</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">outs</span><span class="plain">-&gt;</span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain"> != </span><span class="constant">NO_OUTCOME</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">suppress_outcome</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;default outcome is&lt;/i&gt; "</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">outs</span><span class="plain">-&gt;</span><span class="element">default_rule_outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"success"</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="identifier">FAILURE_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"failure"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</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">Rulebooks::Outcomes::RulebookOutcomePrintingRule</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">, </span><span class="reserved">named_rulebook_outcome</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain">));</span>
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</span><span class="plain">, </span><span class="identifier">RV</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">printing_rule_name</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">printing_rule_name</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rbnov_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"rbno"</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IFELSE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbnov_s</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"(no outcome)"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINTSTRING_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbnov_s</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_default_value</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">, </span><span class="reserved">named_rulebook_outcome</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rbno</span><span class="plain">-&gt;</span><span class="element">nro_iname</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="endnote">The function Rulebooks::Outcomes::rbno_by_name is used in <a href="#SP8_2">&#167;8.2</a>.</p>
<p class="endnote">The function Rulebooks::Outcomes::compile_default_outcome is used in 22/prcd (<a href="22-prcd.html#SP10_1">&#167;10.1</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::rbo_from_context appears nowhere else.</p>
<p class="endnote">The function Rulebooks::Outcomes::allow_outcome is used in 25/cp (<a href="25-cp.html#SP5_3_3">&#167;5.3.3</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::compile_outcome is used in 25/cp (<a href="25-cp.html#SP5_3_3">&#167;5.3.3</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::index_outcomes is used in 21/rl2 (<a href="21-rl2.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::RulebookOutcomePrintingRule is used in 1/htc (<a href="1-htc.html#SP2_7">&#167;2.7</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::get_default_value is used in 13/rsfk (<a href="13-rsfk.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::initialise_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">parameter_kind</span><span class="plain">) {</span>
<span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rules_always_test_actor</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parametrisation</span><span class="plain"> = </span><span class="constant">PARAMETER_FOCUS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">parameter_kind</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">)) </span><span class="identifier">parametrisation</span><span class="plain"> = </span><span class="constant">ACTION_FOCUS</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">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">parameter_kind</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">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookIndefinite</span><span class="plain">),</span>
<span class="string">"this is a rulebook for values of a kind which isn't definite"</span><span class="plain">,</span>
<span class="string">"and doesn't tell me enough about what sort of value the rulebook "</span>
<span class="string">"should work on. For example, 'The mystery rules are a number based "</span>
<span class="string">"rulebook' is fine because 'number' is definite, but 'The mystery "</span>
<span class="string">"rules are a value based rulebook' is too vague."</span><span class="plain">);</span>
<span class="identifier">parameter_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">kind_of_parameter</span><span class="plain"> = </span><span class="identifier">parameter_kind</span><span class="plain">;</span>
<span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rulebook_focus</span><span class="plain"> = </span><span class="identifier">parametrisation</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::Outcomes::initialise_focus is used in 21/rl2 (<a href="21-rl2.html#SP10">&#167;10</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::modify_rule_to_suit_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rules_always_test_actor</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
<span class="string">"Setting always test actor for destination rulebook\n"</span><span class="plain">);</span>
<span class="functiontext">Rules::set_always_test_actor</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rulebook_focus</span><span class="plain"> == </span><span class="constant">PARAMETER_FOCUS</span><span class="plain">){</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
<span class="string">"Setting never test actor for destination rulebook\n"</span><span class="plain">);</span>
<span class="functiontext">Rules::set_never_test_actor</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::get_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rulebook_focus</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_focus_parameter_kind</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">kind_of_parameter</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::set_focus_ata</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ata</span><span class="plain">) {</span>
<span class="identifier">foc</span><span class="plain">-&gt;</span><span class="element">rules_always_test_actor</span><span class="plain"> = </span><span class="identifier">ata</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::Outcomes::modify_rule_to_suit_focus is used in 21/rl2 (<a href="21-rl2.html#SP19">&#167;19</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::get_focus is used in 21/rl2 (<a href="21-rl2.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::get_focus_parameter_kind is used in 21/rl2 (<a href="21-rl2.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Rulebooks::Outcomes::set_focus_ata is used in 21/rl2 (<a href="21-rl2.html#SP10">&#167;10</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="21-rl2.html">Back to 'Rulebooks'</a></li><li><a href="21-rps.html">Continue with 'Rule Placement Sentences'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>