1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 14:04:24 +03:00
inform7/docs/imperative-module/2-rlb.html

920 lines
164 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Rulebooks</title>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-05-03 03:01:21 +03:00
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-05-03 03:01:21 +03:00
<script>
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-05-09 01:13:45 +03:00
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
2020-05-03 03:01:21 +03:00
<body class="commentary-font">
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
2020-05-03 18:34:53 +03:00
<img src="../docs-assets/Inform.png" height=72">
2020-04-14 19:56:54 +03:00
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-08-26 12:52:50 +03:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
2021-02-07 14:44:02 +02:00
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="index.html"><span class="selectedlink">imperative</span></a></li>
2020-08-26 12:52:50 +03:00
<li><a href="../runtime-module/index.html">runtime</a></li>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-05-20 02:02:28 +03:00
</ul><h2>Services</h2><ul>
2020-04-14 19:56:54 +03:00
<li><a href="../arch-module/index.html">arch</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../calculus-module/index.html">calculus</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../html-module/index.html">html</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../inflections-module/index.html">inflections</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../kinds-module/index.html">kinds</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-05-03 03:01:21 +03:00
<!--Weave of 'Rulebooks' generated by Inweb-->
<div class="breadcrumbs">
2021-02-07 14:44:02 +02:00
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Rules and Rulebooks</a></li><li><b>Rulebooks</b></li></ul></div>
2021-03-21 01:55:57 +02:00
<p class="purpose">Rulebooks collate rules and provide an organised way for them to collaborate on a larger task.</p>
2019-03-17 14:40:57 +02:00
2021-03-21 01:55:57 +02:00
<ul class="toc"><li><a href="2-rlb.html#SP7">&#167;7. Construction</a></li><li><a href="2-rlb.html#SP10">&#167;10. Reading properties of rulebooks</a></li><li><a href="2-rlb.html#SP11">&#167;11. Rulebook variables</a></li><li><a href="2-rlb.html#SP13">&#167;13. Indexing and logging rulebooks</a></li><li><a href="2-rlb.html#SP14">&#167;14. Name parsing of rulebooks</a></li><li><a href="2-rlb.html#SP17">&#167;17. Rule attachments</a></li><li><a href="2-rlb.html#SP18">&#167;18. Parsing rulebook properties</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>A rulebook consists of some general properties together with a linked list
2019-03-17 14:40:57 +02:00
of booked rules, which constitute its entries. Some rulebooks are created
explicitly by the user's source text, some are created explicitly by the
Standard Rules, while others are "automatically generated" as a result
of other creations by Inform. For instance, each new scene ending generates
a rulebook. There are numerous other examples because a rulebook is the
natural and most flexible way to provide a "hook" by which to attach
behaviour to a world model.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">In some ways phrases and rules are really subsidiary ideas, and the
2019-03-17 14:40:57 +02:00
rulebook is the fundamental level of programming in Inform 7. The reason it
turns up so late in the source code is that many of the other data
2020-05-03 03:01:21 +03:00
structures were building up to this one: a <span class="extract"><span class="extract-syntax">rulebook</span></span> contains <span class="extract"><span class="extract-syntax">booking</span></span>s
which refer to <span class="extract"><span class="extract-syntax">phrase</span></span>s whose usage is defined with <span class="extract"><span class="extract-syntax">specification</span></span>s, and
whose definition is stored in the <span class="extract"><span class="extract-syntax">parse_node</span></span> tree until it can be
resolved as a list of <span class="extract"><span class="extract-syntax">invocation</span></span>s.
2019-03-17 14:40:57 +02:00
</p>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The semantics of rulebooks have grown over time. At one time they looked
2019-03-17 14:40:57 +02:00
only at the current action, and did something accordingly, but there was
no real sense in which they passed information. They then began to apply
to objects or actions (this was called the "focus") and, in a few cases,
returned information by ending in success, failure or neither (the
"outcome"). Gradually they became more function-like: today, the focus can
be a value of any kind, or else the current action; and the outcome can be
success, failure, neither, a named outcome, or else a value of any kind.
Moreover they can have variables shared by all rules in the current
instantiation of the rulebook. A rulebook is thus able to do anything which
2020-04-14 19:56:54 +03:00
a function \(X\to Y\) in a standard programming language can do; in 2009, it
2019-03-17 14:40:57 +02:00
was a particular goal of the rewriting of the kinds system to ensure that
rulebooks could, in principle, do anything which functions could do in a
language such as Haskell.
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">primary_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> name in source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">alternative_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> alternative form of name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">fragmentation_stem_length</span><span class="plain-syntax">; </span><span class="comment-syntax"> to do with parsing, but 0 for most rulebooks</span>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">focus</span><span class="plain-syntax"> </span><span class="identifier-syntax">my_focus</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">outcomes</span><span class="plain-syntax"> </span><span class="identifier-syntax">my_outcomes</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">automatically_generated</span><span class="plain-syntax">; </span><span class="comment-syntax"> so that the index can omit these</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">runs_during_activities</span><span class="plain-syntax">; </span><span class="comment-syntax"> allow "while..." clauses to name these</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used_by_future_action_activity</span><span class="plain-syntax">; </span><span class="comment-syntax"> like "deciding the scope of something..."</span>
2019-03-17 14:40:57 +02:00
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">booking_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">contents</span><span class="plain-syntax">; </span><span class="comment-syntax"> linked list of booked rules</span>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owned_by_rb</span><span class="plain-syntax">; </span><span class="comment-syntax"> rulebook variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">accessible_from_rb</span><span class="plain-syntax">; </span><span class="comment-syntax"> and which can be named here</span>
2019-03-17 14:40:57 +02:00
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_indexing_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">indexing_data</span><span class="plain-syntax">;</span>
2020-05-09 15:07:39 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">} </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<ul class="endnotetexts"><li>The structure rulebook is accessed in 2/rls, 2/fao, 3/pu, 6/cp and here.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>The following is used only to store the result of parsing text as a
2019-03-17 14:40:57 +02:00
rulebook name:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_from</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_length</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">advance_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tail_words</span><span class="plain-syntax">;</span>
2020-07-01 02:58:55 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">article</span><span class="plain-syntax"> *</span><span class="identifier-syntax">article_used</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">placement_requested</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-02-07 14:44:02 +02:00
<ul class="endnotetexts"><li>The structure rulebook_match is accessed in 3/pu and here.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The contents of rulebooks can be unexpected if sentences are used which
2019-03-17 14:40:57 +02:00
explicitly list, or unlist, rules. To make the index more useful in these
cases, we keep a linked list, for each rulebook, of all sentences which
have affected it in this way:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">placement_affecting</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">placement_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">placement_affecting</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">;</span>
2020-05-09 15:07:39 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">} </span><span class="reserved-syntax">placement_affecting</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-20 02:08:32 +02:00
<ul class="endnotetexts"><li>The structure placement_affecting is accessed in 2/fao, 2/sv, 2/act, 3/rs, 3/phr, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>As rulebooks are declared, the first few are quietly copied into
2019-03-17 14:40:57 +02:00
a small array: that way, we can always obtain a pointer to, say, the
2020-05-03 03:01:21 +03:00
turn sequence rules by looking up <span class="extract"><span class="extract-syntax">built_in_rulebooks[TURN_SEQUENCE_RB]</span></span>.
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax"> </span><span class="constant-syntax">64</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Many of the standard rulebooks need to have numbers which are
2019-03-17 14:40:57 +02:00
predictable, because they need to be referred to by number by the I6
library code. Because of this, it is important not to change the numbers
below without checking the corresponding I6 Constant declarations in the
2020-05-03 03:01:21 +03:00
<span class="extract"><span class="extract-syntax">Definitions.i6t</span></span> file: the two sets of declarations must exactly match. They
2019-03-17 14:40:57 +02:00
must also exactly match the sequence in which these rulebooks are created
in the Standard Rules file.
</p>
2020-05-03 03:01:21 +03:00
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">STARTUP_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="comment-syntax"> Startup rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SHUTDOWN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> Shutdown rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">TURN_SEQUENCE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">11</span><span class="plain-syntax"> </span><span class="comment-syntax"> Turn sequence rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SCENE_CHANGING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">12</span><span class="plain-syntax"> </span><span class="comment-syntax"> Scene changing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_PLAY_BEGINS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">13</span><span class="plain-syntax"> </span><span class="comment-syntax"> When play begins</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_PLAY_ENDS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">14</span><span class="plain-syntax"> </span><span class="comment-syntax"> When play ends</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_SCENE_BEGINS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">15</span><span class="plain-syntax"> </span><span class="comment-syntax"> When scene begins</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_SCENE_ENDS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">16</span><span class="plain-syntax"> </span><span class="comment-syntax"> When scene ends</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">EVERY_TURN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">17</span><span class="plain-syntax"> </span><span class="comment-syntax"> Every turn</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">18</span><span class="plain-syntax"> </span><span class="comment-syntax"> Action-processing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SETTING_ACTION_VARIABLES_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">19</span><span class="plain-syntax"> </span><span class="comment-syntax"> Setting action variables rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax"> </span><span class="comment-syntax"> Specific action-processing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PLAYERS_ACTION_AWARENESS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">21</span><span class="plain-syntax"> </span><span class="comment-syntax"> Player's action awareness rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">ACCESSIBILITY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">22</span><span class="plain-syntax"> </span><span class="comment-syntax"> Accessibility rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REACHING_INSIDE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">23</span><span class="plain-syntax"> </span><span class="comment-syntax"> Reaching inside rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REACHING_OUTSIDE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">24</span><span class="plain-syntax"> </span><span class="comment-syntax"> Reaching outside rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">VISIBILITY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span><span class="plain-syntax"> </span><span class="comment-syntax"> Visibility rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PERSUASION_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">26</span><span class="plain-syntax"> </span><span class="comment-syntax"> Persuasion rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">27</span><span class="plain-syntax"> </span><span class="comment-syntax"> Unsuccessful attempt by</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">BEFORE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">28</span><span class="plain-syntax"> </span><span class="comment-syntax"> Before rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">INSTEAD_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">29</span><span class="plain-syntax"> </span><span class="comment-syntax"> Instead rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CHECK_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">30</span><span class="plain-syntax"> </span><span class="comment-syntax"> Check</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CARRY_OUT_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">31</span><span class="plain-syntax"> </span><span class="comment-syntax"> Carry out rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">AFTER_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span><span class="plain-syntax"> </span><span class="comment-syntax"> After rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REPORT_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">33</span><span class="plain-syntax"> </span><span class="comment-syntax"> Report</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">DOES_THE_PLAYER_MEAN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">34</span><span class="plain-syntax"> </span><span class="comment-syntax"> Does the player mean...? rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MULTIPLE_ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">35</span><span class="plain-syntax"> </span><span class="comment-syntax"> For changing or reordering multiple actions</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Construction. </b>When a rulebook is to be created, we do a little treatment on its name. We
2019-03-17 14:40:57 +02:00
remove any article, and also strip off the suffix "rules" or "rulebook"
as redundant &mdash; see below for why. Since we want to insure that phrase/rule
preambles are unambiguous, we also want to make sure that keywords introducing
phrase definitions and timed events don't open the rulebook name.
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;definite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 2 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rules/rulebook</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
2021-02-07 14:44:02 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">at</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithAt problem</span><span class="named-paragraph-number">7.1</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithTo problem</span><span class="named-paragraph-number">7.2</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">definition</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithDefinition problem</span><span class="named-paragraph-number">7.3</span></a></span>
2021-02-06 20:00:34 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, - }</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithAt problem</span><span class="named-paragraph-number">7.1</span></span><span class="Preform-comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithAt</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'at'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the way people write rules. A rule beginning with 'At' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is one which happens at a given time, whereas a rule "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"belonging to a rulebook starts with the name of that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rulebook, so a rulebook named 'at ...' would make such "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-02-07 14:44:02 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP7">&#167;7</a>.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>&#167;7.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithTo problem</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithTo</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'to'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the way people write rules. A rule beginning with 'To' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is one which defines a phrase, whereas a rule "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"belonging to a rulebook starts with the name of that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rulebook, so a rulebook named 'to ...' would make such "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-02-07 14:44:02 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP7">&#167;7</a>.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>&#167;7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithDefinition problem</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithDefinition</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'definition'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the way people write rules. A rule beginning with 'Definition' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is one which defines an adjective, whereas a rule "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"belonging to a rulebook starts with the name of that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rulebook, so a rulebook named 'to ...' would make such "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-02-07 14:44:02 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP7">&#167;7</a>.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>When a rulebook is created &mdash; say, "coordination" &mdash; Inform constructs
2019-03-17 14:40:57 +02:00
alternative names for it using the following &mdash; say, making "coordination
rules" and "coordination rulebook":
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-name-construction&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rules</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rulebook</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2020-08-18 00:57:45 +03:00
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>Whereas, at run-time, rulebooks are special cases of rules (they have the
2019-03-17 14:40:57 +02:00
same kind of value, though their I6 values are such as to make it possible
2019-03-19 01:36:20 +02:00
to distinguish them), within I7 rulebooks and rules have entirely different
2019-03-17 14:40:57 +02:00
data structures. There are two constructor functions: a basic one, used
for those created by typical source text, and an advanced one used when
rulebooks are automatically created as a result of other structures being
built (for instance, scene endings).
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">create_as</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Hierarchy::markup_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">RULEBOOK_NAME_HMD</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">);</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="function-syntax">&lt;new-rulebook-name&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;new-rulebook-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax"> = </span><a href="2-bl.html#SP4" class="function-link"><span class="function-syntax">BookingLists::new</span></a><span class="plain-syntax">();</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">automatically_generated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">create_as</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax">);</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP10" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::initialise_focus</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">), </span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">NO_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax"> == </span><span class="constant-syntax">INSTEAD_RB</span><span class="plain-syntax">) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">FAILURE_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax"> == </span><span class="constant-syntax">AFTER_RB</span><span class="plain-syntax">) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">SUCCESS_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax"> == </span><span class="constant-syntax">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain-syntax">) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">SUCCESS_OUTCOME</span><span class="plain-syntax">;</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::initialise_outcomes</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">), </span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">def</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owned_by_rb</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::new_owner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_from_rb</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_owner_to_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owned_by_rb</span><span class="plain-syntax">);</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTRules::new_rulebook_compilation_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indexing_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IXRules::new_rulebook_indexing_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">] = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">])</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_owner_to_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owned_by_rb</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">,</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-02-07 14:44:02 +02:00
<span class="reserved-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_outcomes</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_outcomes</span></span>:<br/>Focus and Outcome - <a href="2-fao.html#SP9">&#167;9</a><br/>Phrase Runtime Context Data - <a href="3-prcd.html#SP9_1">&#167;9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
2021-03-20 12:48:57 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::contains_kind</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::contains_kind</span></span>:<br/>Rules - <a href="2-rls.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-08-18 00:57:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rule</span><span class="plain-syntax">,</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-rlb.html#SP10" class="function-link"><span class="function-syntax">Rulebooks::get_parameter_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">),</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_outcome_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">)));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2020-08-26 12:52:50 +03:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::to_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-08-18 00:57:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rulebook</span><span class="plain-syntax">,</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-rlb.html#SP10" class="function-link"><span class="function-syntax">Rulebooks::get_parameter_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">),</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_outcome_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">)));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-02-07 14:44:02 +02:00
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::new_automatic</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::new_automatic</span></span>:<br/>Activities - <a href="2-act.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">basis</span><span class="plain-syntax">,</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">oc</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ata</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ubfaa</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rda</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> = </span><a href="2-rlb.html#SP9" class="function-link"><span class="function-syntax">Rulebooks::new</span></a><span class="plain-syntax">(</span>
2020-08-18 00:57:45 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rulebook</span><span class="plain-syntax">, </span><span class="identifier-syntax">basis</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::set_default_outcome</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">), </span><span class="identifier-syntax">oc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-fao.html#SP11" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::set_focus_ata</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">), </span><span class="identifier-syntax">ata</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">automatically_generated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ubfaa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rda</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::set_alt_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::fragment_by_actions</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">wn</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-03-20 17:41:45 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::requires_specific_action</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">CHECK_RB</span><span class="plain-syntax">]) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">CARRY_OUT_RB</span><span class="plain-syntax">]) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">REPORT_RB</span><span class="plain-syntax">]) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Reading properties of rulebooks. </b>Those readable from outside the current section.
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::focus</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::focus</span></span>:<br/><a href="2-rlb.html#SP17">&#167;17</a><br/>Phrase Usage - <a href="3-pu.html#SP10_3_1_1">&#167;10.3.1.1</a>, <a href="3-pu.html#SP20_1_1">&#167;20.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP11" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_focus</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_parameter_kind</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_parameter_kind</span></span>:<br/><a href="2-rlb.html#SP9">&#167;9</a><br/>Phrase Usage - <a href="3-pu.html#SP20_1_1">&#167;20.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP11" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_focus_parameter_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::used_by_future_actions</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::used_by_future_actions</span></span>:<br/>Activities - <a href="2-act.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::is_empty</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::is_empty</span></span>:<br/>Activities - <a href="2-act.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::is_contextually_empty</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">rc</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::no_rules</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::no_rules</span></span>:<br/>Activities - <a href="2-act.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::length</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2020-08-26 12:52:50 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::rule_in_rulebook</span><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::contains</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-20 17:41:45 +02:00
<span class="reserved-syntax">booking</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::first_booking</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::first</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::runs_during_activities</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::runs_during_activities</span></span>:<br/>Phrase Usage - <a href="3-pu.html#SP10_3_1_1">&#167;10.3.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Rulebook variables. </b>Any new rulebook variable name is vetted by being run through this:
2019-03-17 14:40:57 +02:00
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-variable-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2021-03-21 01:55:57 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;unfortunate-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP11_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookVariableAnd problem</span><span class="named-paragraph-number">11.1</span></a></span>
2021-02-06 20:00:34 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>&#167;11.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookVariableAnd problem</span><span class="named-paragraph-number">11.1</span></span><span class="Preform-comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableAnd</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a new named variable for a rulebook - a value associated "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"with a rulebook and which has a name. The request seems to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"say that the name in question is '%2', but I'd prefer to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"avoid 'and', 'or', 'with', or 'having' in such names, please."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
2020-07-28 21:19:38 +03:00
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">, - };</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b></p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::add_variable</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">) != </span><span class="identifier-syntax">PROPERTYCALLED_NT</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVarUncalled</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a new named variable for an rulebook - a value associated "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"with a action and which has a name. But since you only give "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a kind, not a name, I'm stuck. ('The every turn rulebook has a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"number called importance' is right, 'The every turn rulebook has a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"number' is too vague.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2020-05-11 17:21:29 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;rulebook-variable-name&gt;(Node::get_text(cnode-&gt;down-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">))) {</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;s-type-expression&gt;(Node::get_text(cnode-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">))) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Specifications::is_description</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Descriptions::is_qualified</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">))) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableTooSpecific</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a new named variable for a rulebook - a value associated "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"with a rulebook and which has a name. The request seems to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"say that the value in question is '%2', but this is too "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"specific a description. (Instead, a kind of value "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(such as 'number') or a kind of object (such as 'room' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"or 'thing') should be given. To get a property whose "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"contents can be any kind of object, use 'object'.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">)) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Offending SP: $T"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableBadKind</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but '%2' is not the name of a kind of "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"value which I know (such as 'number' or 'text')."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableKindless</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but I was expecting to see a kind of value there, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and '%2' isn't something I recognise as a kind."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">)) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableVague</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but saying that a variable is a 'value' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"does not give me a clear enough idea what it will hold. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You need to say what kind of value: for instance, 'A door "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"has a number called street address.' is allowed because "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'number' is specific about the kind of value."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_empty</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owned_by_rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">), </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::make_stvs_accessible</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::make_stvs_accessible</span></span>:<br/>Activities - <a href="2-act.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_owner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stvo</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_from_rb</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_owner_to_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_from_rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">stvo</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Indexing and logging rulebooks. </b></p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::log_name_only</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::log_name_only</span></span>:<br/>Phrase Usage - <a href="3-pu.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Rulebook %d (%W)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
2021-02-07 14:44:02 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::log</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-rlb.html#SP13" class="function-link"><span class="function-syntax">Rulebooks::log_name_only</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">": "</span><span class="plain-syntax">);</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-bl.html#SP3" class="function-link"><span class="function-syntax">BookingLists::log</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::no_rule_context</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::no_rule_context</span></span>:<br/>Activities - <a href="2-act.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">action_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">not_used</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::phrase_fits_rule_context</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::phrase_fits_rule_context</span></span>:<br/>Booking Lists - <a href="2-bl.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="identifier-syntax">scene_context</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-prcd.html#SP5" class="function-link"><span class="function-syntax">Phrases::Context::get_scene</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">)) != </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
2021-02-07 14:44:02 +02:00
<span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::action_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">action_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">an</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-02-07 14:44:02 +02:00
<span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::scene_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">scene</span><span class="plain-syntax"> *</span><span class="identifier-syntax">s</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">action_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</span><span class="plain-syntax"> = </span><span class="identifier-syntax">s</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Name parsing of rulebooks. </b>The following internal finds the "stem" of a rule, that is, the part
2019-03-17 14:40:57 +02:00
which identifies which rulebook it will go into. For example, in
</p>
<blockquote>
<p>Before printing the name of the peach: ...</p>
</blockquote>
<blockquote>
<p>Instead of eating: ...</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">the stems are "before printing the name" and "instead". It makes use
2019-03-17 14:40:57 +02:00
of &lt;rulebook-stem-inner&gt; below, and then does some direct parsing.
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-stem&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">?</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
2021-03-21 01:55:57 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">rulebook_match</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax"> = </span><a href="2-rlb.html#SP16" class="function-link"><span class="Preform-function-syntax">Rulebooks::rb_match_from_description</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">.</span><span class="Preform-identifier-syntax">matched_rulebook</span><span class="Preform-plain-syntax"> == </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">) { ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> }; }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parsed_rm</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Wordings::first_wn</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">) + </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">.</span><span class="Preform-element-syntax">advance_words</span><span class="Preform-plain-syntax"> - </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. </b>Suppose this is our rule:
2019-03-17 14:40:57 +02:00
</p>
<blockquote>
<p>The first rule for printing the name of something: ...</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">the following grammar peels away the easier-to-read indications at the
2019-03-17 14:40:57 +02:00
front. It notes the use of "The", and the placement "first"; it throws
away other verbiage so that &lt;rulebook-stem-name&gt; matches
</p>
<blockquote>
<p>printing the name of something</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">&lt;rulebook-stem&gt; then takes over again and searches for the longest possible
2019-03-17 14:40:57 +02:00
rulebook name at the start of the stem. So if there were a rulebook called
"printing", it wouldn't match here, because "printing the name" is longer.
(&lt;rulebook-stem&gt; doesn't match the "of".)
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">Productions (a) and (b) of &lt;rulebook-stem-name&gt; are slightly hacky exceptions
2019-03-17 14:40:57 +02:00
to allow for the "when S begins" rulebooks, where S can be any description
of a scene rather than just a scene's name. In effect, the stem here consists
of the two outer words and is discontiguous.
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-stem-inner&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;indefinite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1], &lt;&lt;place&gt;&gt; = R[2] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;definite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1], &lt;&lt;place&gt;&gt; = R[2] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, NULL, &lt;&lt;place&gt;&gt; = R[1] }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">for/about/on</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">first</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FIRST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">first</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FIRST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">last</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { LAST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">last</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { LAST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">begins}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 2, -, &lt;&lt;rulebook:m&gt;&gt; = built_in_rulebooks[WHEN_SCENE_BEGINS_RB] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ends}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 2, -, &lt;&lt;rulebook:m&gt;&gt; = built_in_rulebooks[WHEN_SCENE_ENDS_RB] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, -, &lt;&lt;rulebook:m&gt;&gt; = NULL }</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. </b></p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::rb_match_from_description</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::rb_match_from_description</span></span>:<br/><a href="2-rlb.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
2020-07-08 01:49:36 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="constant-syntax">MIDDLE_PLACEMENT</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="function-syntax">&lt;rulebook-stem-inner&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-stem-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
2020-07-08 01:49:36 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">article_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">au</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">article_usage</span><span class="plain-syntax"> *) </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;place&gt;&gt;</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) - </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">tail_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-07-08 01:49:36 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">article_used</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">au</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">au</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">article_used</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">placement_requested</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">) {</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;&lt;rulebook:m&gt;&gt;</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="function-syntax">&lt;&lt;len&gt;&gt;</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;len&gt;&gt;</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">match_length</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax">;</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;&lt;rulebook:m&gt;&gt;</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">tail_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">match_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">w1a</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) + </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">w1a</span><span class="plain-syntax"> != </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> += </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> += </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Rule attachments. </b>The following routine contains a bit of a surprise: that the act of
2019-03-17 14:40:57 +02:00
placing a BR within a given rulebook can change it, by altering the way
it acts on its applicability test. This is a device needed to manage
the parallel rulebooks for action processing for the main player character
and for third parties. Though the code below does not make this apparent,
the changes propagate down through the BR to the phrase structure itself.
This is necessary because they manifest themselves in the compiled code
of the phrase, but it is also unfortunate, because it is possible that
the same phrase is used by more than one BR. If it should happen that
BRs are created to place the same phrase into two different rulebooks,
therefore, and which have different actor-testing settings, the outcome
would be confusing. (As unlikely as this seems, it did once happen to a
user in beta-testing.)
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">All work on the sequence of rules in rulebooks is delegated to the
2019-03-17 14:40:57 +02:00
sub-section on linked lists of booked rules in the section on Rules.
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 01:55:57 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::attach_rule</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::attach_rule</span></span>:<br/>Rule Bookings - <a href="2-rb.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">booking</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">,</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">placing</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">side</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Attaching booked rule $b at sentence:\n $T"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Rulebook before attachment: $K"</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">);</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">side</span><span class="plain-syntax"> != </span><span class="constant-syntax">INSTEAD_SIDE</span><span class="plain-syntax">)</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BeforeOrAfterSelf</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"a rule can't be before or after itself"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so this makes no sense to me."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">BEFORE_RB</span><span class="plain-syntax">]) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">AFTER_RB</span><span class="plain-syntax">]) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">INSTEAD_RB</span><span class="plain-syntax">])) {</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><a href="2-rls.html#SP9" class="function-link"><span class="function-syntax">Rules::get_defn_as_phrase</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP4" class="function-link"><span class="function-syntax">Phrases::Context::required_action</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">));</span>
2021-02-27 18:52:18 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">an</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ActionSemantics::is_out_of_world</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">)))</span>
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_OOWinIWRulebook</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this rulebook has no effect on actions which happen out of world"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so I'm not going to let you file this rule in it. ('Check', "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'Carry out' and 'Report' work fine for out of world actions: "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"but 'Before', 'Instead' and 'After' have no effect on them.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">SETTING_ACTION_VARIABLES_RB</span><span class="plain-syntax">]) {</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP18" class="function-link"><span class="function-syntax">Rules::set_never_test_actor</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP11" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::modify_rule_to_suit_focus</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">),</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">side</span><span class="plain-syntax"> == </span><span class="constant-syntax">INSTEAD_SIDE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Copying actor test flags from rule being replaced\n"</span><span class="plain-syntax">);</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP18" class="function-link"><span class="function-syntax">Rules::copy_actor_test_flags</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">), </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Copying former rulebook's variable permissions to displaced rule\n"</span><span class="plain-syntax">);</span>
2021-03-20 12:48:57 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_variables_in_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_from_rb</span><span class="plain-syntax">);</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-rlb.html#SP10" class="function-link"><span class="function-syntax">Rulebooks::focus</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) == </span><span class="constant-syntax">ACTION_FOCUS</span><span class="plain-syntax">)</span>
2021-03-20 12:48:57 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_action_variables_in_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_variables_in_scope</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">), </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_from_rb</span><span class="plain-syntax">);</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-rlb.html#SP10" class="function-link"><span class="function-syntax">Rulebooks::focus</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) == </span><span class="constant-syntax">ACTION_FOCUS</span><span class="plain-syntax">)</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_action_variables_in_scope</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fragmentation_stem_length</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP18" class="function-link"><span class="function-syntax">Rules::suppress_action_testing</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
2021-03-20 17:41:45 +02:00
<span class="plain-syntax"> </span><a href="3-prcd.html#SP8" class="function-link"><span class="function-syntax">Phrases::Context::ensure_avl</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-bl.html#SP5" class="function-link"><span class="function-syntax">BookingLists::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">placing</span><span class="plain-syntax">, </span><span class="identifier-syntax">side</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Rulebook after attachment: $K"</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
2020-08-26 12:52:50 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::detach_rule</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">) {</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><a href="2-bl.html#SP6" class="function-link"><span class="function-syntax">BookingLists::remove</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">the_new_rule</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Parsing rulebook properties. </b>Rulebooks do not have properties as such. The syntax which would create these
2019-03-17 14:40:57 +02:00
creates rulebook variables instead, which are much more useful. However, we
do allow the following syntax:
</p>
<blockquote>
<p>Visibility rules have outcomes there is sufficient light (failure) and there is insufficient light (success).</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">where Inform sees that the subject ("visibility rules") is a rulebook, and
2019-03-17 14:40:57 +02:00
parses the object noun phrase with the following:
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-property&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">outcome/outcomes</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-outcome-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
2021-02-06 20:00:34 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">default</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-default-outcome&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, - }</span>
2021-03-21 01:55:57 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP18_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_NonOutcomeProperty problem</span><span class="named-paragraph-number">18.1</span></a></span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP18_1" class="paragraph-anchor"></a><b>&#167;18.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_NonOutcomeProperty problem</span><span class="named-paragraph-number">18.1</span></span><span class="Preform-comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NonOutcomeProperty</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"the only properties of a rulebook are its outcomes"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for the time being at least."</span><span class="plain-syntax">);</span>
2020-07-28 21:19:38 +03:00
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">, - };</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP18">&#167;18</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. </b></p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">outcomes_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-08-26 12:52:50 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::parse_properties</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">outcomes_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">);</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="function-syntax">&lt;rulebook-property&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 01:55:57 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::kind_from_context</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::kind_from_context</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>, <a href="6-cii.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">)</span>
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::contains_ph</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">))</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_outcome_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. </b>In order to parse sentences about how rules are placed in rulebooks, we
2021-03-20 12:48:57 +02:00
need to be able to parse the relevant names. (The definite article can
optionally be used.)
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Articles::remove_the</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Lexicon::retrieve</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">RULEBOOK_MC</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Rvalues::is_CONSTANT_construction</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">CON_rulebook</span><span class="Preform-plain-syntax">)) {</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><span class="Preform-identifier-syntax">Rvalues::to_rulebook</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax">) };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> }</span>
<span class="Preform-plain-syntax"> ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> };</span>
<span class="Preform-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2020-05-03 03:01:21 +03:00
<nav role="progress"><div class="progresscontainer">
2021-03-20 17:41:45 +02:00
<ul class="progressbar"><li class="progressprev"><a href="2-bl.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-rls.html">rls</a></li><li class="progresssection"><a href="2-rb.html">rb</a></li><li class="progresssection"><a href="2-bl.html">bl</a></li><li class="progresscurrent">rlb</li><li class="progresssection"><a href="2-fao.html">fao</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-act.html">act</a></li><li class="progresschapter"><a href="3-itp.html">3</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="2-fao.html">&#10095;</a></li></ul></div>
2020-05-03 03:01:21 +03:00
</nav><!--End of weave-->
2019-03-17 14:40:57 +02:00
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>