1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/5-tod.html
2019-04-22 15:42:10 +01:00

281 lines
30 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>5/lp</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '5/tod' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#5">Chapter 5: Nouns</a></li><li><b>Times of Day</b></li></ul><p class="purpose">To make a built-in kind of value for times of day, such as "11:22 AM".</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP6">&#167;6. Parsing</a></li><li><a href="#SP9">&#167;9. Parsing event rules</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>"Men can do nothing without the make-believe of a beginning. Even Science,
the strict measurer, is obliged to start with a make-believe unit, and must fix
on a point in the stars' unceasing journey when his sidereal clock shall pretend
that time is at Nought. His less accurate grandmother Poetry has always been
understood to start in the middle; but on reflection it appears that her
proceeding is not very different from his; since Science, too, reckons backwards
as well as forwards, divides his unit into billions, and with his clock-finger
at Nought really sets off in medias res" (George Eliot, "Daniel Deronda").
Our make-believe here is midnight, our unit is divided not into billions but
into 1440, and a value of this kind holds one of two possibilities:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(i) an absolute time, measured as the number of minutes since midnight;
</li><li>(ii) a relative time, measured in minutes.
</li></ul>
<p class="inwebparagraph">Thus the value 70 might mean 1:10 AM, or it might mean 70 minutes, and
type-checking does not try to distinguish the two. This is so that arithmetic
will be easier &mdash; we can add 70 minutes to 1:10 AM to get 2:20 AM, but if they
had different kinds, this would be illegal.
</p>
<p class="inwebparagraph">The ambiguity is occasionally unhelpful, though: we have to supplement the "[a
time]" Understand token, which parses an absolute time, with a special "[a
time period]" one, so that users are able to parse relative times as well. And
of course, times really do not behave like integers, no matter how we might
pretend. What is 4:52 PM plus 3:31 PM, in any very meaningful sense? (Inform
adds these by treating them as durations since the previous midnight in each
case, but it's hard to see why that makes much human sense.) But despite these
qualms, it has been a reasonably good design in practice, and few authors
have objected.
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K_time</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::TimesOfDay::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="constant">PLUGIN_NEW_BASE_KIND_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::TimesOfDay::times_new_base_kind_notify</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::TimesOfDay::start is used in 26/pl (<a href="26-pl.html#SP8">&#167;8</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::TimesOfDay::times_new_base_kind_notify</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">new_base</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"TIME_TY"</span><span class="plain">)) {</span>
<span class="identifier">K_time</span><span class="plain"> = </span><span class="identifier">new_base</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::TimesOfDay::times_new_base_kind_notify is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">PL::TimesOfDay::kind</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K_time</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::TimesOfDay::kind is used in 13/ca (<a href="13-ca.html#SP1">&#167;1</a>), 14/rv (<a href="14-rv.html#SP12">&#167;12</a>), 14/lv (<a href="14-lv.html#SP16">&#167;16</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Parsing. </b>Although they are eventually stored in variables of the same kind ("time"),
relative and absolute times are parsed differently &mdash; they really are not
linguistically the same thing at all.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; ::=</span>
<span class="identifier">minus</span><span class="plain"> &lt;</span><span class="identifier">elapsed</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; | ==&gt; </span><span class="functiontext">Rvalues::from_time</span><span class="plain">(-</span><span class="identifier">R</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">)</span>
<span class="plain">&lt;</span><span class="identifier">elapsed</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; | ==&gt; </span><span class="functiontext">Rvalues::from_time</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">)</span>
<span class="plain">&lt;</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; ==&gt; </span><span class="functiontext">Rvalues::from_time</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">)</span>
<span class="plain">&lt;</span><span class="identifier">elapsed</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">hour</span><span class="plain">/</span><span class="identifier">hours</span><span class="plain"> | ==&gt; 60*</span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">minute</span><span class="plain">/</span><span class="identifier">minutes</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">hour</span><span class="plain">/</span><span class="identifier">hours</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">minute</span><span class="plain">/</span><span class="identifier">minutes</span><span class="plain"> ==&gt; 60*</span><span class="identifier">R</span><span class="plain">[1]+</span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; &lt;</span><span class="identifier">am</span><span class="plain">-</span><span class="identifier">pm</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Vet the time for clock range</span> <span class="cwebmacronumber">6.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">digital</span><span class="plain">-</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; &lt;</span><span class="identifier">am</span><span class="plain">-</span><span class="identifier">pm</span><span class="plain">&gt; ==&gt; </span>&lt;<span class="cwebmacro">Vet the time for clock range</span> <span class="cwebmacronumber">6.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">am</span><span class="plain">-</span><span class="identifier">pm</span><span class="plain">&gt; ::=</span>
<span class="identifier">am</span><span class="plain"> |</span>
<span class="identifier">pm</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>Note that we allow "12:01 AM" (one minute past midnight) and "12:01 PM"
(ditto noon), and also "0:01 AM" and "00:01 AM", but not "0:01 PM".
Lawrence Sanders's sci-fi thriller "The Tomorrow File", if that can be
mentioned on the same page as "Daniel Deronda", had a terrific cover of
a digital clock glowing with "24:01" &mdash; but we won't allow that, either.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Vet the time for clock range</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">time_cycles</span><span class="plain"> = 12*60*</span><span class="identifier">R</span><span class="plain">[2];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1], </span><span class="identifier">time_hours</span><span class="plain">, </span><span class="identifier">time_minutes</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">[0] == 0) { </span><span class="identifier">time_hours</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">time_minutes</span><span class="plain"> = 0; }</span>
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">time_hours</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">/60; </span><span class="identifier">time_minutes</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">%60; }</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">time_hours</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">time_cycles</span><span class="plain"> &gt; 0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">reject for example "0:01 PM"</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">time_hours</span><span class="plain"> == 12) </span><span class="identifier">time_hours</span><span class="plain"> = 0; </span> <span class="comment">allow for example "12:01 AM"</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">time_minutes</span><span class="plain"> + 60*</span><span class="identifier">time_hours</span><span class="plain"> + </span><span class="identifier">time_cycles</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a> (twice).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>These are times of day written in the style of a digital clock: "00:00",
"5:21", "17:21". The syntax must be one or two digits, followed by a
colon, followed by exactly two digits; it is permissible for the first of
two digits to be zero; when that is discarded, the hours part must be in
the range 0 to 23, and the minutes part in the range 0 to 59.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">digital</span><span class="plain">-</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> 1 {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">time_minutes</span><span class="plain"> = 0, </span><span class="identifier">time_hours</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ratchet</span><span class="plain"> = 0, </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">colons</span><span class="plain"> = 0, </span><span class="identifier">digits</span><span class="plain"> = 0;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">wd</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]; </span><span class="identifier">t</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">t</span><span class="plain">==1) || (</span><span class="identifier">t</span><span class="plain">==2)) &amp;&amp; (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">] == </span><span class="character">':'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">+1])) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ratchet</span><span class="plain"> &gt;= 24) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">time_hours</span><span class="plain"> = </span><span class="identifier">ratchet</span><span class="plain">;</span>
<span class="identifier">ratchet</span><span class="plain"> = 0; </span><span class="identifier">digits</span><span class="plain"> = 0;</span>
<span class="identifier">colons</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">])) {</span>
<span class="identifier">ratchet</span><span class="plain"> = 10*</span><span class="identifier">ratchet</span><span class="plain"> + (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]-</span><span class="character">'0'</span><span class="plain">); </span><span class="identifier">digits</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ratchet</span><span class="plain"> &gt;= 60) || (</span><span class="identifier">digits</span><span class="plain"> &gt; 2)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">colons</span><span class="plain"> != 1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">time_minutes</span><span class="plain"> = </span><span class="identifier">ratchet</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">time_hours</span><span class="plain"> &lt; 0) || (</span><span class="identifier">time_hours</span><span class="plain"> &gt; 12)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">time_minutes</span><span class="plain"> &lt; 0) || (</span><span class="identifier">time_minutes</span><span class="plain"> &gt;= 60)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">time_minutes</span><span class="plain"> + </span><span class="identifier">time_hours</span><span class="plain">*60;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And these are the Continental equivalent, with an "h" instead of
the colon: thus "16h15" for quarter past four in the afternoon. (The
standard English grammar doesn't use this, but translators might want to.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">continental</span><span class="plain">-</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> 1 {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">time_minutes</span><span class="plain"> = 0, </span><span class="identifier">time_hours</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ratchet</span><span class="plain"> = 0, </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">colons</span><span class="plain"> = 0, </span><span class="identifier">digits</span><span class="plain"> = 0;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">wd</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]; </span><span class="identifier">t</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">t</span><span class="plain">==1) || (</span><span class="identifier">t</span><span class="plain">==2)) &amp;&amp; (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">] == </span><span class="character">'h'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">+1])) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ratchet</span><span class="plain"> &gt;= 24) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">time_hours</span><span class="plain"> = </span><span class="identifier">ratchet</span><span class="plain">;</span>
<span class="identifier">ratchet</span><span class="plain"> = 0; </span><span class="identifier">digits</span><span class="plain"> = 0;</span>
<span class="identifier">colons</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">])) {</span>
<span class="identifier">ratchet</span><span class="plain"> = 10*</span><span class="identifier">ratchet</span><span class="plain"> + (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]-</span><span class="character">'0'</span><span class="plain">); </span><span class="identifier">digits</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ratchet</span><span class="plain"> &gt;= 60) || (</span><span class="identifier">digits</span><span class="plain"> &gt; 2)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">colons</span><span class="plain"> != 1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">time_minutes</span><span class="plain"> = </span><span class="identifier">ratchet</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">time_hours</span><span class="plain"> &lt; 0) || (</span><span class="identifier">time_hours</span><span class="plain"> &gt; 12)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">time_minutes</span><span class="plain"> &lt; 0) || (</span><span class="identifier">time_minutes</span><span class="plain"> &gt;= 60)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">time_minutes</span><span class="plain"> + </span><span class="identifier">time_hours</span><span class="plain">*60;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Parsing event rules. </b>The following is used to parse the preamble to rules which take place at
a specific time of day, or when a named event occurs.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">event</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">preamble</span><span class="plain">&gt; ::=</span>
<span class="identifier">at</span><span class="plain"> &lt;</span><span class="identifier">clock</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">at</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">time</span><span class="plain"> </span><span class="identifier">when</span><span class="plain"> ... | ==&gt; </span><span class="constant">NO_FIXED_TIME</span>
<span class="identifier">at</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">time</span><span class="plain"> </span><span class="identifier">that</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_AtTimeThat problem</span> <span class="cwebmacronumber">9.1</span>&gt;
<span class="identifier">at</span><span class="plain"> ... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_AtWithoutTime problem</span> <span class="cwebmacronumber">9.2</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_AtTimeThat problem</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_AtTimeThat</span><span class="plain">),</span>
<span class="string">"this seems to use 'that' where it should use 'when'"</span><span class="plain">,</span>
<span class="string">"assuming it's trying to apply a rule to an event. (The convention is "</span>
<span class="string">"that any rule beginning 'At' is a timed one. The time can either be a "</span>
<span class="string">"fixed time, as in 'At 11:10 AM: ...', or the time when some named "</span>
<span class="string">"event takes place, as in 'At the time when the clock chimes: ...'.)"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_2"></a><b>&#167;9.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_AtWithoutTime problem</span> <span class="cwebmacronumber">9.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_AtWithoutTime</span><span class="plain">),</span>
<span class="string">"'at' what time? No description of a time is given"</span><span class="plain">,</span>
<span class="string">"which means that this rule can never have effect. (The convention is "</span>
<span class="string">"that any rule beginning 'At' is a timed one. The time can either be a "</span>
<span class="string">"fixed time, as in 'At 11:10 AM: ...', or the time when some named "</span>
<span class="string">"event takes place, as in 'At the time when the clock chimes: ...'.)"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-lp.html">Back to 'Literal Patterns'</a></li><li><a href="5-uem.html">Continue with 'Using Excerpt Meanings'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>