mirror of
https://github.com/ganelson/inform.git
synced 2024-06-17 07:40:47 +03:00
Rewrote Neptune files parser
This commit is contained in:
parent
fb9d3d81f4
commit
e0cf630409
|
@ -1,6 +1,6 @@
|
|||
# Inform 7
|
||||
|
||||
v10.1.0-alpha.1+6Q96 'Krypton' (17 August 2020)
|
||||
v10.1.0-alpha.1+6Q97 'Krypton' (18 August 2020)
|
||||
|
||||
## About Inform 7
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: alpha.1
|
||||
Build Date: 17 August 2020
|
||||
Build Number: 6Q96
|
||||
Build Date: 18 August 2020
|
||||
Build Number: 6Q97
|
||||
|
|
|
@ -286,7 +286,7 @@ so on. Those absolute basics are made here.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="26-fc.html#SP2" class="function-link"><span class="function-syntax">FundamentalConstants::emit_build_number</span></a><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">PL::Bibliographic::compile_constants</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="9-ef.html#SP5" class="function-link"><span class="function-syntax">Extensions::Files::ShowExtensionVersions_routine</span></a><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Constructors::compile_I6_constants</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Constructors::emit_constants</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH_IF</span><span class="plain-syntax">(</span><span class="identifier-syntax">scoring_plugin</span><span class="plain-syntax">, </span><span class="identifier-syntax">PL::Score::compile_max_score</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="26-uoart.html#SP1" class="function-link"><span class="function-syntax">RTUseOptions::TestUseOption_routine</span></a><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="21-ac.html#SP12" class="function-link"><span class="function-syntax">Activities::compile_activity_constants</span></a><span class="plain-syntax">)</span>
|
||||
|
|
|
@ -235,7 +235,8 @@ kinds:
|
|||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PROBLEM_KINDS_CALLBACK</span><span class="plain-syntax"> </span><a href="13-kak.html#SP8" class="function-link"><span class="function-syntax">Kinds::Knowledge::kinds_problem_handler</span></a>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Knowledge::kinds_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Knowledge::kinds_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</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">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err_no</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DimensionRedundant_KINDERROR:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_DimensionRedundant</span><span class="plain-syntax">),</span>
|
||||
|
@ -308,6 +309,16 @@ kinds:
|
|||
<span class="plain-syntax"> </span><span class="string-syntax">"scaling is already established"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"which is impossible."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NeptuneError_KINDERROR:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">Untestable</span><span class="plain-syntax">));</span>
|
||||
<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">"One of the so-called Neptune files used to configure the kinds of value "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"built into Inform contained an error. Either there is something wrong with "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"this installation of Inform, or new Neptune files are being tried out but "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"do not yet work. Specifically: '%1'."</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">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unimplemented problem message"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
|
|
@ -86,21 +86,21 @@ even though they share an underlying implementation (which has a general
|
|||
air of being over-engineered, thanks to its once-mightier state).
|
||||
</p>
|
||||
|
||||
<ul class="items"><li>(a) We can read a <span class="extract"><span class="extract-syntax">*.kindt</span></span> file which defines the properties of built-in
|
||||
kinds of value, such as "number".
|
||||
<ul class="items"><li>(a) We can read a Neptune file which defines the properties of built-in
|
||||
kinds of value, such as <span class="extract"><span class="extract-syntax">number</span></span>.
|
||||
</li><li>(b) We can read a <span class="extract"><span class="extract-syntax">*.indext</span></span> file which acts as a contents page for the
|
||||
Index generated by a project.
|
||||
</li><li>(c) Or we can read from a C (wide) string of I6T code and expand that into
|
||||
a text stream. Expansion doesn't change much, but it does handle the <span class="extract"><span class="extract-syntax">(+</span></span>
|
||||
and <span class="extract"><span class="extract-syntax">+)</span></span> Inform 7 escapes (see below).
|
||||
</li></ul>
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">KINDT_MODE</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">NEPTUNE_MODE</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">INDEXT_MODE</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">I6TCODE_MODE</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6T::interpret_kindt</span><span class="plain-syntax">(</span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">segment_file</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="26-iti.html#SP2" class="function-link"><span class="function-syntax">I6T::interpreter_shared</span></a><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="constant-syntax">KINDT_MODE</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">segment_file</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6T::interpret_neptune</span><span class="plain-syntax">(</span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">neptune_file</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="26-iti.html#SP2" class="function-link"><span class="function-syntax">I6T::interpreter_shared</span></a><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="constant-syntax">NEPTUNE_MODE</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">neptune_file</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">do_not_generate_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> Set by the </span><span class="extract"><span class="extract-syntax">-no-index</span></span><span class="comment-syntax"> command line option</span>
|
||||
|
@ -128,7 +128,7 @@ is run only to call other functions.
|
|||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6T::interpreter_shared</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">I6T::interpreter_shared</span></span>:<br/><a href="26-iti.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">int_mode</span><span class="plain-syntax">, </span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sf</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">segment_name</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">N_escape</span><span class="plain-syntax">, </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">index_structure</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Input_File</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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">col</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">cr</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfp</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">col</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">cr</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfp</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">lc</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">heading_name</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">comment</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
|
@ -144,12 +144,14 @@ is run only to call other functions.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="26-iti.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Read next character from I6T stream</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NewCharacter:</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">comment</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</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">int_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">KINDT_MODE</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">int_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">NEPTUNE_MODE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">lc</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">cr</span><span class="plain-syntax"> == </span><span class="constant-syntax">10</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">cr</span><span class="plain-syntax"> == </span><span class="constant-syntax">13</span><span class="plain-syntax">)) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> skip blank lines here</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="26-iti.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">Read rest of line as argument</span><span class="named-paragraph-number">2.3</span></a></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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">) == </span><span class="character-syntax">'!'</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> skip blanks and comments</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">KindCommands::despatch</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> </span><span class="identifier-syntax">tfp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextFiles::at</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_structure</span><span class="plain-syntax">, </span><span class="identifier-syntax">lc</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NeptuneFiles::read_command</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">, &</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</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">cr</span><span class="plain-syntax"> == </span><span class="character-syntax">'{'</span><span class="plain-syntax">) {</span>
|
||||
|
@ -203,14 +205,21 @@ file.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment_name</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">Input_File</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">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"inform: Unable to open segment <%S>\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">segment_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">), </span><span class="comment-syntax"> or anyway not usefully testable</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">), </span><span class="comment-syntax"> or anyway not usefully testable</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"I couldn't open a requested I6T segment: see the console "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"output for details."</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">index_structure</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Input_File</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Filenames::fopen</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_structure</span><span class="plain-syntax">, </span><span class="string-syntax">"r"</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">Input_File</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Filename was %f\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">index_structure</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">), </span><span class="comment-syntax"> or anyway not usefully testable</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">int_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">NEPTUNE_MODE</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">), </span><span class="comment-syntax"> or anyway not usefully testable</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"I couldn't open a Neptune file for defining built-in kinds."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(),</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">), </span><span class="comment-syntax"> or anyway not usefully testable</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"I couldn't open the template file for the index."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -155,15 +155,18 @@ to some routine of her own, gazumping this one.
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">KindsCircular_KINDERROR</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">LPCantScaleYet_KINDERROR</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">LPCantScaleTwice_KINDERROR</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">NeptuneError_KINDERROR</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindsModule::problem_handler</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">KindsModule::problem_handler</span></span>:<br/>Kinds - <a href="2-knd.html#SP21">§21</a><br/>Dimensions - <a href="3-dmn.html#SP13">§13</a>, <a href="3-dmn.html#SP15">§15</a>, <a href="3-dmn.html#SP21_3_1">§21.3.1</a>, <a href="3-dmn.html#SP28_4">§28.4</a><br/>Scaled Arithmetic Values - <a href="3-sav.html#SP13_1">§13.1</a>, <a href="3-sav.html#SP13_2">§13.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindsModule::problem_handler</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">KindsModule::problem_handler</span></span>:<br/>Kinds - <a href="2-knd.html#SP21">§21</a><br/>Dimensions - <a href="3-dmn.html#SP13">§13</a>, <a href="3-dmn.html#SP15">§15</a>, <a href="3-dmn.html#SP21_3_1">§21.3.1</a>, <a href="3-dmn.html#SP28_4">§28.4</a><br/>Scaled Arithmetic Values - <a href="3-sav.html#SP13_1">§13.1</a>, <a href="3-sav.html#SP13_2">§13.2</a><br/>Neptune Files - <a href="4-nf.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</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">PROBLEM_KINDS_CALLBACK</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PROBLEM_KINDS_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">K2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PROBLEM_KINDS_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">K2</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">PROBLEM_KINDS_CALLBACK</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">E</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err_no</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DimensionRedundant_KINDERROR:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="string-syntax">"multiplication rule given twice: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">text</span><span class="plain-syntax">);</span>
|
||||
|
@ -192,6 +195,9 @@ to some routine of her own, gazumping this one.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LPCantScaleTwice_KINDERROR:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="string-syntax">"tries to scale a value which has already been scaled: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NeptuneError_KINDERROR:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="string-syntax">"error in Neptune file: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unimplemented problem message"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">)</span>
|
||||
|
|
|
@ -331,7 +331,7 @@ addition.
|
|||
<span class="Preform-function-syntax"><k-kind-construction></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-reserved-syntax">kind_constructor</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">con</span><span class="Preform-plain-syntax">;</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOOP_OVER</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">con</span><span class="Preform-plain-syntax">, </span><span class="Preform-reserved-syntax">kind_constructor</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><a href="4-kc2.html#SP13" class="function-link"><span class="Preform-function-syntax">Kinds::Constructors::arity</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">con</span><span class="Preform-plain-syntax">) > </span><span class="Preform-constant-syntax">0</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><a href="4-kc2.html#SP16" class="function-link"><span class="Preform-function-syntax">Kinds::Constructors::arity</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">con</span><span class="Preform-plain-syntax">) > </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">) {</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">X</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">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Y</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">EMPTY_WORDING</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><a href="2-dk.html#SP14" class="function-link"><span class="Preform-function-syntax">Kinds::Textual::parse_constructor_name</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">con</span><span class="Preform-plain-syntax">, &</span><span class="Preform-identifier-syntax">X</span><span class="Preform-plain-syntax">, &</span><span class="Preform-identifier-syntax">Y</span><span class="Preform-plain-syntax">))</span>
|
||||
|
@ -360,19 +360,19 @@ unspecified because a short form of the constructor is used (e.g.,
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, *</span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_value</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">variance</span><span class="plain-syntax">[0] == </span><span class="constant-syntax">CONTRAVARIANT</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">variance</span><span class="plain-syntax">[1] == </span><span class="constant-syntax">CONTRAVARIANT</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">variance</span><span class="plain-syntax">[1] == </span><span class="constant-syntax">CONTRAVARIANT</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-dk.html#SP12_1_1" class="named-paragraph-link"><span class="named-paragraph">The rule and rulebook constructors default to actions for X</span><span class="named-paragraph-number">12.1.1</span></a></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::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">X</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">tupling</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">tupling</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">tupling</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-single-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></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">tupling</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-optional-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></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">tupling</span><span class="plain-syntax"> >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-tupled-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</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">tupling</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tupling</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">tupling</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-single-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></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">tupling</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-optional-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></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">tupling</span><span class="plain-syntax"> >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="function-syntax"><k-tupled-term></span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">))) </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
||||
|
@ -380,10 +380,10 @@ unspecified because a short form of the constructor is used (e.g.,
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-dk.html#SP12_1_2" class="named-paragraph-link"><span class="named-paragraph">The relation constructor defaults to Y matching X, if X is specified</span><span class="named-paragraph-number">12.1.2</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KX</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KX</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> ==> { -, </span><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::unary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KX</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KY</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KX</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KY</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> ==> { -, </span><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::binary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</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>
|
||||
</pre>
|
||||
|
@ -449,7 +449,7 @@ and returns <span class="extract"><span class="Preform-extract-syntax">TRUE</spa
|
|||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Textual::parse_constructor_name</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">Kinds::Textual::parse_constructor_name</span></span>:<br/><a href="2-dk.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KW</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">LW</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">W</span><span class="plain-syntax"> = *</span><span class="identifier-syntax">KW</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">p</span><span class="plain-syntax"><=2; </span><span class="identifier-syntax">p</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">NW</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, (</span><span class="identifier-syntax">p</span><span class="plain-syntax">==1)?</span><span class="identifier-syntax">FALSE:TRUE</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">NW</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, (</span><span class="identifier-syntax">p</span><span class="plain-syntax">==1)?</span><span class="identifier-syntax">FALSE: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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</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">full_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</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">k1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">);</span>
|
||||
|
@ -774,7 +774,7 @@ to miss out on this detail.
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_base</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">second_base</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">first_base</span><span class="plain-syntax"> = </span><a href="2-knd.html#SP14" class="function-link"><span class="function-syntax">Kinds::unary_construction_material</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP15" class="function-link"><span class="function-syntax">Kinds::binary_construction_material</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, &</span><span class="identifier-syntax">first_base</span><span class="plain-syntax">, &</span><span class="identifier-syntax">second_base</span><span class="plain-syntax">);</span>
|
||||
|
@ -819,7 +819,7 @@ usage.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_property</span><span class="plain-syntax">) && (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">first_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">))) </span><span class="identifier-syntax">k_present</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_table_column</span><span class="plain-syntax">) && (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">first_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">))) </span><span class="identifier-syntax">k_present</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_relation</span><span class="plain-syntax">) && (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">first_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_base</span><span class="plain-syntax">))) </span><span class="identifier-syntax">l_present</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">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">l_present</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">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">l_present</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">second_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">)) </span><span class="identifier-syntax">l_present</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">second_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">)) </span><span class="identifier-syntax">l_present</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">choice_from</span><span class="plain-syntax">[</span><span class="identifier-syntax">k_present</span><span class="plain-syntax">][</span><span class="identifier-syntax">l_present</span><span class="plain-syntax">] == -1) {</span>
|
||||
|
@ -886,7 +886,7 @@ usage.
|
|||
<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">K_nil</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"nothing"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"nothing"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</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">pluralised</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tupled</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">b</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">tupled</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::tupling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">b</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">bracketed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">tupled</span><span class="plain-syntax"> > </span><span class="constant-syntax">1</span><span class="plain-syntax">) && (</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_TUPLE_ENTRY</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_base</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">second_base</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -256,7 +256,7 @@ it is. There is no need for speed here.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::eq_narrow_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">sn</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_of_I6_name</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">what_have_you</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> **</span><span class="function-syntax">FamiliarKinds::known_con</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">FamiliarKinds::known_con</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> **</span><span class="function-syntax">FamiliarKinds::known_con</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">FamiliarKinds::known_con</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"ACTIVITY_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">CON_activity</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"COMBINATION_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">CON_combination</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"DESCRIPTION_OF_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">CON_description</span><span class="plain-syntax">);</span>
|
||||
|
@ -277,7 +277,7 @@ it is. There is no need for speed here.
|
|||
<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="reserved-syntax">kind</span><span class="plain-syntax"> **</span><span class="function-syntax">FamiliarKinds::known_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">FamiliarKinds::known_kind</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> **</span><span class="function-syntax">FamiliarKinds::known_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">FamiliarKinds::known_kind</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"ARITHMETIC_VALUE_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">K_arithmetic_value</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"ENUMERATED_VALUE_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">K_enumerated_value</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">IDENTIFIERS_CORRESPOND</span><span class="plain-syntax">(</span><span class="string-syntax">"EQUATION_TY"</span><span class="plain-syntax">, &</span><span class="identifier-syntax">K_equation</span><span class="plain-syntax">);</span>
|
||||
|
@ -305,7 +305,7 @@ it is. There is no need for speed here.
|
|||
<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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">FamiliarKinds::is_known</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">FamiliarKinds::is_known</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP12_1">§12.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">FamiliarKinds::is_known</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">FamiliarKinds::is_known</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6_2">§6.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-fk.html#SP11" class="function-link"><span class="function-syntax">FamiliarKinds::known_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sn</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><a href="2-fk.html#SP11" class="function-link"><span class="function-syntax">FamiliarKinds::known_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sn</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>
|
||||
|
@ -331,7 +331,7 @@ but are indexed together.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">FamiliarKinds::notice_new_kind</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">FamiliarKinds::notice_new_kind</span></span>:<br/>Kinds - <a href="2-knd.html#SP20">§20</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax"><notable-linguistic-kinds></span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP12" class="function-link"><span class="function-syntax">Kinds::Constructors::mark_as_linguistic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP15" class="function-link"><span class="function-syntax">Kinds::Constructors::mark_as_linguistic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="function-syntax"><<r>></span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">K_natural_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</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">NOTIFY_NATURAL_LANGUAGE_KINDS_CALLBACK</span>
|
||||
|
|
|
@ -181,17 +181,17 @@ we can then use that same pointer on all subsequent requests.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::base_construction</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">Kinds::base_construction</span></span>:<br/><a href="2-knd.html#SP10">§10</a>, <a href="2-knd.html#SP20">§20</a><br/>Describing Kinds - <a href="2-dk.html#SP10">§10</a><br/>Kind Commands - <a href="4-kc.html#SP12_1">§12.1</a>, <a href="4-kc.html#SP24_4">§24.4</a><br/>Kind Constructors - <a href="4-kc2.html#SP2">§2</a>, <a href="4-kc2.html#SP6">§6</a>, <a href="4-kc2.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::base_construction</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">Kinds::base_construction</span></span>:<br/><a href="2-knd.html#SP10">§10</a>, <a href="2-knd.html#SP20">§20</a><br/>Describing Kinds - <a href="2-dk.html#SP10">§10</a><br/>Neptune Syntax - <a href="4-ns.html#SP6_2">§6.2</a><br/>Kind Commands - <a href="4-kc.html#SP1_4">§1.4</a><br/>Kind Constructors - <a href="4-kc2.html#SP2">§2</a>, <a href="4-kc2.html#SP9">§9</a>, <a href="4-kc2.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"impossible construction"</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">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_INTERMEDIATE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"forbidden construction"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</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">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_list_of</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::unary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::unary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::binary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">cache</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::cache_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">cache</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::cache_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">cache</span><span class="plain-syntax">) { </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">cache</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cache</span><span class="plain-syntax">; }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-knd.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Create a raw kind structure</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
|
||||
|
@ -254,7 +254,7 @@ practice wasted.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::unary_con</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">Kinds::unary_con</span></span>:<br/><a href="2-knd.html#SP6">§6</a>, <a href="2-knd.html#SP17">§17</a>, <a href="2-knd.html#SP18">§18</a>, <a href="2-knd.html#SP19">§19</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP7">§7</a><br/>Describing Kinds - <a href="2-dk.html#SP11_10">§11.10</a>, <a href="2-dk.html#SP12_1">§12.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) != </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad unary construction"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) != </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad unary construction"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-knd.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Create a raw kind structure</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</span><span class="plain-syntax">; </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">no_constructed_kinds_created</span><span class="plain-syntax">++;</span>
|
||||
|
@ -263,7 +263,7 @@ practice wasted.
|
|||
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::binary_con</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">Kinds::binary_con</span></span>:<br/><a href="2-knd.html#SP6">§6</a>, <a href="2-knd.html#SP7">§7</a>, <a href="2-knd.html#SP8">§8</a>, <a href="2-knd.html#SP17">§17</a>, <a href="2-knd.html#SP18">§18</a>, <a href="2-knd.html#SP19">§19</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP7">§7</a><br/>Describing Kinds - <a href="2-dk.html#SP11_2">§11.2</a>, <a href="2-dk.html#SP11_3">§11.3</a>, <a href="2-dk.html#SP11_4">§11.4</a>, <a href="2-dk.html#SP11_5">§11.5</a>, <a href="2-dk.html#SP11_6">§11.6</a>, <a href="2-dk.html#SP11_7">§11.7</a>, <a href="2-dk.html#SP11_8">§11.8</a>, <a href="2-dk.html#SP11_9">§11.9</a>, <a href="2-dk.html#SP12_1">§12.1</a>, <a href="2-dk.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Y</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) != </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad binary construction"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">) != </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"bad binary construction"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-knd.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Create a raw kind structure</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</span><span class="plain-syntax">; </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">X</span><span class="plain-syntax">; </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[1] = </span><span class="identifier-syntax">Y</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">no_constructed_kinds_created</span><span class="plain-syntax">++;</span>
|
||||
|
@ -372,7 +372,7 @@ drawing up the index, and so on.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::get_construct</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">Kinds::get_construct</span></span>:<br/><a href="2-knd.html#SP17">§17</a>, <a href="2-knd.html#SP20">§20</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP12_1">§12.1</a><br/>Describing Kinds - <a href="2-dk.html#SP24">§24</a>, <a href="2-dk.html#SP24_1">§24.1</a>, <a href="2-dk.html#SP24_1_1">§24.1.1</a>, <a href="2-dk.html#SP25">§25</a><br/>Using Kinds - <a href="2-uk.html#SP17">§17</a>, <a href="2-uk.html#SP28">§28</a><br/>Dimensions - <a href="3-dmn.html#SP11">§11</a><br/>Kind Commands - <a href="4-kc.html#SP12_1">§12.1</a><br/>Kind Constructors - <a href="4-kc2.html#SP6">§6</a>, <a href="4-kc2.html#SP14">§14</a>, <a href="4-kc2.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::get_construct</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">Kinds::get_construct</span></span>:<br/><a href="2-knd.html#SP17">§17</a>, <a href="2-knd.html#SP20">§20</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP12_1">§12.1</a><br/>Describing Kinds - <a href="2-dk.html#SP24">§24</a>, <a href="2-dk.html#SP24_1">§24.1</a>, <a href="2-dk.html#SP24_1_1">§24.1.1</a>, <a href="2-dk.html#SP25">§25</a><br/>Using Kinds - <a href="2-uk.html#SP17">§17</a>, <a href="2-uk.html#SP28">§28</a><br/>Dimensions - <a href="3-dmn.html#SP11">§11</a><br/>Neptune Syntax - <a href="4-ns.html#SP6_2">§6.2</a><br/>Kind Constructors - <a href="4-kc2.html#SP9">§9</a>, <a href="4-kc2.html#SP17">§17</a>, <a href="4-kc2.html#SP21">§21</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -406,7 +406,7 @@ drawing up the index, and so on.
|
|||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::arity_of_constructor</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">Kinds::arity_of_constructor</span></span>:<br/><a href="2-knd.html#SP14">§14</a>, <a href="2-knd.html#SP15">§15</a>, <a href="2-knd.html#SP17">§17</a>, <a href="2-knd.html#SP18">§18</a>, <a href="2-knd.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">K</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
@ -482,15 +482,15 @@ assuming that it was originally <span class="extract"><span class="extract-synta
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">a</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">X</span><span class="plain-syntax"> = </span><a href="2-knd.html#SP14" class="function-link"><span class="function-syntax">Kinds::unary_construction_material</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">X_after</span><span class="plain-syntax"> = </span><a href="2-knd.html#SP17" class="function-link"><span class="function-syntax">Kinds::substitute_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">meanings</span><span class="plain-syntax">, &</span><span class="identifier-syntax">tx</span><span class="plain-syntax">, </span><span class="identifier-syntax">contra</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="constant-syntax">0</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tx</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> *</span><span class="identifier-syntax">changed</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><a href="2-knd.html#SP6_3" class="function-link"><span class="function-syntax">Kinds::unary_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">X_after</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><a href="2-knd.html#SP15" class="function-link"><span class="function-syntax">Kinds::binary_construction_material</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">Y</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">vx</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">vy</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">vx</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">vy</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_TUPLE_ENTRY</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">vx</span><span class="plain-syntax"> = </span><span class="identifier-syntax">way_in</span><span class="plain-syntax">; </span><span class="identifier-syntax">vy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">way_in</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -571,7 +571,7 @@ is the super-kind ("value", "thing").
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="2-knd.html#SP6" class="function-link"><span class="function-syntax">Kinds::base_construction</span></a><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP6" class="function-link"><span class="function-syntax">Kinds::Constructors::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">super</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"#NEW"</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP9" class="function-link"><span class="function-syntax">Kinds::Constructors::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">super</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"#NEW"</span><span class="plain-syntax">));</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-knd.html#SP20_1" class="named-paragraph-link"><span class="named-paragraph">Use the source-text name to attach a noun to the constructor</span><span class="named-paragraph-number">20.1</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
|
@ -600,7 +600,7 @@ is the super-kind ("value", "thing").
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">WITH_PLURAL_FORMS_NTOPT</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="constant-syntax">KIND_SLOW_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_kind_constructor</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">endif</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::attach_noun</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::attach_noun</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-knd.html#SP20">§20</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. Making subkinds. </b>This does not need to be done at creation time.
|
||||
|
@ -624,7 +624,7 @@ is the super-kind ("value", "thing").
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Tried to make %u a kind of %u\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">sub</span><span class="plain-syntax">, </span><span class="identifier-syntax">super</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">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">KindUnalterable_KINDERROR</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-uk.html#SP14" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_superkind_set_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sub</span><span class="plain-syntax">), </span><span class="identifier-syntax">super</span><span class="plain-syntax">, </span><span class="identifier-syntax">existing</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="2-uk.html#SP14" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_superkind_set_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sub</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">super</span><span class="plain-syntax">, </span><span class="identifier-syntax">existing</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SOMETIMES_MATCH:</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP21" class="function-link"><span class="function-syntax">Kinds::make_subkind_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sub</span><span class="plain-syntax">, </span><span class="identifier-syntax">super</span><span class="plain-syntax">);</span>
|
||||
|
@ -638,7 +638,7 @@ is the super-kind ("value", "thing").
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">sub</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">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">KindsCircular_KINDERROR</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-uk.html#SP14" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_superkind_set_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">super</span><span class="plain-syntax">), </span><span class="identifier-syntax">super</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-uk.html#SP14" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_superkind_set_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">super</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">super</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-tlok.html#SP6" class="function-link"><span class="function-syntax">Latticework::super</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sub</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>
|
||||
|
@ -657,7 +657,7 @@ is the super-kind ("value", "thing").
|
|||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::read_kind_marking_from_vocabulary</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Kinds::read_kind_marking_from_vocabulary</span></span>:<br/>Describing Kinds - <a href="2-dk.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</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">ve</span><span class="plain-syntax">-></span><span class="identifier-syntax">means</span><span class="plain-syntax">.</span><span class="identifier-syntax">one_word_kind</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">Kinds::mark_vocabulary_as_kind</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP24_4">§24.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP1_4">§1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax">-></span><span class="identifier-syntax">means</span><span class="plain-syntax">.</span><span class="identifier-syntax">one_word_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Vocabulary::set_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_FAST_MC</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NTI::mark_vocabulary</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="function-syntax"><k-kind></span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -225,17 +225,17 @@ function is what tells us that the superkind of <span class="extract"><span clas
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">HIERARCHY_GET_SUPER_KINDS_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">S</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">S</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_real_arithmetic_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_real_arithmetic_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_real_arithmetic_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_enumerated_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_enumerated_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_enumerated_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_arithmetic_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_arithmetic_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_arithmetic_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_pointer_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_pointer_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_pointer_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_sayable_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_sayable_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_sayable_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_stored_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_stored_value</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">K_stored_value</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">K_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
@ -270,8 +270,8 @@ such a list can't be constructed as data.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K1</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">K2</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">K2</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">K1</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K1</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">a1</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">a2</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K2</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">a1</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">a2</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K2</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">a1</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">a2</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K2</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> != </span><span class="identifier-syntax">con</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ka</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_KIND_CONSTRUCTION_ARITY</span><span class="plain-syntax">];</span>
|
||||
|
@ -503,15 +503,15 @@ and, of course, "value".
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">f_a</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">t_a</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">f_a</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">t_a</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">arity</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">f_a</span><span class="plain-syntax"> < </span><span class="identifier-syntax">t_a</span><span class="plain-syntax">)?</span><span class="identifier-syntax">f_a:t_a</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">o</span><span class="plain-syntax"> = </span><span class="constant-syntax">ALWAYS_MATCH</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">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> != </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> = </span><a href="2-tlok.html#SP12_5" class="function-link"><span class="function-syntax">Latticework::construct_compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">allow_casts</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">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">this_o</span><span class="plain-syntax"> = </span><span class="constant-syntax">NEVER_MATCH</span><span class="plain-syntax">, </span><span class="identifier-syntax">fallen</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">arity</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="constant-syntax">COVARIANT</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::variance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="constant-syntax">COVARIANT</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">this_o</span><span class="plain-syntax"> = </span><a href="2-tlok.html#SP12" class="function-link"><span class="function-syntax">Latticework::order_relation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">allow_casts</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="identifier-syntax">this_o</span><span class="plain-syntax"> = </span><a href="2-tlok.html#SP12" class="function-link"><span class="function-syntax">Latticework::order_relation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">allow_casts</span><span class="plain-syntax">);</span>
|
||||
|
@ -534,7 +534,7 @@ and, of course, "value".
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">ALWAYS_MATCH</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="2-tlok.html#SP6" class="function-link"><span class="function-syntax">Latticework::super</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">allow_casts</span><span class="plain-syntax">) && (</span><a href="4-kc2.html#SP15" class="function-link"><span class="function-syntax">Kinds::Constructors::find_cast</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">allow_casts</span><span class="plain-syntax">) && (</span><a href="4-kc2.html#SP18" class="function-link"><span class="function-syntax">Kinds::Constructors::find_cast</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">ALWAYS_MATCH</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -87,13 +87,13 @@ MathJax = {
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_name</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">Kinds::Behaviour::get_name</span></span>:<br/>Describing Kinds - <a href="2-dk.html#SP24_2">§24.2</a>, <a href="2-dk.html#SP24_3">§24.3</a><br/>Dimensions - <a href="3-dmn.html#SP26">§26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</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">K</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">EMPTY_WORDING</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_name_in_play</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</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">K</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">EMPTY_WORDING</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name_in_play</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name_in_play</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">noun</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_noun</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
|
@ -155,8 +155,8 @@ checks that we aren't doing that:
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">arity</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-uk.html#SP4" class="function-link"><span class="function-syntax">Kinds::Behaviour::definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]) == </span><span class="identifier-syntax">FALSE</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>
|
||||
|
@ -167,8 +167,8 @@ checks that we aren't doing that:
|
|||
<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="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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_KIND_VARIABLE</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_NIL</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_TUPLE_ENTRY</span><span class="plain-syntax">) && (</span><a href="2-knd.html#SP24" class="function-link"><span class="function-syntax">Kinds::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[1], </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">))) </span><span class="identifier-syntax">arity</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">arity</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
||||
|
@ -187,7 +187,7 @@ checks that we aren't doing that:
|
|||
<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="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><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">v</span><span class="plain-syntax"> == </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kind_variable_number</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">TRUE</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">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">arity</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-uk.html#SP4" class="function-link"><span class="function-syntax">Kinds::Behaviour::involves_var</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">kc_args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">v</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">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
@ -235,7 +235,7 @@ has been used, the matter is settled and there is no going back.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::is_an_enumeration</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">Kinds::Behaviour::is_an_enumeration</span></span>:<br/><a href="2-uk.html#SP28">§28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>And here we perform the conversion to a unit. The return value is <span class="extract"><span class="extract-syntax">TRUE</span></span>
|
||||
|
@ -246,7 +246,7 @@ if the kind was already a unit or was successfully converted into one,
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::convert_to_unit</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_unit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_unit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>And similarly:
|
||||
|
@ -254,7 +254,7 @@ if the kind was already a unit or was successfully converted into one,
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::convert_to_enumeration</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">Kinds::Behaviour::convert_to_enumeration</span></span>:<br/><a href="2-uk.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax">) </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">K</span><span class="plain-syntax">) </span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>And similarly to switch from integer to real arithmetic.
|
||||
|
@ -262,7 +262,7 @@ if the kind was already a unit or was successfully converted into one,
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::convert_to_real</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax">) </span><a href="4-kc2.html#SP11" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_real</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</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">K</span><span class="plain-syntax">) </span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::convert_to_real</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>The instances of an enumeration have the values \(1, 2, 3, ..., N\) at
|
||||
|
@ -307,7 +307,7 @@ kilopascals" might be a notation for a kind where constants are not named.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::has_named_constant_values</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<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">construct</span><span class="plain-syntax">-></span><span class="element-syntax">named_values_created_with_assertions</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">created_with_assertions</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>
|
||||
</pre>
|
||||
|
@ -378,7 +378,7 @@ track of dimensions, and the following routines connect the code in the
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::is_quasinumerical</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">Kinds::Behaviour::is_quasinumerical</span></span>:<br/><a href="2-uk.html#SP28">§28</a><br/>Dimensions - <a href="3-dmn.html#SP15">§15</a>, <a href="3-dmn.html#SP28_3">§28.3</a>, <a href="3-dmn.html#SP29">§29</a>, <a href="3-dmn.html#SP30_2">§30.2</a>, <a href="3-dmn.html#SP31">§31</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">unit_sequence</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_dimensional_form</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">Kinds::Behaviour::get_dimensional_form</span></span>:<br/>Describing Kinds - <a href="2-dk.html#SP24_1">§24.1</a><br/>Dimensions - <a href="3-dmn.html#SP23">§23</a>, <a href="3-dmn.html#SP28_2">§28.2</a>, <a href="3-dmn.html#SP28_3">§28.3</a>, <a href="3-dmn.html#SP28_4">§28.4</a>, <a href="3-dmn.html#SP29">§29</a>, <a href="3-dmn.html#SP30_2">§30.2</a>, <a href="3-dmn.html#SP31">§31</a>, <a href="3-dmn.html#SP32">§32</a>, <a href="3-dmn.html#SP23_1">§23.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
|
@ -457,7 +457,7 @@ takes depends on its kind:
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP18" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP21" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>§24. </b>Exactly how large the small block is:
|
||||
|
@ -569,7 +569,7 @@ in some human-readable format.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-uk.html#SP7" class="function-link"><span class="function-syntax">Kinds::Behaviour::is_an_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="2-uk.html#SP28" class="function-link"><span class="function-syntax">Kinds::Behaviour::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">); </span><span class="identifier-syntax">external</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">dt_I6_identifier</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">print_identifier</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::is_quasinumerical</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="2-uk.html#SP28" class="function-link"><span class="function-syntax">Kinds::Behaviour::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">); </span><span class="identifier-syntax">external</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -591,7 +591,7 @@ in some human-readable format.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">pr_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::package</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP8" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP11" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_inc_iname</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null kind has no inc routine"</span><span class="plain-syntax">);</span>
|
||||
|
@ -617,9 +617,9 @@ in some human-readable format.
|
|||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_name_of_printing_rule_ACTIONS</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_number</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">name_of_printing_rule_ACTIONS</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">ACTIONS_identifier</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">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">name_of_printing_rule_ACTIONS</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">ACTIONS_identifier</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">I</span><span class="string-syntax">"DA_Name"</span><span class="plain-syntax">);</span>
|
||||
|
@ -640,14 +640,14 @@ not, it returns <span class="extract"><span class="extract-syntax">NULL</span></
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_explicit_I6_GPR</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Kinds::Behaviour::get_explicit_I6_GPR on null kind"</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">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_i6_GPR</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">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_GPR_identifier</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">CORE_MODULE</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_explicit_I6_GPR_iname</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Kinds::Behaviour::get_explicit_I6_GPR on null kind"</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_i6_GPR</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_i6_GPR</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_GPR_identifier</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_GPR_identifier</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
|
@ -658,7 +658,7 @@ not, it returns <span class="extract"><span class="extract-syntax">NULL</span></
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::offers_I6_GPR</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">has_i6_GPR</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">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">has_GPR</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP31" class="paragraph-anchor"></a><b>§31. </b>Request that a GPR be compiled for this kind; the return value tell us whether
|
||||
|
@ -668,8 +668,8 @@ this will be allowed or not.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::request_I6_GPR</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<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">construct</span><span class="plain-syntax">-></span><span class="element-syntax">has_i6_GPR</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</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="comment-syntax"> can't oblige</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">I6_GPR_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="comment-syntax"> make note to oblige later</span>
|
||||
<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">construct</span><span class="plain-syntax">-></span><span class="element-syntax">has_GPR</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</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="comment-syntax"> can't oblige</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">needs_GPR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="comment-syntax"> make note to oblige later</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>
|
||||
</pre>
|
||||
|
@ -679,7 +679,7 @@ this will be allowed or not.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::needs_I6_GPR</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">I6_GPR_needed</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">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">-></span><span class="element-syntax">needs_GPR</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP33" class="paragraph-anchor"></a><b>§33. </b>A recognition-only GPR is used for matching specific data in the course of
|
||||
|
|
|
@ -364,7 +364,7 @@ order of creation.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Dimensions::dim_initialise</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">Kinds::Dimensions::dim_initialise</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">dimensional_rules</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dimrs</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Dimensions::dim_initialise</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">Kinds::Dimensions::dim_initialise</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">dimensional_rules</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dimrs</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">dimrs</span><span class="plain-syntax">-></span><span class="identifier-syntax">multiplications</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
@ -378,7 +378,7 @@ order of creation.
|
|||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dimr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dimrs</span><span class="plain-syntax">-></span><span class="element-syntax">multiplications</span><span class="plain-syntax">; </span><span class="identifier-syntax">dimr</span><span class="plain-syntax">; </span><span class="identifier-syntax">dimr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dimr</span><span class="plain-syntax">-></span><span class="element-syntax">next</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">dimr</span><span class="plain-syntax">-></span><span class="element-syntax">right</span><span class="plain-syntax"> == </span><span class="identifier-syntax">right</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionRedundant_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionRedundant_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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>
|
||||
|
||||
|
@ -422,13 +422,13 @@ particular way:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="2-knd.html#SP13" class="function-link"><span class="function-syntax">Kinds::is_proper_constructor</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">)) ||</span>
|
||||
<span class="plain-syntax"> (</span><a href="2-knd.html#SP13" class="function-link"><span class="function-syntax">Kinds::is_proper_constructor</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">)) ||</span>
|
||||
<span class="plain-syntax"> (</span><a href="2-knd.html#SP13" class="function-link"><span class="function-syntax">Kinds::is_proper_constructor</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">outcome</span><span class="plain-syntax">))) {</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionNotBaseKOV_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionNotBaseKOV_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::is_quasinumerical</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::is_quasinumerical</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::is_quasinumerical</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">outcome</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NonDimensional_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NonDimensional_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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><a href="3-dmn.html#SP13" class="function-link"><span class="function-syntax">Kinds::Dimensions::record_multiplication_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="identifier-syntax">outcome</span><span class="plain-syntax">);</span>
|
||||
|
@ -485,7 +485,7 @@ derived and dimensionless, though, so that comes out as the empty sequence.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">unit_sequence</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Dimensions::fundamental_unit_sequence</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">Kinds::Dimensions::fundamental_unit_sequence</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">unit_sequence</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Dimensions::fundamental_unit_sequence</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">Kinds::Dimensions::fundamental_unit_sequence</span></span>:<br/>Kind Constructors - <a href="4-kc2.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">unit_sequence</span><span class="plain-syntax"> </span><span class="identifier-syntax">us</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">B</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">us</span><span class="plain-syntax">.</span><span class="identifier-syntax">no_unit_pairs</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
|
@ -643,7 +643,7 @@ accident, but we'll be careful:
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UnitSequenceOverflow_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UnitSequenceOverflow_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-dmn.html#SP21_3">§21.3</a>, <a href="3-dmn.html#SP21_4">§21.4</a> (twice).</li></ul>
|
||||
|
@ -923,7 +923,7 @@ the Kinds index page more helpful. But we must reject a contradiction.
|
|||
<span class="plain-syntax"> </span><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_dimensional_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">terms</span><span class="plain-syntax">[1]), </span><span class="constant-syntax">1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">product</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-dmn.html#SP20" class="function-link"><span class="function-syntax">Kinds::Dimensions::compare_unit_sequences</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">product</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-uk.html#SP19" class="function-link"><span class="function-syntax">Kinds::Behaviour::get_dimensional_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">terms</span><span class="plain-syntax">[2])) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionsInconsistent_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DimensionsInconsistent_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-dmn.html#SP28">§28</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP29" class="paragraph-anchor"></a><b>§29. Classifying the units. </b>Some of the derived units are dimensionless, others not. <span class="extract"><span class="extract-syntax">number</span></span> and
|
||||
|
|
|
@ -92,7 +92,7 @@ have integer equivalents.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::FloatingPoint::uses_floating_point</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">Kinds::FloatingPoint::uses_floating_point</span></span>:<br/><a href="3-fv.html#SP5">§5</a>, <a href="3-fv.html#SP6">§6</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP7_2">§7.2</a><br/>Using Kinds - <a href="2-uk.html#SP18">§18</a><br/>Dimensions - <a href="3-dmn.html#SP32_3">§32.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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">K</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic_and_real</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic_and_real</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Inform's equations system has to handle promotion (from int to real) or
|
||||
|
|
|
@ -499,7 +499,7 @@ some existing notation, in which case the <span class="extract"><span class="ext
|
|||
<span class="plain-syntax"> (</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">scaling_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">LP_SCALED_DOWN</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">equiv</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> ((</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">scaling_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">LP_SCALED_AT</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">use_integer_scaling</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))))</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LPCantScaleYet_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LPCantScaleYet_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">sc</span><span class="plain-syntax">-></span><span class="element-syntax">int_M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">int_scalar</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-sav.html#SP13">§13</a>.</li></ul>
|
||||
|
@ -515,7 +515,7 @@ scalings (metric units such as mm, km, etc.) already have their <span class="ext
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">int_scalar</span><span class="plain-syntax"> != </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">real_scalar</span><span class="plain-syntax"> != </span><span class="constant-syntax">1</span><span class="plain-syntax">.0)) &&</span>
|
||||
<span class="plain-syntax"> ((</span><span class="identifier-syntax">alt</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-></span><span class="element-syntax">scaling_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">LP_SCALED_AT</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LPCantScaleTwice_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LPCantScaleTwice_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">equiv</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-sav.html#SP13_2_1" class="named-paragraph-link"><span class="named-paragraph">Calculate the multiplier for this equivalent scaling</span><span class="named-paragraph-number">13.2.1</span></a></span>
|
||||
|
|
|
@ -64,823 +64,14 @@ function togglePopup(material_id) {
|
|||
<!--Weave of 'Kind Commands' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#4">Chapter 4: Constructors</a></li><li><b>Kind Commands</b></li></ul></div>
|
||||
<p class="purpose">To parse and act upon individual commands from Neptune files.</p>
|
||||
<p class="purpose">To apply a given command to a given kind constructor.</p>
|
||||
|
||||
<ul class="toc"><li><a href="4-kc.html#SP11">§11. Setting up the interpreter</a></li><li><a href="4-kc.html#SP12">§12. The kind command despatcher</a></li><li><a href="4-kc.html#SP13">§13. Parsing single kind commands</a></li><li><a href="4-kc.html#SP14">§14. Source text templates</a></li><li><a href="4-kc.html#SP19">§19. Type macros</a></li><li><a href="4-kc.html#SP22">§22. The kind text archiver</a></li><li><a href="4-kc.html#SP24">§24. Applying kind commands</a></li><li><a href="4-kc.html#SP25">§25. Completing a batch</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Everyone loves a mini-language, so here is one. At the top level:
|
||||
</p>
|
||||
|
||||
<ul class="items"><li>(a) Lines consisting of white space or whose first non-white space character is
|
||||
<span class="extract"><span class="extract-syntax">!</span></span> are ignored as comments.
|
||||
</li><li>(b) A line ending with a colon <span class="extract"><span class="extract-syntax">:</span></span> opens a new block. The text before the colon
|
||||
is the title of the block, except that the first character indicates its type:
|
||||
<ul class="items"><li>(1) An asterisk means that the block is a template definition: for instance,
|
||||
<span class="extract"><span class="extract-syntax">*PRINTING-ROUTINE:</span></span> says the block defines a template called <span class="extract"><span class="extract-syntax">PRINTING-ROUTINE</span></span>.
|
||||
A template consists of Inform 7 source text which extends as far as the next
|
||||
<span class="extract"><span class="extract-syntax">*END</span></span> line.
|
||||
</li><li>(2) A sharp sign <span class="extract"><span class="extract-syntax">#</span></span> means that the block is a macro definition. For
|
||||
instance, <span class="extract"><span class="extract-syntax">#UNIT:</span></span> says the block defines a template called <span class="extract"><span class="extract-syntax">UNIT</span></span>. A macro
|
||||
is just a sequence of lines holding kind commands which continues to
|
||||
the beginning of the next block, or the end of the file.
|
||||
</li><li>(3) And otherwise the block is a kind definition, but the optional opening
|
||||
character <span class="extract"><span class="extract-syntax">+</span></span> marks the kind as one which Inform requires the existence of.
|
||||
Thus <span class="extract"><span class="extract-syntax">+NUMBER_TY:</span></span>, since Inform will crash if the template doesn't set this
|
||||
kind up, but <span class="extract"><span class="extract-syntax">BOOJUMS_TY:</span></span> would validly declare a new kind called
|
||||
<span class="extract"><span class="extract-syntax">BOOJUMS_TY</span></span> which isn't special to any of Inform's internals. The <span class="extract"><span class="extract-syntax">+</span></span> signs
|
||||
are there as a help for hackers looking at the I6 template and wondering what
|
||||
they can safely monkey with.
|
||||
</li></ul>
|
||||
</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>The body of a kind definition is a sequence of one-line commands setting
|
||||
what properties the kind has. These commands take the form of a name, a colon,
|
||||
and an operand; for instance,
|
||||
</p>
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> i6-printing-routine-actions:DA_Number</span>
|
||||
</pre>
|
||||
<p class="commentary">The operands have different types, and the possibilities are given here:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NO_KCA</span><span class="plain-syntax"> -1 </span><span class="comment-syntax"> there's no operand</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> must be </span><span class="extract"><span class="extract-syntax">yes</span></span><span class="comment-syntax"> or </span><span class="extract"><span class="extract-syntax">no</span></span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">CCM_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> a constant compilation method</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> any text (no quotation marks or other delimiters are used)</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> any single word</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax"> </span><span class="comment-syntax"> any decimal number</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax"> </span><span class="comment-syntax"> any valid kind number, such as "number"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">TEMPLATE_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a template whose definition is given in the file</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">MACRO_KCA</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a macro whose definition is given in the file</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>When processing a command, we parse it into one of the following structures:
|
||||
</p>
|
||||
|
||||
<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">single_kind_command</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">kind_command_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">which_kind_command</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">boolean_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">numeric_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">textual_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ccm_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constructor_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure single_kind_command is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>A few of the commands connect pairs of kinds together: for instance,
|
||||
when we write
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> cast:RULEBOOK_TY</span>
|
||||
</pre>
|
||||
<p class="commentary">in the definition block for <span class="extract"><span class="extract-syntax">RULE_TY</span></span>, we're saying that every rulebook
|
||||
can always be cast implicitly to a rule. There can be any number of these
|
||||
in the definition block, so we need somewhere to store details, and the
|
||||
following structure provides an entry in a linked list.
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_casting_rule</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_from_kind_unparsed</span><span class="plain-syntax">; </span><span class="comment-syntax"> to the one which has the rule</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_from_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> to the one which has the rule</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_casting_rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_casting_rule</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_casting_rule</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_casting_rule is accessed in 4/kc2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And this is the analogous structure for giving I6 schemas to compare
|
||||
data of two different kinds:
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_comparison_schema</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparator_unparsed</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparator</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparison_schema</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">kind_constructor_comparison_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_comparison_schema</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_comparison_schema</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_comparison_schema is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>And this is the analogous structure for giving I6 schemas to compare
|
||||
data of two different kinds:
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_instance</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_of_this_unparsed</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_of_this</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">kind_constructor_instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_instance_rule</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_instance</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_instance is accessed in 4/kc2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>And, to cut to the chase, here is the complete table of commands:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_command_definition</span><span class="plain-syntax"> </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[] = {</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"can-coincide-with-property"</span><span class="plain-syntax">, </span><span class="constant-syntax">can_coincide_with_property_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"can-exchange"</span><span class="plain-syntax">, </span><span class="constant-syntax">can_exchange_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"defined-in-source-text"</span><span class="plain-syntax">, </span><span class="constant-syntax">defined_in_source_text_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"has-i6-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">has_i6_GPR_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"indexed-grey-if-empty"</span><span class="plain-syntax">, </span><span class="constant-syntax">indexed_grey_if_empty_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"is-incompletely-defined"</span><span class="plain-syntax">, </span><span class="constant-syntax">is_incompletely_defined_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"is-template-variable"</span><span class="plain-syntax">, </span><span class="constant-syntax">is_template_variable_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"multiple-block"</span><span class="plain-syntax">, </span><span class="constant-syntax">multiple_block_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"named-values-created-with-assertions"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="constant-syntax">named_values_created_with_assertions_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"constant-compilation-method"</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_compilation_method_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CCM_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"comparison-routine"</span><span class="plain-syntax">, </span><span class="constant-syntax">comparison_routine_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"default-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">default_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"description"</span><span class="plain-syntax">, </span><span class="constant-syntax">description_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"distinguisher"</span><span class="plain-syntax">, </span><span class="constant-syntax">distinguisher_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"documentation-reference"</span><span class="plain-syntax">, </span><span class="constant-syntax">documentation_reference_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"explicit-i6-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">explicit_i6_GPR_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"i6-printing-routine"</span><span class="plain-syntax">, </span><span class="constant-syntax">i6_printing_routine_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"i6-printing-routine-actions"</span><span class="plain-syntax">, </span><span class="constant-syntax">i6_printing_routine_actions_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-default-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_default_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-maximum-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_maximum_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-minimum-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_minimum_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"loop-domain-schema"</span><span class="plain-syntax">, </span><span class="constant-syntax">loop_domain_schema_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"recognition-only-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">recognition_only_GPR_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"specification-text"</span><span class="plain-syntax">, </span><span class="constant-syntax">specification_text_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"cast"</span><span class="plain-syntax">, </span><span class="constant-syntax">cast_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"comparison-schema"</span><span class="plain-syntax">, </span><span class="constant-syntax">comparison_schema_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"conforms-to"</span><span class="plain-syntax">, </span><span class="constant-syntax">conforms_to_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"modifying-adjective"</span><span class="plain-syntax">, </span><span class="constant-syntax">modifying_adjective_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"plural"</span><span class="plain-syntax">, </span><span class="constant-syntax">plural_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"singular"</span><span class="plain-syntax">, </span><span class="constant-syntax">singular_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"constructor-arity"</span><span class="plain-syntax">, </span><span class="constant-syntax">constructor_arity_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"group"</span><span class="plain-syntax">, </span><span class="constant-syntax">group_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"heap-size-estimate"</span><span class="plain-syntax">, </span><span class="constant-syntax">heap_size_estimate_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-priority"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_priority_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"small-block-size"</span><span class="plain-syntax">, </span><span class="constant-syntax">small_block_size_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"template-variable-number"</span><span class="plain-syntax">, </span><span class="constant-syntax">template_variable_number_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"apply-template"</span><span class="plain-syntax">, </span><span class="constant-syntax">apply_template_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEMPLATE_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"apply-macro"</span><span class="plain-syntax">, </span><span class="constant-syntax">apply_macro_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">MACRO_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="constant-syntax">NO_KCA</span><span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">};</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>Where each legal command is defined with a block like so:
|
||||
</p>
|
||||
|
||||
<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">kind_command_definition</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text_of_command</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">opcode_number</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">operand_type</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_command_definition</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_command_definition is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>Macros and templates have their definitions stored in structures thus:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax"> </span><span class="comment-syntax"> maximum number of commands in any one macro</span>
|
||||
</pre>
|
||||
<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">kind_template_definition</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the asterisk, e.g., </span><span class="extract"><span class="extract-syntax">"*PRINTING-ROUTINE"</span></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_text</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax">;</span>
|
||||
|
||||
<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">kind_macro_definition</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_macro_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the sharp, e.g., </span><span class="extract"><span class="extract-syntax">"#UNIT"</span></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_macro_line_count</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">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_template_definition is private to this section.</li><li>The structure kind_macro_definition is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>And this makes a note to insert the relevant chunk of I7 source text
|
||||
later on. (We do this because kind definitions are read very early on
|
||||
in Inform's run, whereas I7 source text can only be lexed later.)
|
||||
</p>
|
||||
|
||||
<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">kind_template_obligation</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">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">remembered_template</span><span class="plain-syntax">; </span><span class="comment-syntax"> I7 source to insert...</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">remembered_constructor</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...concerning this kind</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_template_obligation</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_template_obligation is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Setting up the interpreter. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. The kind command despatcher. </b>And this is where textual commands are received. (They come in from the
|
||||
template interpreter.) Comments and blank lines have already been stripped out.
|
||||
</p>
|
||||
|
||||
<p class="commentary">A template absorbs the raw text of its definition, and ends with <span class="extract"><span class="extract-syntax">*END</span></span>;
|
||||
whereas a macro absorbs the parsed form of its commands, and continues to
|
||||
the next new heading. (Templates can't use the same end syntax because
|
||||
they often need to contain I7 phrase definitions, where lines end with
|
||||
colons.)
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::despatch</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">KindCommands::despatch</span></span>:<br/>Neptune Files - <a href="4-nf.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc.html#SP16" class="function-link"><span class="function-syntax">KindCommands::recording_a_kind_template</span></a><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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"*END"</span><span class="plain-syntax">)) </span><a href="4-kc.html#SP16" class="function-link"><span class="function-syntax">KindCommands::end_kind_template</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-kc.html#SP16" class="function-link"><span class="function-syntax">KindCommands::record_into_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</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">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">':'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc.html#SP20" class="function-link"><span class="function-syntax">KindCommands::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="4-kc.html#SP20" class="function-link"><span class="function-syntax">KindCommands::end_kind_macro</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">); </span><span class="comment-syntax"> remove the terminal colon</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP12_1" class="named-paragraph-link"><span class="named-paragraph">Deal with the heading at the top of a kind command block</span><span class="named-paragraph-number">12.1</span></a></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">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP13" class="function-link"><span class="function-syntax">KindCommands::parse_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc.html#SP20" class="function-link"><span class="function-syntax">KindCommands::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="4-kc.html#SP20" class="function-link"><span class="function-syntax">KindCommands::record_into_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</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">constructor_described</span><span class="plain-syntax">) </span><a href="4-kc.html#SP24" class="function-link"><span class="function-syntax">KindCommands::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind command describes unspecified kind"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12_1" class="paragraph-anchor"></a><b>§12.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with the heading at the top of a kind command block</span><span class="named-paragraph-number">12.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) </span><a href="4-kc.html#SP20" class="function-link"><span class="function-syntax">KindCommands::begin_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) </span><a href="4-kc.html#SP16" class="function-link"><span class="function-syntax">KindCommands::begin_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</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="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">command</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">should_know</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">) == </span><span class="character-syntax">'+'</span><span class="plain-syntax">) { </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">); </span><span class="identifier-syntax">should_know</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">do_know</span><span class="plain-syntax"> = </span><a href="2-fk.html#SP11" class="function-link"><span class="function-syntax">FamiliarKinds::is_known</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">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">do_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">should_know</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind command describes kind with no known 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">do_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">should_know</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind command describes already-known kind"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP6" class="function-link"><span class="function-syntax">Kinds::Constructors::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">NEW_BASE_KINDS_CALLBACK</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CON_INTERMEDIATE</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NEW_BASE_KINDS_CALLBACK</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP6" class="function-link"><span class="function-syntax">Kinds::base_construction</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</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">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Parsing single kind commands. </b>Each command is read in as text, parsed and stored into a modest structure.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::parse_kind_command</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">KindCommands::parse_kind_command</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_2" class="named-paragraph-link"><span class="named-paragraph">Parse line into command and argument, divided by a colon</span><span class="named-paragraph-number">13.2</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_1" class="named-paragraph-link"><span class="named-paragraph">Initialise the STC to a blank command</span><span class="named-paragraph-number">13.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_3" class="named-paragraph-link"><span class="named-paragraph">Identify the command being used</span><span class="named-paragraph-number">13.3</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-></span><span class="element-syntax">operand_type</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">BOOLEAN_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_4" class="named-paragraph-link"><span class="named-paragraph">Parse a boolean argument for a kind command</span><span class="named-paragraph-number">13.4</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CCM_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_5" class="named-paragraph-link"><span class="named-paragraph">Parse a CCM argument for a kind command</span><span class="named-paragraph-number">13.5</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CONSTRUCTOR_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_9" class="named-paragraph-link"><span class="named-paragraph">Parse a constructor-name argument for a kind command</span><span class="named-paragraph-number">13.9</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MACRO_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_11" class="named-paragraph-link"><span class="named-paragraph">Parse a macro name argument for a kind command</span><span class="named-paragraph-number">13.11</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NUMERIC_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_8" class="named-paragraph-link"><span class="named-paragraph">Parse a numeric argument for a kind command</span><span class="named-paragraph-number">13.8</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEMPLATE_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_10" class="named-paragraph-link"><span class="named-paragraph">Parse a template name argument for a kind command</span><span class="named-paragraph-number">13.10</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_6" class="named-paragraph-link"><span class="named-paragraph">Parse a textual argument for a kind command</span><span class="named-paragraph-number">13.6</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">VOCABULARY_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP13_7" class="named-paragraph-link"><span class="named-paragraph">Parse a vocabulary argument for a kind command</span><span class="named-paragraph-number">13.7</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13_1" class="paragraph-anchor"></a><b>§13.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the STC to a blank command</span><span class="named-paragraph-number">13.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = -1;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">constructor_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_2" class="paragraph-anchor"></a><b>§13.2. </b>Spaces and tabs after the colon are skipped; so a textual argument cannot
|
||||
begin with those characters, but that doesn't matter for the things we need.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse line into command and argument, divided by a colon</span><span class="named-paragraph-number">13.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</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">Regexp::match</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%c+?) *: *(%c+?) *"</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</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><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="string-syntax">"kind command without argument"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_3" class="paragraph-anchor"></a><b>§13.3. </b>The following is clearly inefficient, but is not worth optimising. It makes
|
||||
about 20 string comparisons per command, and there are about 600 commands in a
|
||||
typical run of Inform, so the total cost is about 12,000 comparisons with
|
||||
quite small strings as arguments — which is negligible for our purposes,
|
||||
so we neglect it.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Identify the command being used</span><span class="named-paragraph-number">13.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">text_of_command</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</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">Str::eq_narrow_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">text_of_command</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> = &(</span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"no such kind command"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_4" class="paragraph-anchor"></a><b>§13.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a boolean argument for a kind command</span><span class="named-paragraph-number">13.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"yes"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"no"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"boolean kind command takes yes/no argument"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_5" class="paragraph-anchor"></a><b>§13.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a CCM argument for a kind command</span><span class="named-paragraph-number">13.5</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"none"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">NONE_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"literal"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">LITERAL_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"quantitative"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">NAMED_CONSTANT_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"special"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">SPECIAL_CCM</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"kind command with unknown constant-compilation-method"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_6" class="paragraph-anchor"></a><b>§13.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a textual argument for a kind command</span><span class="named-paragraph-number">13.6</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_7" class="paragraph-anchor"></a><b>§13.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a vocabulary argument for a kind command</span><span class="named-paragraph-number">13.7</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">feed_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::begin</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</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::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) >= </span><span class="constant-syntax">30</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"too many words in kind command"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_8" class="paragraph-anchor"></a><b>§13.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a numeric argument for a kind command</span><span class="named-paragraph-number">13.8</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_9" class="paragraph-anchor"></a><b>§13.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a constructor-name argument for a kind command</span><span class="named-paragraph-number">13.9</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</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">Regexp::match</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?)>>>(%c+)"</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">constructor_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_10" class="paragraph-anchor"></a><b>§13.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a template name argument for a kind command</span><span class="named-paragraph-number">13.10</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP15" class="function-link"><span class="function-syntax">KindCommands::parse_kind_template_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_11" class="paragraph-anchor"></a><b>§13.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a macro name argument for a kind command</span><span class="named-paragraph-number">13.11</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. Source text templates. </b>These are passages of I7 source text which can be inserted into the main
|
||||
source text at the request of any kind. An example would be:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which varies.</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary">The template <span class="extract"><span class="extract-syntax">*UNDERSTOOD-VARIABLE</span></span> contains only a single sentence of source
|
||||
text, and the idea is to make a new global variable associated with a given
|
||||
kind. Note that the text is not quite literal, because it can contain
|
||||
wildcards like <span class="extract"><span class="extract-syntax"><kind></span></span>, which expands to the name of the kind of value in
|
||||
question: for instance, we might get
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<p>number understood is a number which varies.</p>
|
||||
</blockquote>
|
||||
|
||||
<p class="commentary">There are a few limitations on what template text can include. Firstly,
|
||||
nothing with angle brackets in, except where a wildcard appears. Secondly,
|
||||
each sentence must end at the end of a line, and similarly the colon for
|
||||
any rule or other definition. Thus this template would fail:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which</span>
|
||||
<span class="plain-syntax"> varies. To judge <kind>: say "I judge [<kind> understood]."</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary">because the first sentence ends in the middle of the second line, and the
|
||||
colon dividing the phrase header from its definition is also mid-line. The
|
||||
template must be reformatted thus to work:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which varies.</span>
|
||||
<span class="plain-syntax"> To judge <kind>:</span>
|
||||
<span class="plain-syntax"> say "I judge [<kind> understood]."</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>So, to begin:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">KindCommands::new_kind_template</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">KindCommands::new_kind_template</span></span>:<br/><a href="4-kc.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">ttd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">KindCommands::parse_kind_template_name</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">KindCommands::parse_kind_template_name</span></span>:<br/><a href="4-kc.html#SP13_10">§13.10</a>, <a href="4-kc.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</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">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_template_definition</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</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">ttd</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>Here is the code which records templates, reading them as one line of plain
|
||||
text at a time. (In the above example, <span class="extract"><span class="extract-syntax">KindCommands::record_into_kind_template</span></span> would be
|
||||
called just once, with the single source text line.)
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the one now being recorded</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::recording_a_kind_template</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">KindCommands::recording_a_kind_template</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_kind_template</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>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::begin_kind_template</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">KindCommands::begin_kind_template</span></span>:<br/><a href="4-kc.html#SP12_1">§12.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">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">current_kind_template</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"first stt still recording"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc.html#SP15" class="function-link"><span class="function-syntax">KindCommands::parse_kind_template_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"duplicate definition of source text template"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP15" class="function-link"><span class="function-syntax">KindCommands::new_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax">-></span><span class="element-syntax">template_text</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP23" class="function-link"><span class="function-syntax">KindCommands::begin_recording_kind_text</span></a><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">KindCommands::record_into_kind_template</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">KindCommands::record_into_kind_template</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP23" class="function-link"><span class="function-syntax">KindCommands::record_kind_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</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">KindCommands::end_kind_template</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">KindCommands::end_kind_template</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_kind_template</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no stt currently recording"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP23" class="function-link"><span class="function-syntax">KindCommands::end_recording_kind_text</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>So much for recording a template. To "play back", we need to take its text
|
||||
and squeeze it into the main source text.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::transcribe_kind_template</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">KindCommands::transcribe_kind_template</span></span>:<br/><a href="4-kc.html#SP24_1">§24.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">ttd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to transcribe missing source text template"</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">CORE_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Plugins::Manage::plugged_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing_plugin</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*UNDERSTOOD-VARIABLE"</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="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_text</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">i</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'\n'</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">' '</span><span class="plain-syntax">)) { </span><span class="identifier-syntax">i</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">terminator</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">17.1</span></a></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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">terminator</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Sentences::make_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">terminator</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1" class="paragraph-anchor"></a><b>§17.1. </b>Inside template text, anything in angle brackets <...> is a wildcard.
|
||||
These cannot be nested and cannot include newlines. All other material is
|
||||
copied verbatim into the line buffer.
|
||||
</p>
|
||||
|
||||
<p class="commentary">The only sentence terminators we recognise are full stop and colon; in
|
||||
particular we wouldn't recognise a stop inside quoted matter. This does
|
||||
not matter, since such things never come into kind definitions.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">17.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</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">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'<'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'>'</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">++));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the template wildcard</span><span class="named-paragraph-number">17.1.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">) == </span><span class="character-syntax">'.'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">); </span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> = </span><span class="character-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">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">) == </span><span class="character-syntax">':'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">); </span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> = </span><span class="character-syntax">':'</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1" class="paragraph-anchor"></a><b>§17.1.1. </b>Only five wildcards are recognised:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the template wildcard</span><span class="named-paragraph-number">17.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name</span><span class="named-paragraph-number">17.1.1.1</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"lower-case-kind"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1_2" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">17.1.1.2</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind-weak-ID"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's weak ID</span><span class="named-paragraph-number">17.1.1.3</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"printing-routine"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">17.1.1.4</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"comparison-routine"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP17_1_1_5" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">17.1.1.5</span></a></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such source text template wildcard"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1">§17.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1_1" class="paragraph-anchor"></a><b>§17.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name</span><span class="named-paragraph-number">17.1.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP18" class="function-link"><span class="function-syntax">KindCommands::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1_1">§17.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1_2" class="paragraph-anchor"></a><b>§17.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">17.1.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP18" class="function-link"><span class="function-syntax">KindCommands::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1_1">§17.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1_3" class="paragraph-anchor"></a><b>§17.1.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's weak ID</span><span class="named-paragraph-number">17.1.1.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">weak_kind_ID</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1_1">§17.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1_4" class="paragraph-anchor"></a><b>§17.1.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">17.1.1.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_I6_identifier</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1_1">§17.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1_1_5" class="paragraph-anchor"></a><b>§17.1.1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">17.1.1.5</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">comparison_routine</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP17_1_1">§17.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>Where:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::transcribe_constructor_name</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">KindCommands::transcribe_constructor_name</span></span>:<br/><a href="4-kc.html#SP17_1_1_1">§17.1.1.1</a>, <a href="4-kc.html#SP17_1_1_2">§17.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">lower_case</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</span><span class="plain-syntax">) </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP13" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">full_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</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">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">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="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">full_length</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</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">i</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="character-syntax">' '</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">w1</span><span class="plain-syntax">+</span><span class="identifier-syntax">i</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">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">STROKE_V</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CAPITAL_K_V</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CAPITAL_L_V</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"value"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%V"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ve</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">lower_case</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. Type macros. </b>These are much simpler, and are just lists of kind commands grouped together
|
||||
under names.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the one now being recorded</span>
|
||||
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">KindCommands::new_kind_macro</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">KindCommands::new_kind_macro</span></span>:<br/><a href="4-kc.html#SP20">§20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</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">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">tmd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">KindCommands::parse_kind_macro_name</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">KindCommands::parse_kind_macro_name</span></span>:<br/><a href="4-kc.html#SP13_11">§13.11</a>, <a href="4-kc.html#SP20">§20</a><br/>Kind Constructors - <a href="4-kc2.html#SP6_1">§6.1</a>, <a href="4-kc2.html#SP10">§10</a>, <a href="4-kc2.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</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">tmd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</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">tmd</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. </b>And here once again is the code to record macros:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::recording_a_kind_macro</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">KindCommands::recording_a_kind_macro</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_kind_macro</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>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::begin_kind_macro</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">KindCommands::begin_kind_macro</span></span>:<br/><a href="4-kc.html#SP12_1">§12.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"duplicate definition of kind command macro"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::new_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">KindCommands::record_into_kind_macro</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">KindCommands::record_into_kind_macro</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</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">current_kind_macro</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind macro not being recorded"</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">current_kind_macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax"> >= </span><span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind macro contains too many lines"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">stc</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">KindCommands::end_kind_macro</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">KindCommands::end_kind_macro</span></span>:<br/><a href="4-kc.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_kind_macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"ended kind macro outside one"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. </b>Playing back is easier, since it's just a matter of despatching the stored
|
||||
commands in sequence to the relevant kind.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::play_back_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">KindCommands::play_back_kind_macro</span></span>:<br/><a href="4-kc.html#SP24_1">§24.1</a><br/>Kind Constructors - <a href="4-kc2.html#SP6_1">§6.1</a>, <a href="4-kc2.html#SP10">§10</a>, <a href="4-kc2.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::apply</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">KindCommands::apply</span></span>:<br/>Neptune Files - <a href="4-nf.html#SP1">§1</a><br/>Macros - <a href="4-mcr.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such kind macro to play back"</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">KIND_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S on %S (%d lines)\n"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax"><macro-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP24" class="function-link"><span class="function-syntax">KindCommands::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</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">KIND_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S ended\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>§22. The kind text archiver. </b>Large chunks of the text in the template will need to exist permanently in
|
||||
memory, and we go into recording mode to accept a series of them,
|
||||
concatenated with newlines dividing them, in a text stream.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>§23. </b>And here is recording mode:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindCommands::begin_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">KindCommands::begin_recording_kind_text</span></span>:<br/><a href="4-kc.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">kind_recording</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">KindCommands::record_kind_text</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">KindCommands::record_kind_text</span></span>:<br/><a href="4-kc.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</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">kind_recording</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't record outside recording"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax">, </span><span class="string-syntax">"%S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</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">KindCommands::end_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">KindCommands::end_recording_kind_text</span></span>:<br/><a href="4-kc.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>§24. Applying kind commands. </b>We take a single kind command and apply it to a given kind.
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">apply_macro_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">apply_template_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">can_coincide_with_property_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">can_exchange_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">cast_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">comparison_routine_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">comparison_schema_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">constant_compilation_method_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">10</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">constructor_arity_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">11</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">default_value_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">12</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">defined_in_source_text_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">13</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">description_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">14</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">distinguisher_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">15</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">documentation_reference_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">16</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">explicit_i6_GPR_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">17</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">group_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">18</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">has_i6_GPR_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">19</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">heap_size_estimate_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">i6_printing_routine_actions_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">21</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">i6_printing_routine_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">22</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">index_default_value_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">23</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">index_maximum_value_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">24</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">index_minimum_value_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">indexed_grey_if_empty_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">26</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">index_priority_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">27</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">conforms_to_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">28</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">is_incompletely_defined_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">29</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">is_template_variable_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">30</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">loop_domain_schema_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">31</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">modifying_adjective_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">multiple_block_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">33</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">named_values_created_with_assertions_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">34</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">plural_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">35</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">recognition_only_GPR_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">36</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">singular_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">37</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">specification_text_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">38</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">small_block_size_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">39</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">template_variable_number_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">40</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::apply_kind_command</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">KindCommands::apply_kind_command</span></span>:<br/><a href="4-kc.html#SP12">§12</a>, <a href="4-kc.html#SP21">§21</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null STC command"</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</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">KIND_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"apply: %s (%d/%d/%S/%S) to %d/%S\n"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-></span><span class="element-syntax">text_of_command</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</span><span class="plain-syntax">,</span>
|
||||
|
@ -889,37 +80,40 @@ concatenated with newlines dividing them, in a text stream.
|
|||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tcc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-></span><span class="element-syntax">opcode_number</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP24_1" class="named-paragraph-link"><span class="named-paragraph">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">24.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP24_2" class="named-paragraph-link"><span class="named-paragraph">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">24.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP24_3" class="named-paragraph-link"><span class="named-paragraph">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">24.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP24_4" class="named-paragraph-link"><span class="named-paragraph">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">24.4</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP1_2" class="named-paragraph-link"><span class="named-paragraph">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">1.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP1_4" class="named-paragraph-link"><span class="named-paragraph">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">1.4</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unimplemented kind command"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">cmd</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">cmd</span><span class="plain-syntax">, </span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-></span><span class="element-syntax">text_of_command</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cmd</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unimplemented kind command"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">cmd</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP24_1" class="paragraph-anchor"></a><b>§24.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">24.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tcc</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">apply_template_KCC:</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP17" class="function-link"><span class="function-syntax">KindCommands::transcribe_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-st.html#SP4" class="function-link"><span class="function-syntax">StarTemplates::transcribe</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">apply_macro_KCC:</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</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>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2" class="paragraph-anchor"></a><b>§24.2. </b></p>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_2" class="paragraph-anchor"></a><b>§1.2. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_CCM_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">24.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -927,11 +121,11 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">can_coincide_with_property</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">can_exchange</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">defined_in_source_text</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">has_i6_GPR</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">has_GPR</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">indexed_grey_if_empty</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">is_incompletely_defined</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">multiple_block</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">named_values_created_with_assertions</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">created_with_assertions</span><span class="plain-syntax">)</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">group</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">heap_size_estimate</span><span class="plain-syntax">)</span>
|
||||
|
@ -943,7 +137,7 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">default_value</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">distinguisher</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">documentation_reference</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">explicit_i6_GPR</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">explicit_GPR_identifier</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_default_value</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_maximum_value</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_minimum_value</span><span class="plain-syntax">)</span>
|
||||
|
@ -952,8 +146,8 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">specification_text</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_3" class="paragraph-anchor"></a><b>§24.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">24.3</span></span><span class="comment-syntax"> =</span>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>§1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">1.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -987,29 +181,32 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_4" class="paragraph-anchor"></a><b>§24.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">24.4</span></span><span class="comment-syntax"> =</span>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>§1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">1.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tcc</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">constructor_arity_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP24_4_1" class="named-paragraph-link"><span class="named-paragraph">Parse the constructor arity text</span><span class="named-paragraph-number">24.4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc.html#SP1_4_1" class="named-paragraph-link"><span class="named-paragraph">Parse the constructor arity text</span><span class="named-paragraph-number">1.4.1</span></a></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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">description_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">constructor_description</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">comparison_routine_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"overlong I6 identifier"</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"overlong identifier"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">comparison_routine</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_printing_routine_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"overlong I6 identifier"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_I6_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"overlong identifier"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">print_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_printing_routine_actions_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"overlong I6 identifier"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_of_printing_rule_ACTIONS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">) > </span><span class="constant-syntax">31</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"overlong identifier"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">ACTIONS_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">singular_KCC:</span><span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_KCC:</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> **</span><span class="identifier-syntax">array</span><span class="plain-syntax">; </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">length</span><span class="plain-syntax">;</span>
|
||||
|
@ -1053,12 +250,13 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<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">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">modifying_adjective_KCC:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"the modifying-adjective syntax has been withdrawn"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><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">I</span><span class="string-syntax">"the modifying-adjective syntax has been withdrawn"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</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>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_4_1" class="paragraph-anchor"></a><b>§24.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the constructor arity text</span><span class="named-paragraph-number">24.4.1</span></span><span class="comment-syntax"> =</span>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4_1" class="paragraph-anchor"></a><b>§1.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the constructor arity text</span><span class="named-paragraph-number">1.4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -1079,26 +277,15 @@ concatenated with newlines dividing them, in a text stream.
|
|||
<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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">wd</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"contravariant"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">variance</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">] = </span><span class="constant-syntax">CONTRAVARIANT</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">wd</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"optional"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">tupling</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">] = </span><span class="constant-syntax">ALLOW_NOTHING_TUPLING</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">wd</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"list"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">tupling</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">] = </span><span class="constant-syntax">ARBITRARY_TUPLING</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="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Word: <%S>\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">wd</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"illegal constructor-arity keyword"</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><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wd</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"illegal constructor-arity keyword"</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">wd</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">constructor_arity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c</span><span class="plain-syntax">+1;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP24_4">§24.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>§25. Completing a batch. </b>At one time it was useful to do some mopping-up work after a round of kind
|
||||
commands, so the following hook was devised; but at present it's not needed.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindCommands::batch_done</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc.html#SP1_4">§1.4</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-nf.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresscurrent">kc</li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-kc2.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-st.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresssection"><a href="4-mcr.html">mcr</a></li><li class="progresssection"><a href="4-ns.html">ns</a></li><li class="progresssection"><a href="4-st.html">st</a></li><li class="progresscurrent">kc</li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-kc2.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -66,33 +66,27 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#4">Chapter 4: Constructors</a></li><li><b>Kind Constructors</b></li></ul></div>
|
||||
<p class="purpose">The mechanism by which Inform records the characteristics of different kinds.</p>
|
||||
|
||||
<ul class="toc"><li><a href="4-kc2.html#SP6">§6. Creation</a></li><li><a href="4-kc2.html#SP7">§7. The noun</a></li><li><a href="4-kc2.html#SP8">§8. Names in the I6 template</a></li><li><a href="4-kc2.html#SP10">§10. Transformations</a></li><li><a href="4-kc2.html#SP13">§13. For construction purposes</a></li><li><a href="4-kc2.html#SP14">§14. Questions about constructors</a></li><li><a href="4-kc2.html#SP15">§15. Cast and instance lists</a></li><li><a href="4-kc2.html#SP17">§17. Compatibility</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="4-kc2.html#SP9">§9. Creation</a></li><li><a href="4-kc2.html#SP10">§10. The noun</a></li><li><a href="4-kc2.html#SP11">§11. Inter identifiers</a></li><li><a href="4-kc2.html#SP13">§13. Transformations</a></li><li><a href="4-kc2.html#SP16">§16. For construction purposes</a></li><li><a href="4-kc2.html#SP17">§17. Questions about constructors</a></li><li><a href="4-kc2.html#SP18">§18. Cast and instance lists</a></li><li><a href="4-kc2.html#SP20">§20. Compatibility</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Constructors are divided into four:
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Constructors are divided into four groups:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">KIND_VARIABLE_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> just </span><span class="extract"><span class="extract-syntax">CON_KIND_VARIABLE</span></span><span class="comment-syntax"> on its own</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">KIND_OF_KIND_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> an indefinite base constructor such as "arithmetic value"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">BASE_CONSTRUCTOR_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> a definite one such as "number"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">PROPER_CONSTRUCTOR_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> with positive arity, such as "list of K"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">KIND_OF_KIND_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> such as </span><span class="extract"><span class="extract-syntax">arithmetic value</span></span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">BASE_CONSTRUCTOR_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> such as </span><span class="extract"><span class="extract-syntax">number</span></span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">PROPER_CONSTRUCTOR_GRP</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> with positive arity, such as "list of ..."</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Inform provides much more extensive facilities for kinds than most
|
||||
programming languages do for their types. As far as possible, we want to
|
||||
write this code in a generalised way, rather than writing hacky routines
|
||||
which each apply to a fixed, named kind. This won't always be possible, it's
|
||||
true, but we can try. The only way to achieve this is to store an enormous
|
||||
rag-bag of properties for every kind constructor, showing exactly how it
|
||||
behaves.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Besides all the properties of kinds used in this module, Inform also needs
|
||||
to store further metadata in order to be able to make the extensive run-time
|
||||
code needed to support all these kinds in actual programs. All of this means
|
||||
that a <a href="4-kc2.html#SP2" class="internal">kind_constructor</a> object is a great big rag-bag of properties, some
|
||||
set by commands in Neptune files, others set by calls from Inform.
|
||||
</p>
|
||||
|
||||
<p class="commentary">All of which is by way of apology for the enormous size of the <span class="extract"><span class="extract-syntax">kind_constructor</span></span>
|
||||
structure. It looks impossibly large to fill out, and this is why we have the
|
||||
kind interpreter (see next section) to give the I6 template the ability to
|
||||
forge new kind constructors.
|
||||
<p class="commentary">So, deep breath:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LOWEST_INDEX_PRIORITY</span><span class="plain-syntax"> </span><span class="constant-syntax">100</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_KIND_CONSTRUCTION_ARITY</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_KIND_CONSTRUCTION_ARITY</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
|
||||
</pre>
|
||||
<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">kind_constructor</span><span class="plain-syntax"> {</span>
|
||||
|
@ -100,7 +94,7 @@ forge new kind constructors.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the four values above</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> A: how this came into being</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">defined_in_source_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> rather than by I6 template files, i.e., by being built-in</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">defined_in_source_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> rather than by Neptune files, i.e., by being built-in</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">is_incompletely_defined</span><span class="plain-syntax">; </span><span class="comment-syntax"> newly defined and ambiguous as yet</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">where_defined_in_source_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> if so</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stored_as</span><span class="plain-syntax">; </span><span class="comment-syntax"> currently unused: if this is a typedef for some construction</span>
|
||||
|
@ -118,7 +112,7 @@ forge new kind constructors.
|
|||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> D: how constant values of this kind are expressed</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">literal_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ways_to_write_literals</span><span class="plain-syntax">; </span><span class="comment-syntax"> list of ways to write this</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">named_values_created_with_assertions</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as "Train Arrival is a scene."</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">created_with_assertions</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as "Train Arrival is a scene."</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">named_values_created_with_table</span><span class="plain-syntax">; </span><span class="comment-syntax"> alternatively...</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">next_free_value</span><span class="plain-syntax">; </span><span class="comment-syntax"> to make distinguishable instances of this kind</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">constant_compilation_method</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_CCM</span></span><span class="comment-syntax"> values</span>
|
||||
|
@ -138,8 +132,8 @@ forge new kind constructors.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">dimensional_form_fixed</span><span class="plain-syntax">; </span><span class="comment-syntax"> whether they are derived</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> H: representing this kind at run-time</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">weak_kind_ID</span><span class="plain-syntax">; </span><span class="comment-syntax"> as used at run-time by the I6 template</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name_in_template_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 identifier</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">weak_kind_ID</span><span class="plain-syntax">; </span><span class="comment-syntax"> as used at run-time by Inter code</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name_in_template_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> an Inter identifier</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">class_number</span><span class="plain-syntax">; </span><span class="comment-syntax"> for classes of object</span>
|
||||
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">;</span>
|
||||
|
@ -151,9 +145,9 @@ forge new kind constructors.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiple_block</span><span class="plain-syntax">; </span><span class="comment-syntax"> TRUE for flexible-size values stored on the heap</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">heap_size_estimate</span><span class="plain-syntax">; </span><span class="comment-syntax"> typical number of bytes used</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">can_exchange</span><span class="plain-syntax">; </span><span class="comment-syntax"> with external files and therefore other story files</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">distinguisher</span><span class="plain-syntax">; </span><span class="comment-syntax"> I6 routine to see if values distinguishable</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">distinguisher</span><span class="plain-syntax">; </span><span class="comment-syntax"> Inter routine to see if values distinguishable</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_comparison_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_comparison_schema</span><span class="plain-syntax">; </span><span class="comment-syntax"> list of these</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">loop_domain_schema</span><span class="plain-syntax">; </span><span class="comment-syntax"> how to compile an I6 loop over the instances</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">loop_domain_schema</span><span class="plain-syntax">; </span><span class="comment-syntax"> how to compile a loop over the instances</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> J: printing and parsing values at run-time</span>
|
||||
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">BYTECODE_MODULE</span>
|
||||
|
@ -167,12 +161,12 @@ forge new kind constructors.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ranger_iname</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">trace_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dt_I6_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 identifier used for compiling printing rules</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name_of_printing_rule_ACTIONS</span><span class="plain-syntax">; </span><span class="comment-syntax"> ditto but for ACTIONS testing command</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">print_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> an Inter identifier used for compiling printing rules</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ACTIONS_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> ditto but for ACTIONS testing command</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">understand_as_values</span><span class="plain-syntax">; </span><span class="comment-syntax"> used when parsing such values</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">has_i6_GPR</span><span class="plain-syntax">; </span><span class="comment-syntax"> a general parsing routine exists in the I6 code for this</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">I6_GPR_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> and is actually required</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">explicit_i6_GPR</span><span class="plain-syntax">; </span><span class="comment-syntax"> routine name, when not compiled automatically</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">has_GPR</span><span class="plain-syntax">; </span><span class="comment-syntax"> a general parsing routine exists in the Inter code for this</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">needs_GPR</span><span class="plain-syntax">; </span><span class="comment-syntax"> and is actually required</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">explicit_GPR_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> routine name, when not compiled automatically</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">recognition_only_GPR</span><span class="plain-syntax">; </span><span class="comment-syntax"> for recognising an explicit value as preposition</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> K: indexing and documentation</span>
|
||||
|
@ -189,8 +183,45 @@ forge new kind constructors.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor is accessed in 2/tlok, 2/dk, 2/uk, 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The "tupling" of an argument is the extent to which an argument can be
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor is accessed in 2/tlok, 2/dk, 2/uk, 4/mcr, 4/st, 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>A few of the settings connect pairs of kinds together, so structures like
|
||||
the following are also needed.
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_casting_rule</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_from_kind_unparsed</span><span class="plain-syntax">; </span><span class="comment-syntax"> to the one which has the rule</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_from_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> to the one which has the rule</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_casting_rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_casting_rule</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_casting_rule</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_casting_rule is accessed in 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>And this is the analogous structure for giving Inter schemas to compare
|
||||
data of two different kinds:
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_comparison_schema</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparator_unparsed</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparator</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparison_schema</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">kind_constructor_comparison_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_comparison_schema</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_comparison_schema</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_comparison_schema is accessed in 4/kc.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And this is the analogous structure for giving Inter schemas to compare
|
||||
data of two different kinds:
|
||||
</p>
|
||||
|
||||
<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">kind_constructor_instance</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_of_this_unparsed</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_of_this</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">kind_constructor_instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_instance_rule</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_instance</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_constructor_instance is accessed in 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>The "tupling" of an argument is the extent to which an argument can be
|
||||
allowed to hold a variable-length list of kinds, rather than a single one.
|
||||
There aren't actually many possibilities.
|
||||
</p>
|
||||
|
@ -199,7 +230,7 @@ There aren't actually many possibilities.
|
|||
<span class="definition-keyword">define</span> <span class="constant-syntax">ALLOW_NOTHING_TUPLING</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> a single kind, or "nothing"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">ARBITRARY_TUPLING</span><span class="plain-syntax"> </span><span class="constant-syntax">10000</span><span class="plain-syntax"> </span><span class="comment-syntax"> a list of kinds of any length</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Constant compilation modes are:
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>Constant compilation modes are:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NONE_CCM</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> constant values of this kind cannot exist</span>
|
||||
|
@ -207,7 +238,7 @@ There aren't actually many possibilities.
|
|||
<span class="definition-keyword">define</span> <span class="constant-syntax">NAMED_CONSTANT_CCM</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> an </span><span class="extract"><span class="extract-syntax">instance</span></span><span class="comment-syntax"> annotation decides the value</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">SPECIAL_CCM</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> special code specific to the kind of value is needed</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>We keep track of the newest-created base kind of value (which isn't a kind
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>We keep track of the newest-created base kind of value (which isn't a kind
|
||||
of object) here:
|
||||
</p>
|
||||
|
||||
|
@ -215,20 +246,11 @@ of object) here:
|
|||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">next_free_data_type_ID</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">; </span><span class="comment-syntax"> i.e., leaving room for </span><span class="extract"><span class="extract-syntax">UNKNOWN_TY</span></span><span class="comment-syntax"> to be 1 at run-time</span>
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_base_kind_of_value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Creation. </b>Constructors come from two sources. Built-in ones like "number" or
|
||||
"list of K" mainly come from the commands given in the "Load-Core.i6t"
|
||||
template file, which consists almost entirely of commands for the kind
|
||||
interpreter, which sets up most of the above. (Similar files for other
|
||||
language plugins add the remainder.) Thus a great deal can be changed about
|
||||
the interplay of kinds without altering the compiler itself.
|
||||
</p>
|
||||
|
||||
<p class="commentary">New kinds created by the source text, by sentences like "Air pressure is a
|
||||
kind of value", are always base constructors (i.e., they have arity 0); at
|
||||
present there's no way to create new kinds of kinds, or new constructors, in
|
||||
Inform source text. (So an extension wanting to make new constructors, say
|
||||
to add new "collection classes" to Inform, will have to get its hands
|
||||
dirty with Inform 6 insertions and use of the kind interpreter.)
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Creation. </b>Constructors come from two sources. Built-in ones like <span class="extract"><span class="extract-syntax">number</span></span> or
|
||||
<span class="extract"><span class="extract-syntax">list of K</span></span> come from commands in <a href="4-nf.html" class="internal">Neptune Files</a>, while source-created
|
||||
ones ("Air pressure is a kind of value") result in calls here from
|
||||
<a href="2-knd.html#SP20" class="internal">Kinds::new_base</a> — which, as the name suggests, can only make
|
||||
base kinds, not proper constructors.
|
||||
</p>
|
||||
|
||||
<p class="commentary">Here <span class="extract"><span class="extract-syntax">super</span></span> will be the super-constructor, the one which this will construct
|
||||
|
@ -248,14 +270,14 @@ then <span class="extract"><span class="extract-syntax">CON_VALUE</span></span>
|
|||
</blockquote>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::new</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">Kinds::Constructors::new</span></span>:<br/>Kinds - <a href="2-knd.html#SP20">§20</a><br/>Kind Commands - <a href="4-kc.html#SP12_1">§12.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::new</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">Kinds::Constructors::new</span></span>:<br/>Kinds - <a href="2-knd.html#SP20">§20</a><br/>Neptune Syntax - <a href="4-ns.html#SP6_2">§6.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">source_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> **</span><span class="identifier-syntax">pC</span><span class="plain-syntax"> = </span><a href="2-fk.html#SP11" class="function-link"><span class="function-syntax">FamiliarKinds::known_con</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">source_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">pC</span><span class="plain-syntax">) *</span><span class="identifier-syntax">pC</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</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">super</span><span class="plain-syntax"> == </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-kc2.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Fill in a new constructor</span><span class="named-paragraph-number">6.1</span></a></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc2.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Copy the new constructor from its superconstructor</span><span class="named-paragraph-number">6.2</span></a></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">super</span><span class="plain-syntax"> == </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-kc2.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Fill in a new constructor</span><span class="named-paragraph-number">9.1</span></a></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-kc2.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Copy the new constructor from its superconstructor</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">CORE_MODULE</span>
|
||||
|
@ -274,13 +296,14 @@ then <span class="extract"><span class="extract-syntax">CON_VALUE</span></span>
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>§6.1. </b>If our new constructor is wholly new, and isn't a subkind of something else,
|
||||
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>§9.1. </b>If our new constructor is wholly new, and isn't a subkind of something else,
|
||||
we need to initialise the entire data structure; but note that, having done so,
|
||||
we ask the kind interpreter to load it up with any defaults set in the
|
||||
I6 template files.
|
||||
we apply any defaults set in Neptune files.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in a new constructor</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LOWEST_INDEX_PRIORITY</span><span class="plain-syntax"> </span><span class="constant-syntax">100</span>
|
||||
</pre>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill in a new constructor</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -309,7 +332,7 @@ I6 template files.
|
|||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> D: how constant values of this kind are expressed</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">ways_to_write_literals</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">named_values_created_with_assertions</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">created_with_assertions</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">named_values_created_with_table</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">next_free_value</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">constant_compilation_method</span><span class="plain-syntax"> = </span><span class="constant-syntax">NONE_CCM</span><span class="plain-syntax">;</span>
|
||||
|
@ -351,8 +374,8 @@ I6 template files.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">loop_domain_schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> J: printing and parsing values at run-time</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_I6_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_of_printing_rule_ACTIONS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">print_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">ACTIONS_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">BYTECODE_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">kind_GPR_iname</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">instance_GPR_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
@ -364,16 +387,16 @@ I6 template files.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">ranger_iname</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">source_name</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">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP8" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">);</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><a href="4-kc2.html#SP11" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">pr_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRINT_DASH_FN_HL</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">trace_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">pr_iname</span><span class="plain-syntax">;</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">understand_as_values</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">has_i6_GPR</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">I6_GPR_needed</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_i6_GPR</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">has_GPR</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">needs_GPR</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">explicit_GPR_identifier</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">recognition_only_GPR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> K: indexing and documentation</span>
|
||||
|
@ -387,14 +410,14 @@ I6 template files.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">indexed_grey_if_empty</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">documentation_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#DEFAULTS"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#DEFAULTS"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc2.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>§6.2. </b>However, if we create our constructor as a subkind, like so:
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc2.html#SP9">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>§9.2. </b>However, if we create our constructor as a subkind, like so:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
@ -408,7 +431,7 @@ I6 template files.
|
|||
It means that all kinds of object share the same weak ID as "object".
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Copy the new constructor from its superconstructor</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Copy the new constructor from its superconstructor</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -422,8 +445,8 @@ It means that all kinds of object share the same weak ID as "object".
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">cached_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> otherwise the superkind's cache is used by mistake</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">(); </span><span class="comment-syntax"> otherwise this will be called </span><span class="extract"><span class="extract-syntax">OBJECT_TY</span></span><span class="comment-syntax"> by mistake</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc2.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. The noun. </b>It's a requirement that the following be called soon after the creation
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-kc2.html#SP9">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. The noun. </b>It's a requirement that the following be called soon after the creation
|
||||
of the constructor:
|
||||
</p>
|
||||
|
||||
|
@ -433,7 +456,7 @@ of the constructor:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::get_name</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">Kinds::Constructors::get_name</span></span>:<br/><a href="4-kc2.html#SP8">§8</a><br/>Describing Kinds - <a href="2-dk.html#SP14">§14</a><br/>Using Kinds - <a href="2-uk.html#SP1">§1</a><br/>Kind Commands - <a href="4-kc.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::get_name</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">Kinds::Constructors::get_name</span></span>:<br/><a href="4-kc2.html#SP11">§11</a><br/>Describing Kinds - <a href="2-dk.html#SP14">§14</a><br/>Using Kinds - <a href="2-uk.html#SP1">§1</a><br/>Star Templates - <a href="4-st.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">noun</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</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">nt</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::nominative</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">);</span>
|
||||
|
@ -455,21 +478,21 @@ of the constructor:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Names in the I6 template. </b>An identifier like <span class="extract"><span class="extract-syntax">WHATEVER_TY</span></span>, then, begins life in a definition inside an
|
||||
I6 template file; becomes attached to a constructor here; and finally winds up
|
||||
back in I6 code, because we define it as the constant for the weak kind ID
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Inter identifiers. </b>An identifier like <span class="extract"><span class="extract-syntax">WHATEVER_TY</span></span>, then, begins life in a definition inside an
|
||||
Neptune file; becomes attached to a constructor here; and finally winds up
|
||||
back in Inter code, because we define it as the constant for the weak kind ID
|
||||
of the kind which the constructor makes:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::compile_I6_constants</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::emit_constants</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tn</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP8" class="function-link"><span class="function-syntax">Kinds::Constructors::name_in_template_code</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tn</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP11" class="function-link"><span class="function-syntax">Kinds::Constructors::name_in_template_code</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">tn</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">con_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_with_specific_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">WEAK_ID_HL</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">tn</span><span class="plain-syntax">, </span><a href="4-kc2.html#SP8" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">tn</span><span class="plain-syntax">, </span><a href="4-kc2.html#SP11" class="function-link"><span class="function-syntax">Kinds::Constructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Hierarchy::make_available</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">con_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::named_numeric_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">con_iname</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">weak_kind_ID</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -482,7 +505,7 @@ of the kind which the constructor makes:
|
|||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::UNKNOWN_iname</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">CON_UNKNOWN</span><span class="plain-syntax">-></span><span class="element-syntax">con_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::package</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">Kinds::Constructors::package</span></span>:<br/><a href="4-kc2.html#SP6_1">§6.1</a><br/>Using Kinds - <a href="2-uk.html#SP28">§28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::package</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">Kinds::Constructors::package</span></span>:<br/><a href="4-kc2.html#SP9_1">§9.1</a><br/>Using Kinds - <a href="2-uk.html#SP28">§28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">kc_package</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">defined_in_source_text</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CompilationUnits::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">where_defined_in_source_text</span><span class="plain-syntax">);</span>
|
||||
|
@ -493,7 +516,7 @@ of the kind which the constructor makes:
|
|||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">kc_package</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::synoptic_package</span><span class="plain-syntax">(</span><span class="identifier-syntax">KIND_HAP</span><span class="plain-syntax">);</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">W</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP7" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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::nonempty</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">Hierarchy::markup_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">kc_package</span><span class="plain-syntax">, </span><span class="identifier-syntax">KIND_NAME_HMD</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
||||
|
@ -524,12 +547,12 @@ of the kind which the constructor makes:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>We also need to parse this, occasionally (if we needed this more than a
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>We also need to parse this, occasionally (if we needed this more than a
|
||||
small and bounded number of times we'd want a faster method, but we don't):
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::parse</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">Kinds::Constructors::parse</span></span>:<br/><a href="4-kc2.html#SP15">§15</a>, <a href="4-kc2.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Constructors::parse</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">Kinds::Constructors::parse</span></span>:<br/><a href="4-kc2.html#SP18">§18</a>, <a href="4-kc2.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sn</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">sn</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="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax">)</span>
|
||||
|
@ -538,44 +561,44 @@ small and bounded number of times we'd want a faster method, but we don't):
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Transformations. </b>Conversions of an existing constructor to make it a unit or enumeration also
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Transformations. </b>Conversions of an existing constructor to make it a unit or enumeration also
|
||||
require running macros in the kind interpreter:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_unit</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">Kinds::Constructors::convert_to_unit</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP8">§8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">is_incompletely_defined</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#UNIT"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#UNIT"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">TRUE</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><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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="comment-syntax"> i.e., if it succeeded</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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="comment-syntax"> i.e., if it succeeded</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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_enumeration</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">Kinds::Constructors::convert_to_enumeration</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">is_incompletely_defined</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#ENUMERATION"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#ENUMERATION"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">linguistic</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#LINGUISTIC"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#LINGUISTIC"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">TRUE</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><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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="comment-syntax"> i.e., if it succeeded</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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="comment-syntax"> i.e., if it succeeded</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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>And similarly:
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>And similarly:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_real</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">Kinds::Constructors::convert_to_real</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP21" class="function-link"><span class="function-syntax">KindCommands::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP19" class="function-link"><span class="function-syntax">KindCommands::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#REAL"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP2" class="function-link"><span class="function-syntax">NeptuneMacros::play_back</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#REAL"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>A few base kinds are marked as "linguistic", which simply enables us to fence
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>A few base kinds are marked as "linguistic", which simply enables us to fence
|
||||
them tidily off in the index.
|
||||
</p>
|
||||
|
||||
|
@ -584,7 +607,7 @@ them tidily off in the index.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">linguistic</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. For construction purposes. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. For construction purposes. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind</span><span class="plain-syntax"> **</span><span class="function-syntax">Kinds::Constructors::cache_location</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">Kinds::Constructors::cache_location</span></span>:<br/>Kinds - <a href="2-knd.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
|
@ -592,7 +615,7 @@ them tidily off in the index.
|
|||
<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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::arity</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">Kinds::Constructors::arity</span></span>:<br/>Kinds - <a href="2-knd.html#SP6">§6</a>, <a href="2-knd.html#SP6_3">§6.3</a>, <a href="2-knd.html#SP13">§13</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP7">§7</a>, <a href="2-tlok.html#SP12_4">§12.4</a><br/>Describing Kinds - <a href="2-dk.html#SP12">§12</a>, <a href="2-dk.html#SP12_1">§12.1</a>, <a href="2-dk.html#SP24_3">§24.3</a>, <a href="2-dk.html#SP24_3_2">§24.3.2</a><br/>Using Kinds - <a href="2-uk.html#SP4">§4</a><br/>Kind Commands - <a href="4-kc.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::arity</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">Kinds::Constructors::arity</span></span>:<br/>Kinds - <a href="2-knd.html#SP6">§6</a>, <a href="2-knd.html#SP6_3">§6.3</a>, <a href="2-knd.html#SP13">§13</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP7">§7</a>, <a href="2-tlok.html#SP12_4">§12.4</a><br/>Describing Kinds - <a href="2-dk.html#SP12">§12</a>, <a href="2-dk.html#SP12_1">§12.1</a>, <a href="2-dk.html#SP24_3">§24.3</a>, <a href="2-dk.html#SP24_3_2">§24.3.2</a><br/>Using Kinds - <a href="2-uk.html#SP4">§4</a><br/>Star Templates - <a href="4-st.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">PROPER_CONSTRUCTOR_GRP</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">constructor_arity</span><span class="plain-syntax">;</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>
|
||||
|
@ -606,12 +629,12 @@ them tidily off in the index.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">variance</span><span class="plain-syntax">[</span><span class="identifier-syntax">b</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. Questions about constructors. </b>The rest of Inform is not encouraged to poke at constructors directly; it
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. Questions about constructors. </b>The rest of Inform is not encouraged to poke at constructors directly; it
|
||||
ought to ask questions about kinds instead (see "Using Kinds"). However:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_definite</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">Kinds::Constructors::is_definite</span></span>:<br/><a href="4-kc2.html#SP18">§18</a><br/>Using Kinds - <a href="2-uk.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_definite</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">Kinds::Constructors::is_definite</span></span>:<br/><a href="4-kc2.html#SP21">§21</a><br/>Using Kinds - <a href="2-uk.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">BASE_CONSTRUCTOR_GRP</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">PROPER_CONSTRUCTOR_GRP</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">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
@ -623,42 +646,42 @@ ought to ask questions about kinds instead (see "Using Kinds"). However:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">weak_kind_ID</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_arithmetic</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">Kinds::Constructors::is_arithmetic</span></span>:<br/><a href="4-kc2.html#SP10">§10</a><br/>Using Kinds - <a href="2-uk.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_arithmetic</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">Kinds::Constructors::is_arithmetic</span></span>:<br/><a href="4-kc2.html#SP13">§13</a><br/>Using Kinds - <a href="2-uk.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_arithmetic_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_arithmetic_and_real</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::is_arithmetic_and_real</span></span>:<br/>Floating-Point Values - <a href="3-fv.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_real_arithmetic_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_enumeration</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></span>:<br/><a href="4-kc2.html#SP10">§10</a><br/>Using Kinds - <a href="2-uk.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::is_enumeration</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></span>:<br/><a href="4-kc2.html#SP13">§13</a><br/>Using Kinds - <a href="2-uk.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_enumerated_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. Cast and instance lists. </b>Each constructor has a list of other constructors (all of the <span class="extract"><span class="extract-syntax">KIND_OF_KIND_GRP</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. Cast and instance lists. </b>Each constructor has a list of other constructors (all of the <span class="extract"><span class="extract-syntax">KIND_OF_KIND_GRP</span></span>
|
||||
group) which it's an instance of: value, word value, arithmetic value, and so on.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::find_cast</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::find_cast</span></span>:<br/><a href="4-kc2.html#SP17">§17</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP12_5">§12.5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::find_cast</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::find_cast</span></span>:<br/><a href="4-kc2.html#SP20">§20</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP12_5">§12.5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</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">to</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_casting_rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></span><span class="element-syntax">first_casting_rule</span><span class="plain-syntax">; </span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">; </span><span class="identifier-syntax">dtcr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">next_casting_rule</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">cast_from_kind_unparsed</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">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">cast_from_kind</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP9" class="function-link"><span class="function-syntax">Kinds::Constructors::parse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">cast_from_kind_unparsed</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP12" class="function-link"><span class="function-syntax">Kinds::Constructors::parse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">cast_from_kind_unparsed</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="identifier-syntax">cast_from_kind_unparsed</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">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">dtcr</span><span class="plain-syntax">-></span><span class="element-syntax">cast_from_kind</span><span class="plain-syntax">)</span>
|
||||
|
@ -668,17 +691,17 @@ group) which it's an instance of: value, word value, arithmetic value, and so on
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>Each constructor has a list of other constructors (all of the <span class="extract"><span class="extract-syntax">BASE_CONSTRUCTOR_GRP</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. </b>Each constructor has a list of other constructors (all of the <span class="extract"><span class="extract-syntax">BASE_CONSTRUCTOR_GRP</span></span>
|
||||
group or <span class="extract"><span class="extract-syntax">PROPER_CONSTRUCTOR_GRP</span></span>) which it can cast to.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::find_instance</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::find_instance</span></span>:<br/><a href="4-kc2.html#SP17">§17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::find_instance</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::find_instance</span></span>:<br/><a href="4-kc2.html#SP20">§20</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dti</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dti</span><span class="plain-syntax"> = </span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">first_instance_rule</span><span class="plain-syntax">; </span><span class="identifier-syntax">dti</span><span class="plain-syntax">; </span><span class="identifier-syntax">dti</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dti</span><span class="plain-syntax">-></span><span class="element-syntax">next_instance_rule</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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this_unparsed</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">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP9" class="function-link"><span class="function-syntax">Kinds::Constructors::parse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this_unparsed</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP12" class="function-link"><span class="function-syntax">Kinds::Constructors::parse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this_unparsed</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this_unparsed</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">dti</span><span class="plain-syntax">-></span><span class="element-syntax">instance_of_this</span><span class="plain-syntax"> == </span><span class="identifier-syntax">to</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>
|
||||
|
@ -686,41 +709,41 @@ group or <span class="extract"><span class="extract-syntax">PROPER_CONSTRUCTOR_G
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. Compatibility. </b>The following tests if <span class="extract"><span class="extract-syntax">from</span></span> is compatible with <span class="extract"><span class="extract-syntax">to</span></span>.
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. Compatibility. </b>The following tests if <span class="extract"><span class="extract-syntax">from</span></span> is compatible with <span class="extract"><span class="extract-syntax">to</span></span>.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::compatible</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::compatible</span></span>:<br/><a href="4-kc2.html#SP14">§14</a>, <a href="4-kc2.html#SP18">§18</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::compatible</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::compatible</span></span>:<br/><a href="4-kc2.html#SP17">§17</a>, <a href="4-kc2.html#SP21">§21</a><br/>The Lattice of Kinds - <a href="2-tlok.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</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">allow_casts</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">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">from</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">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">from</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">allow_casts</span><span class="plain-syntax">) && (</span><a href="4-kc2.html#SP15" class="function-link"><span class="function-syntax">Kinds::Constructors::find_cast</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</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><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::find_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</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">allow_casts</span><span class="plain-syntax">) && (</span><a href="4-kc2.html#SP18" class="function-link"><span class="function-syntax">Kinds::Constructors::find_cast</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</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><a href="4-kc2.html#SP19" class="function-link"><span class="function-syntax">Kinds::Constructors::find_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>And more elaborately:
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. </b>And more elaborately:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP23">§23</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">con</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP14" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_pointer_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::is_definite</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) &&</span>
|
||||
<span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_pointer_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</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">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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::allow_word_as_pointer</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">left</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">right</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP18" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP18" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP17" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</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><a href="4-kc2.html#SP21" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP21" class="function-link"><span class="function-syntax">Kinds::Constructors::uses_pointer_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP20" class="function-link"><span class="function-syntax">Kinds::Constructors::compatible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</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>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-kc.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresscurrent">kc2</li><li class="progressnextoff">❯</li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-kc.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresssection"><a href="4-mcr.html">mcr</a></li><li class="progresssection"><a href="4-ns.html">ns</a></li><li class="progresssection"><a href="4-st.html">st</a></li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresscurrent">kc2</li><li class="progressnextoff">❯</li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
150
docs/kinds-module/4-mcr.html
Normal file
150
docs/kinds-module/4-mcr.html
Normal file
|
@ -0,0 +1,150 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Macros</title>
|
||||
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Language" content="en-gb">
|
||||
|
||||
<link href="../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">
|
||||
<script>
|
||||
function togglePopup(material_id) {
|
||||
var popup = document.getElementById(material_id);
|
||||
popup.classList.toggle("show");
|
||||
}
|
||||
</script>
|
||||
|
||||
<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">
|
||||
|
||||
</head>
|
||||
<body class="commentary-font">
|
||||
<nav role="navigation">
|
||||
<h1><a href="../index.html">
|
||||
<img src="../docs-assets/Inform.png" height=72">
|
||||
</a></h1>
|
||||
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
||||
<li><a href="../other.html">other tools</a></li>
|
||||
<li><a href="../extensions.html">extensions and kits</a></li>
|
||||
<li><a href="../units.html">unit test tools</a></li>
|
||||
</ul><h2>Compiler Webs</h2><ul>
|
||||
<li><a href="../inbuild/index.html">inbuild</a></li>
|
||||
<li><a href="../inform7/index.html">inform7</a></li>
|
||||
<li><a href="../inter/index.html">inter</a></li>
|
||||
</ul><h2>Inbuild Modules</h2><ul>
|
||||
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
||||
</ul><h2>Inform7 Modules</h2><ul>
|
||||
<li><a href="../core-module/index.html">core</a></li>
|
||||
<li><a href="index.html"><span class="selectedlink">kinds</span></a></li>
|
||||
<li><a href="../if-module/index.html">if</a></li>
|
||||
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
||||
<li><a href="../index-module/index.html">index</a></li>
|
||||
</ul><h2>Inter Modules</h2><ul>
|
||||
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
||||
<li><a href="../building-module/index.html">building</a></li>
|
||||
<li><a href="../codegen-module/index.html">codegen</a></li>
|
||||
</ul><h2>Services</h2><ul>
|
||||
<li><a href="../arch-module/index.html">arch</a></li>
|
||||
<li><a href="../syntax-module/index.html">syntax</a></li>
|
||||
<li><a href="../words-module/index.html">words</a></li>
|
||||
<li><a href="../html-module/index.html">html</a></li>
|
||||
<li><a href="../inflections-module/index.html">inflections</a></li>
|
||||
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
||||
<li><a href="../problems-module/index.html">problems</a></li>
|
||||
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<main role="main">
|
||||
<!--Weave of 'Macros' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#4">Chapter 4: Constructors</a></li><li><b>Macros</b></li></ul></div>
|
||||
<p class="purpose">Neptune supports named macros, though they are only lists of kind commands.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax"> </span><span class="comment-syntax"> maximum number of commands in any one macro</span>
|
||||
</pre>
|
||||
<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">kind_macro_definition</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_macro_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the sharp, e.g., </span><span class="extract"><span class="extract-syntax">"#UNIT"</span></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_macro_line_count</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">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_km</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the one now being recorded</span>
|
||||
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">NeptuneMacros::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</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">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">tmd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">NeptuneMacros::parse_name</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">NeptuneMacros::parse_name</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6_12">§6.12</a><br/>Kind Constructors - <a href="4-kc2.html#SP9_1">§9.1</a>, <a href="4-kc2.html#SP13">§13</a>, <a href="4-kc2.html#SP14">§14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</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">tmd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</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">tmd</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneMacros::recording</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">NeptuneMacros::recording</span></span>:<br/>Neptune Files - <a href="4-nf.html#SP1">§1</a><br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_km</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>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneMacros::begin</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">NeptuneMacros::begin</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"duplicate definition of kind command macro"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_km</span><span class="plain-syntax"> = </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">NeptuneMacros::record_into_macro</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">NeptuneMacros::record_into_macro</span></span>:<br/>Neptune Files - <a href="4-nf.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">current_km</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind macro not being recorded"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">current_km</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax"> >= </span><span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">current_km</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind macro contains too many lines"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_km</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">current_km</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">stc</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">NeptuneMacros::end</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">NeptuneMacros::end</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">current_km</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><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">I</span><span class="string-syntax">"ended kind macro outside one"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_km</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_macro_definition is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Playing back is easier, since it's just a matter of despatching the stored
|
||||
commands in sequence to the relevant kind.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneMacros::play_back</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">NeptuneMacros::play_back</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP1_1">§1.1</a><br/>Kind Constructors - <a href="4-kc2.html#SP9_1">§9.1</a>, <a href="4-kc2.html#SP13">§13</a>, <a href="4-kc2.html#SP14">§14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"no such kind macro to play back"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">KIND_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S on %S (%d lines)\n"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax"><macro-></span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP1" class="function-link"><span class="function-syntax">KindCommands::apply</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</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">KIND_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S ended\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-></span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-nf.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresscurrent">mcr</li><li class="progresssection"><a href="4-ns.html">ns</a></li><li class="progresssection"><a href="4-st.html">st</a></li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-ns.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -80,9 +80,20 @@ where these files were first conceived and implemented.
|
|||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneFiles::load_kinds_helper</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">state</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">) == </span><span class="character-syntax">'!'</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</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="comment-syntax"> skip blanks and comments</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc.html#SP12" class="function-link"><span class="function-syntax">KindCommands::despatch</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP1" class="function-link"><span class="function-syntax">NeptuneFiles::read_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">NeptuneFiles::read_command</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'!'</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</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="comment-syntax"> skip blanks and comments</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax"> = </span><a href="4-ns.html#SP6" class="function-link"><span class="function-syntax">NeptuneSyntax::parse_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::recording</span></a><span class="plain-syntax">()) </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::record_into_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">defined_for</span><span class="plain-syntax">) </span><a href="4-kc.html#SP1" class="function-link"><span class="function-syntax">KindCommands::apply</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">defined_for</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind command describes unspecified kind"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Neptune files are in the strange position in being not quite for end users —
|
||||
|
@ -95,21 +106,28 @@ internals — scope for play.
|
|||
</p>
|
||||
|
||||
<p class="commentary">The Neptune files supplied with Inform's standard distribution are correct,
|
||||
so errors can only result from mistakes by such hackers. We strike a sort of
|
||||
middle position: when we fine errors, we won't feel obliged to produce
|
||||
elegant problem messages, and will instead throw internal errors or (in some
|
||||
cases) generate incorrect Inter code leading to internal errors later on.
|
||||
But we won't actually crash if we can help it.
|
||||
so errors can only result from mistakes by hackers. Until 2020 these simply
|
||||
threw internal errors; we now issue errors up to the user in such a way that
|
||||
the Inform GUI can at least display them, if not very elegantly.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneFiles::error</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">NeptuneFiles::error</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP13_2">§13.2</a>, <a href="4-kc.html#SP13_3">§13.3</a>, <a href="4-kc.html#SP13_4">§13.4</a>, <a href="4-kc.html#SP13_5">§13.5</a>, <a href="4-kc.html#SP13_7">§13.7</a>, <a href="4-kc.html#SP13_10">§13.10</a>, <a href="4-kc.html#SP13_11">§13.11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">error</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Kind command error found at: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">command</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="identifier-syntax">error</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneFiles::error</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">NeptuneFiles::error</span></span>:<br/><a href="4-nf.html#SP1">§1</a><br/>Macros - <a href="4-mcr.html#SP1">§1</a>, <a href="4-mcr.html#SP2">§2</a><br/>Neptune Syntax - <a href="4-ns.html#SP6_2">§6.2</a>, <a href="4-ns.html#SP6_3">§6.3</a>, <a href="4-ns.html#SP6_4">§6.4</a>, <a href="4-ns.html#SP6_5">§6.5</a>, <a href="4-ns.html#SP6_6">§6.6</a>, <a href="4-ns.html#SP6_8">§6.8</a>, <a href="4-ns.html#SP6_11">§6.11</a>, <a href="4-ns.html#SP6_12">§6.12</a><br/>Star Templates - <a href="4-st.html#SP3">§3</a>, <a href="4-st.html#SP4">§4</a>, <a href="4-st.html#SP4_1_1">§4.1.1</a>, <a href="4-st.html#SP7">§7</a><br/>Kind Commands - <a href="4-kc.html#SP1">§1</a>, <a href="4-kc.html#SP1_4">§1.4</a>, <a href="4-kc.html#SP1_4_1">§1.4.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">error</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</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">tfp</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"error in Neptune file '%f', line %d ('%S'): %S"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">-></span><span class="identifier-syntax">text_file_filename</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">-></span><span class="identifier-syntax">line_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">error</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"error in Neptune command execution: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">error</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="1-km.html#SP5" class="function-link"><span class="function-syntax">KindsModule::problem_handler</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NeptuneError_KINDERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="3-sav.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">nf</li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-kc.html">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="3-sav.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">nf</li><li class="progresssection"><a href="4-mcr.html">mcr</a></li><li class="progresssection"><a href="4-ns.html">ns</a></li><li class="progresssection"><a href="4-st.html">st</a></li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-mcr.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
459
docs/kinds-module/4-ns.html
Normal file
459
docs/kinds-module/4-ns.html
Normal file
|
@ -0,0 +1,459 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Neptune Syntax</title>
|
||||
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Language" content="en-gb">
|
||||
|
||||
<link href="../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">
|
||||
<script>
|
||||
function togglePopup(material_id) {
|
||||
var popup = document.getElementById(material_id);
|
||||
popup.classList.toggle("show");
|
||||
}
|
||||
</script>
|
||||
|
||||
<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">
|
||||
|
||||
</head>
|
||||
<body class="commentary-font">
|
||||
<nav role="navigation">
|
||||
<h1><a href="../index.html">
|
||||
<img src="../docs-assets/Inform.png" height=72">
|
||||
</a></h1>
|
||||
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
||||
<li><a href="../other.html">other tools</a></li>
|
||||
<li><a href="../extensions.html">extensions and kits</a></li>
|
||||
<li><a href="../units.html">unit test tools</a></li>
|
||||
</ul><h2>Compiler Webs</h2><ul>
|
||||
<li><a href="../inbuild/index.html">inbuild</a></li>
|
||||
<li><a href="../inform7/index.html">inform7</a></li>
|
||||
<li><a href="../inter/index.html">inter</a></li>
|
||||
</ul><h2>Inbuild Modules</h2><ul>
|
||||
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
||||
</ul><h2>Inform7 Modules</h2><ul>
|
||||
<li><a href="../core-module/index.html">core</a></li>
|
||||
<li><a href="index.html"><span class="selectedlink">kinds</span></a></li>
|
||||
<li><a href="../if-module/index.html">if</a></li>
|
||||
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
||||
<li><a href="../index-module/index.html">index</a></li>
|
||||
</ul><h2>Inter Modules</h2><ul>
|
||||
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
||||
<li><a href="../building-module/index.html">building</a></li>
|
||||
<li><a href="../codegen-module/index.html">codegen</a></li>
|
||||
</ul><h2>Services</h2><ul>
|
||||
<li><a href="../arch-module/index.html">arch</a></li>
|
||||
<li><a href="../syntax-module/index.html">syntax</a></li>
|
||||
<li><a href="../words-module/index.html">words</a></li>
|
||||
<li><a href="../html-module/index.html">html</a></li>
|
||||
<li><a href="../inflections-module/index.html">inflections</a></li>
|
||||
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
||||
<li><a href="../problems-module/index.html">problems</a></li>
|
||||
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<main role="main">
|
||||
<!--Weave of 'Neptune Syntax' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#4">Chapter 4: Constructors</a></li><li><b>Neptune Syntax</b></li></ul></div>
|
||||
<p class="purpose">To parse individual commands from Neptune files.</p>
|
||||
|
||||
<ul class="toc"><li><a href="4-ns.html#SP1">§1. Specification of the Neptune language</a></li><li><a href="4-ns.html#SP2">§2. The command set</a></li><li><a href="4-ns.html#SP6">§6. Parsing single kind commands</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Specification of the Neptune language. </b>Everyone loves a mini-language, so here is one. At the top level:
|
||||
</p>
|
||||
|
||||
<ul class="items"><li>(a) Lines consisting of white space or whose first non-white space character is
|
||||
<span class="extract"><span class="extract-syntax">!</span></span> are ignored as comments.
|
||||
</li><li>(b) A line ending with a colon <span class="extract"><span class="extract-syntax">:</span></span> opens a new block. The text before the colon
|
||||
is the title of the block, except that the first character indicates its type:
|
||||
<ul class="items"><li>(1) An asterisk means that the block is a "star template": for instance,
|
||||
<span class="extract"><span class="extract-syntax">*PRINTING-ROUTINE:</span></span> says the block defines a template called <span class="extract"><span class="extract-syntax">PRINTING-ROUTINE</span></span>.
|
||||
A template consists of Inform 7 source text which extends as far as the next
|
||||
<span class="extract"><span class="extract-syntax">*END</span></span> line.
|
||||
</li><li>(2) A sharp sign <span class="extract"><span class="extract-syntax">#</span></span> means that the block is a macro definition. For
|
||||
instance, <span class="extract"><span class="extract-syntax">#UNIT:</span></span> says the block defines a template called <span class="extract"><span class="extract-syntax">UNIT</span></span>. A macro
|
||||
is just a sequence of lines holding kind commands which continues to
|
||||
the beginning of the next block, or the end of the file.
|
||||
</li><li>(3) And otherwise the block is a kind definition, but the optional opening
|
||||
character <span class="extract"><span class="extract-syntax">+</span></span> marks the kind as one which Inform requires the existence of.
|
||||
Thus <span class="extract"><span class="extract-syntax">+NUMBER_TY:</span></span>, since Inform will crash if the template doesn't set this
|
||||
kind up, but <span class="extract"><span class="extract-syntax">BOOJUMS_TY:</span></span> would validly declare a new kind called
|
||||
<span class="extract"><span class="extract-syntax">BOOJUMS_TY</span></span> which isn't special to any of Inform's internals. The <span class="extract"><span class="extract-syntax">+</span></span> signs
|
||||
are there as a help for hackers looking at the I6 template and wondering what
|
||||
they can safely monkey with.
|
||||
</li></ul>
|
||||
<li>(c) That just leaves the lines within blocks. Each of these is a usage of one
|
||||
of the commands, given in the form <span class="extract"><span class="extract-syntax">operation: operand</span></span>, i.e., divided by a
|
||||
colon and some optional spacing.
|
||||
</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. The command set. </b>Each different operation is defined with a block like so:
|
||||
</p>
|
||||
|
||||
<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">kind_command_definition</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text_of_command</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">opcode_number</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_KCC</span></span><span class="comment-syntax"> values below</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">operand_type</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_KCA</span></span><span class="comment-syntax"> values below</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_command_definition</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_command_definition is accessed in 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The operands have different types, and the possibilities are given here:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">NO_KCA</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="comment-syntax"> there's no operand</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> must be </span><span class="extract"><span class="extract-syntax">yes</span></span><span class="comment-syntax"> or </span><span class="extract"><span class="extract-syntax">no</span></span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">CCM_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> a constant compilation method</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> any text (no quotation marks or other delimiters are used)</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> any single word</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> any decimal number</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> any valid kind number, such as "number"</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">TEMPLATE_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a template whose definition is given in the file</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">MACRO_KCA</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a macro whose definition is given in the file</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>And, to cut to the chase, here is the complete table of commands:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">apply_macro_KCC</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">apply_template_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">can_coincide_with_property_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">can_exchange_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">cast_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">comparison_routine_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">comparison_schema_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">constant_compilation_method_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">constructor_arity_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">default_value_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">defined_in_source_text_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">description_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">distinguisher_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">documentation_reference_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">explicit_GPR_identifier_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">group_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">has_GPR_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">heap_size_estimate_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">i6_printing_routine_actions_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">i6_printing_routine_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">index_default_value_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">index_maximum_value_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">index_minimum_value_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">indexed_grey_if_empty_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">index_priority_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">conforms_to_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">is_incompletely_defined_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">is_template_variable_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">loop_domain_schema_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">modifying_adjective_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">multiple_block_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">created_with_assertions_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">plural_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">recognition_only_GPR_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">singular_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">specification_text_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">small_block_size_KCC</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">template_variable_number_KCC</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_command_definition</span><span class="plain-syntax"> </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[] = {</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"can-coincide-with-property"</span><span class="plain-syntax">, </span><span class="constant-syntax">can_coincide_with_property_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"can-exchange"</span><span class="plain-syntax">, </span><span class="constant-syntax">can_exchange_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"defined-in-source-text"</span><span class="plain-syntax">, </span><span class="constant-syntax">defined_in_source_text_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"has-i6-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">has_GPR_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"indexed-grey-if-empty"</span><span class="plain-syntax">, </span><span class="constant-syntax">indexed_grey_if_empty_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"is-incompletely-defined"</span><span class="plain-syntax">, </span><span class="constant-syntax">is_incompletely_defined_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"is-template-variable"</span><span class="plain-syntax">, </span><span class="constant-syntax">is_template_variable_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"multiple-block"</span><span class="plain-syntax">, </span><span class="constant-syntax">multiple_block_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"created-with-assertions"</span><span class="plain-syntax">, </span><span class="constant-syntax">created_with_assertions_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"constant-compilation-method"</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_compilation_method_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CCM_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"comparison-routine"</span><span class="plain-syntax">, </span><span class="constant-syntax">comparison_routine_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"default-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">default_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"description"</span><span class="plain-syntax">, </span><span class="constant-syntax">description_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"distinguisher"</span><span class="plain-syntax">, </span><span class="constant-syntax">distinguisher_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"documentation-reference"</span><span class="plain-syntax">, </span><span class="constant-syntax">documentation_reference_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"explicit-i6-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">explicit_GPR_identifier_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"i6-printing-routine"</span><span class="plain-syntax">, </span><span class="constant-syntax">i6_printing_routine_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"i6-printing-routine-actions"</span><span class="plain-syntax">, </span><span class="constant-syntax">i6_printing_routine_actions_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-default-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_default_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-maximum-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_maximum_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-minimum-value"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_minimum_value_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"loop-domain-schema"</span><span class="plain-syntax">, </span><span class="constant-syntax">loop_domain_schema_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"recognition-only-GPR"</span><span class="plain-syntax">, </span><span class="constant-syntax">recognition_only_GPR_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"specification-text"</span><span class="plain-syntax">, </span><span class="constant-syntax">specification_text_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"cast"</span><span class="plain-syntax">, </span><span class="constant-syntax">cast_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"comparison-schema"</span><span class="plain-syntax">, </span><span class="constant-syntax">comparison_schema_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"conforms-to"</span><span class="plain-syntax">, </span><span class="constant-syntax">conforms_to_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CONSTRUCTOR_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"modifying-adjective"</span><span class="plain-syntax">, </span><span class="constant-syntax">modifying_adjective_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"plural"</span><span class="plain-syntax">, </span><span class="constant-syntax">plural_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"singular"</span><span class="plain-syntax">, </span><span class="constant-syntax">singular_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"constructor-arity"</span><span class="plain-syntax">, </span><span class="constant-syntax">constructor_arity_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"group"</span><span class="plain-syntax">, </span><span class="constant-syntax">group_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"heap-size-estimate"</span><span class="plain-syntax">, </span><span class="constant-syntax">heap_size_estimate_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"index-priority"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_priority_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"small-block-size"</span><span class="plain-syntax">, </span><span class="constant-syntax">small_block_size_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"template-variable-number"</span><span class="plain-syntax">, </span><span class="constant-syntax">template_variable_number_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"apply-template"</span><span class="plain-syntax">, </span><span class="constant-syntax">apply_template_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEMPLATE_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="string-syntax">"apply-macro"</span><span class="plain-syntax">, </span><span class="constant-syntax">apply_macro_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">MACRO_KCA</span><span class="plain-syntax"> },</span>
|
||||
|
||||
<span class="plain-syntax"> { </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="constant-syntax">NO_KCA</span><span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">};</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>When processing a command, we parse it into one of the following structures:
|
||||
</p>
|
||||
|
||||
<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">single_kind_command</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">kind_command_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">which_kind_command</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">boolean_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">numeric_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">textual_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ccm_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constructor_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro_argument</span><span class="plain-syntax">; </span><span class="comment-syntax"> where appropriate</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">origin</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">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">defined_for</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">completed</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure single_kind_command is accessed in 4/nf, 4/kc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Parsing single kind commands. </b>Each command is read in as text, parsed and stored into a modest structure.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="function-syntax">NeptuneSyntax::parse_command</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">NeptuneSyntax::parse_command</span></span>:<br/>Neptune Files - <a href="4-nf.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Initialise the STC to a blank command</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::trim_white_space</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-st.html#SP3" class="function-link"><span class="function-syntax">StarTemplates::recording</span></a><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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*END"</span><span class="plain-syntax">)) </span><a href="4-st.html#SP3" class="function-link"><span class="function-syntax">StarTemplates::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-st.html#SP3" class="function-link"><span class="function-syntax">StarTemplates::record_line</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">) == </span><span class="character-syntax">':'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::recording</span></a><span class="plain-syntax">()) </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">); </span><span class="comment-syntax"> remove the terminal colon</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">) == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">) == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) </span><a href="4-st.html#SP3" class="function-link"><span class="function-syntax">StarTemplates::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Create a new constructor</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</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">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">)</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_3" class="named-paragraph-link"><span class="named-paragraph">Parse line into command and argument, divided by a colon</span><span class="named-paragraph-number">6.3</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Identify the command being used</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-></span><span class="element-syntax">operand_type</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">BOOLEAN_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_5" class="named-paragraph-link"><span class="named-paragraph">Parse a boolean argument for a kind command</span><span class="named-paragraph-number">6.5</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CCM_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_6" class="named-paragraph-link"><span class="named-paragraph">Parse a CCM argument for a kind command</span><span class="named-paragraph-number">6.6</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CONSTRUCTOR_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_10" class="named-paragraph-link"><span class="named-paragraph">Parse a constructor-name argument for a kind command</span><span class="named-paragraph-number">6.10</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MACRO_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_12" class="named-paragraph-link"><span class="named-paragraph">Parse a macro name argument for a kind command</span><span class="named-paragraph-number">6.12</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NUMERIC_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_9" class="named-paragraph-link"><span class="named-paragraph">Parse a numeric argument for a kind command</span><span class="named-paragraph-number">6.9</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEMPLATE_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_11" class="named-paragraph-link"><span class="named-paragraph">Parse a template name argument for a kind command</span><span class="named-paragraph-number">6.11</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_7" class="named-paragraph-link"><span class="named-paragraph">Parse a textual argument for a kind command</span><span class="named-paragraph-number">6.7</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">VOCABULARY_KCA:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ns.html#SP6_8" class="named-paragraph-link"><span class="named-paragraph">Parse a vocabulary argument for a kind command</span><span class="named-paragraph-number">6.8</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">)</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">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>§6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the STC to a blank command</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = -1;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">constructor_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">origin</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">defined_for</span><span class="plain-syntax"> = </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>§6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create a new constructor</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">whole_command</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">should_know</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">) == </span><span class="character-syntax">'+'</span><span class="plain-syntax">) { </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">); </span><span class="identifier-syntax">should_know</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">do_know</span><span class="plain-syntax"> = </span><a href="2-fk.html#SP11" class="function-link"><span class="function-syntax">FamiliarKinds::is_known</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">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">do_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">should_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind command describes kind with no known name"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">do_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">should_know</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind command describes already-known kind"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="4-kc2.html#SP9" class="function-link"><span class="function-syntax">Kinds::Constructors::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><a href="2-knd.html#SP11" class="function-link"><span class="function-syntax">Kinds::get_construct</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">NEW_BASE_KINDS_CALLBACK</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CON_INTERMEDIATE</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NEW_BASE_KINDS_CALLBACK</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><a href="2-knd.html#SP6" class="function-link"><span class="function-syntax">Kinds::base_construction</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</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">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_3" class="paragraph-anchor"></a><b>§6.3. </b>Spaces and tabs after the colon are skipped; so a textual argument cannot
|
||||
begin with those characters, but that doesn't matter for the things we need.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse line into command and argument, divided by a colon</span><span class="named-paragraph-number">6.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</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">Regexp::match</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%c+?) *: *(%c+?) *"</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</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><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind command without argument"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_4" class="paragraph-anchor"></a><b>§6.4. </b>The following is clearly inefficient, but is not worth optimising. It makes
|
||||
about 20 string comparisons per command, and there are about 600 commands in a
|
||||
typical run of Inform, so the total cost is about 12,000 comparisons with
|
||||
quite small strings as arguments — which is negligible for our purposes,
|
||||
so we neglect it.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Identify the command being used</span><span class="named-paragraph-number">6.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">text_of_command</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</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">Str::eq_narrow_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">text_of_command</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> = &(</span><span class="identifier-syntax">table_of_kind_commands</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"no such kind command"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_5" class="paragraph-anchor"></a><b>§6.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a boolean argument for a kind command</span><span class="named-paragraph-number">6.5</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"yes"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"no"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"boolean kind command takes yes/no argument"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_6" class="paragraph-anchor"></a><b>§6.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a CCM argument for a kind command</span><span class="named-paragraph-number">6.6</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"none"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">NONE_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"literal"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">LITERAL_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"quantitative"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">NAMED_CONSTANT_CCM</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"special"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">SPECIAL_CCM</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><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"kind command with unknown constant-compilation-method"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_7" class="paragraph-anchor"></a><b>§6.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a textual argument for a kind command</span><span class="named-paragraph-number">6.7</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_8" class="paragraph-anchor"></a><b>§6.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a vocabulary argument for a kind command</span><span class="named-paragraph-number">6.8</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">feed_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::begin</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</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::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) >= </span><span class="constant-syntax">30</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"too many words in kind command"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9" class="paragraph-anchor"></a><b>§6.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a numeric argument for a kind command</span><span class="named-paragraph-number">6.9</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_10" class="paragraph-anchor"></a><b>§6.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a constructor-name argument for a kind command</span><span class="named-paragraph-number">6.10</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</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">Regexp::match</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?)>>>(%c+)"</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">constructor_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_11" class="paragraph-anchor"></a><b>§6.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a template name argument for a kind command</span><span class="named-paragraph-number">6.11</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> = </span><a href="4-st.html#SP2" class="function-link"><span class="function-syntax">StarTemplates::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_12" class="paragraph-anchor"></a><b>§6.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a macro name argument for a kind command</span><span class="named-paragraph-number">6.12</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> = </span><a href="4-mcr.html#SP1" class="function-link"><span class="function-syntax">NeptuneMacros::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">completed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ns.html#SP6">§6</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-mcr.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresssection"><a href="4-mcr.html">mcr</a></li><li class="progresscurrent">ns</li><li class="progresssection"><a href="4-st.html">st</a></li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-st.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
356
docs/kinds-module/4-st.html
Normal file
356
docs/kinds-module/4-st.html
Normal file
|
@ -0,0 +1,356 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Star Templates</title>
|
||||
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Language" content="en-gb">
|
||||
|
||||
<link href="../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">
|
||||
<script>
|
||||
function togglePopup(material_id) {
|
||||
var popup = document.getElementById(material_id);
|
||||
popup.classList.toggle("show");
|
||||
}
|
||||
</script>
|
||||
|
||||
<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">
|
||||
|
||||
</head>
|
||||
<body class="commentary-font">
|
||||
<nav role="navigation">
|
||||
<h1><a href="../index.html">
|
||||
<img src="../docs-assets/Inform.png" height=72">
|
||||
</a></h1>
|
||||
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
||||
<li><a href="../other.html">other tools</a></li>
|
||||
<li><a href="../extensions.html">extensions and kits</a></li>
|
||||
<li><a href="../units.html">unit test tools</a></li>
|
||||
</ul><h2>Compiler Webs</h2><ul>
|
||||
<li><a href="../inbuild/index.html">inbuild</a></li>
|
||||
<li><a href="../inform7/index.html">inform7</a></li>
|
||||
<li><a href="../inter/index.html">inter</a></li>
|
||||
</ul><h2>Inbuild Modules</h2><ul>
|
||||
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
||||
</ul><h2>Inform7 Modules</h2><ul>
|
||||
<li><a href="../core-module/index.html">core</a></li>
|
||||
<li><a href="index.html"><span class="selectedlink">kinds</span></a></li>
|
||||
<li><a href="../if-module/index.html">if</a></li>
|
||||
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
||||
<li><a href="../index-module/index.html">index</a></li>
|
||||
</ul><h2>Inter Modules</h2><ul>
|
||||
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
||||
<li><a href="../building-module/index.html">building</a></li>
|
||||
<li><a href="../codegen-module/index.html">codegen</a></li>
|
||||
</ul><h2>Services</h2><ul>
|
||||
<li><a href="../arch-module/index.html">arch</a></li>
|
||||
<li><a href="../syntax-module/index.html">syntax</a></li>
|
||||
<li><a href="../words-module/index.html">words</a></li>
|
||||
<li><a href="../html-module/index.html">html</a></li>
|
||||
<li><a href="../inflections-module/index.html">inflections</a></li>
|
||||
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
||||
<li><a href="../problems-module/index.html">problems</a></li>
|
||||
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<main role="main">
|
||||
<!--Weave of 'Star Templates' generated by Inweb-->
|
||||
<div class="breadcrumbs">
|
||||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#4">Chapter 4: Constructors</a></li><li><b>Star Templates</b></li></ul></div>
|
||||
<p class="purpose">Allowing Neptune files to generate additional source text.</p>
|
||||
|
||||
<ul class="toc"><li><a href="4-st.html#SP6">§6. Spooling text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>These are passages of I7 source text which can be inserted into the main
|
||||
source text at the request of any kind. An example would be:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which varies.</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary">The template <span class="extract"><span class="extract-syntax">*UNDERSTOOD-VARIABLE</span></span> contains only a single sentence of source
|
||||
text, and the idea is to make a new global variable associated with a given
|
||||
kind. Note that the text is not quite literal, because it can contain
|
||||
wildcards like <span class="extract"><span class="extract-syntax"><kind></span></span>, which expands to the name of the kind of value in
|
||||
question: for instance, we might get
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<p>number understood is a number which varies.</p>
|
||||
</blockquote>
|
||||
|
||||
<p class="commentary">There are a few limitations on what template text can include. Firstly,
|
||||
nothing with angle brackets in, except where a wildcard appears. Secondly,
|
||||
each sentence must end at the end of a line, and similarly the colon for
|
||||
any rule or other definition. Thus this template would fail:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which</span>
|
||||
<span class="plain-syntax"> varies. To judge <kind>: say "I judge [<kind> understood]."</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary">because the first sentence ends in the middle of the second line, and the
|
||||
colon dividing the phrase header from its definition is also mid-line. The
|
||||
template must be reformatted thus to work:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> *UNDERSTOOD-VARIABLE:</span>
|
||||
<span class="plain-syntax"> <kind> understood is a <kind> which varies.</span>
|
||||
<span class="plain-syntax"> To judge <kind>:</span>
|
||||
<span class="plain-syntax"> say "I judge [<kind> understood]."</span>
|
||||
<span class="plain-syntax"> *END</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>So, to begin:
|
||||
</p>
|
||||
|
||||
<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">kind_template_definition</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the asterisk, e.g., </span><span class="extract"><span class="extract-syntax">"*PRINTING-ROUTINE"</span></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">template_text</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">StarTemplates::new</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">StarTemplates::new</span></span>:<br/><a href="4-st.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">ttd</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">StarTemplates::parse_name</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">StarTemplates::parse_name</span></span>:<br/><a href="4-st.html#SP3">§3</a><br/>Neptune Syntax - <a href="4-ns.html#SP6_11">§6.11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</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">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_template_definition</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</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">ttd</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">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kind_template_definition is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Here is the code which records templates, reading them as one line of plain
|
||||
text at a time. (In the above example, <span class="extract"><span class="extract-syntax">StarTemplates::record_line</span></span> would be
|
||||
called just once, with the single source text line.)
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the one now being recorded</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">StarTemplates::recording</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">StarTemplates::recording</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">current_kind_template</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>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StarTemplates::begin</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">StarTemplates::begin</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">current_kind_template</span><span class="plain-syntax">) </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"first stt still recording"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-st.html#SP2" class="function-link"><span class="function-syntax">StarTemplates::parse_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"duplicate definition of source text template"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><a href="4-st.html#SP2" class="function-link"><span class="function-syntax">StarTemplates::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax">-></span><span class="element-syntax">template_text</span><span class="plain-syntax"> = </span><a href="4-st.html#SP7" class="function-link"><span class="function-syntax">StarTemplates::open_spool</span></a><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">StarTemplates::record_line</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">StarTemplates::record_line</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-st.html#SP7" class="function-link"><span class="function-syntax">StarTemplates::record_to_spool</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">StarTemplates::end</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">StarTemplates::end</span></span>:<br/>Neptune Syntax - <a href="4-ns.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">current_kind_template</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"no stt currently recording"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="4-st.html#SP7" class="function-link"><span class="function-syntax">StarTemplates::close_spool</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>So much for recording a template. To "play back", we need to take its text
|
||||
and squeeze it into the main source text.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StarTemplates::transcribe</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">StarTemplates::transcribe</span></span>:<br/>Kind Commands - <a href="4-kc.html#SP1_1">§1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">ttd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"tried to transcribe missing source text template"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">CORE_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Plugins::Manage::plugged_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing_plugin</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">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*UNDERSTOOD-VARIABLE"</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="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">-></span><span class="element-syntax">template_text</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">i</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'\n'</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">' '</span><span class="plain-syntax">)) { </span><span class="identifier-syntax">i</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">terminator</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">4.1</span></a></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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</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">terminator</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Sentences::make_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">terminator</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>Inside template text, anything in angle brackets <...> is a wildcard.
|
||||
These cannot be nested and cannot include newlines. All other material is
|
||||
copied verbatim into the line buffer.
|
||||
</p>
|
||||
|
||||
<p class="commentary">The only sentence terminators we recognise are full stop and colon; in
|
||||
particular we wouldn't recognise a stop inside quoted matter. This does
|
||||
not matter, since such things never come into kind definitions.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</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">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'<'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'>'</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">++));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the template wildcard</span><span class="named-paragraph-number">4.1.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">) == </span><span class="character-syntax">'.'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">); </span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> = </span><span class="character-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">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">) == </span><span class="character-syntax">':'</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">); </span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> = </span><span class="character-syntax">':'</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1" class="paragraph-anchor"></a><b>§4.1.1. </b>Only five wildcards are recognised:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the template wildcard</span><span class="named-paragraph-number">4.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name</span><span class="named-paragraph-number">4.1.1.1</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"lower-case-kind"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1_2" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">4.1.1.2</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind-weak-ID"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's weak ID</span><span class="named-paragraph-number">4.1.1.3</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"printing-routine"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">4.1.1.4</span></a></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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"comparison-routine"</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-st.html#SP4_1_1_5" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">4.1.1.5</span></a></span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"no such source text template wildcard"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1">§4.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1_1" class="paragraph-anchor"></a><b>§4.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name</span><span class="named-paragraph-number">4.1.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="4-st.html#SP5" class="function-link"><span class="function-syntax">StarTemplates::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1_1">§4.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1_2" class="paragraph-anchor"></a><b>§4.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">4.1.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="4-st.html#SP5" class="function-link"><span class="function-syntax">StarTemplates::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1_1">§4.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1_3" class="paragraph-anchor"></a><b>§4.1.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's weak ID</span><span class="named-paragraph-number">4.1.1.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">weak_kind_ID</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1_1">§4.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1_4" class="paragraph-anchor"></a><b>§4.1.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">4.1.1.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">print_identifier</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1_1">§4.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1_5" class="paragraph-anchor"></a><b>§4.1.1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">4.1.1.5</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-></span><span class="element-syntax">comparison_routine</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-st.html#SP4_1_1">§4.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>Where:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StarTemplates::transcribe_constructor_name</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">StarTemplates::transcribe_constructor_name</span></span>:<br/><a href="4-st.html#SP4_1_1_1">§4.1.1.1</a>, <a href="4-st.html#SP4_1_1_2">§4.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</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">lower_case</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</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">con</span><span class="plain-syntax">-></span><span class="element-syntax">dt_tag</span><span class="plain-syntax">) </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="4-kc2.html#SP10" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-kc2.html#SP16" class="function-link"><span class="function-syntax">Kinds::Constructors::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">full_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</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">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">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="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">full_length</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</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">i</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="character-syntax">' '</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">w1</span><span class="plain-syntax">+</span><span class="identifier-syntax">i</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">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">STROKE_V</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CAPITAL_K_V</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CAPITAL_L_V</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"value"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%V"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ve</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">lower_case</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Spooling text. </b>Large chunks of the text in the template will need to exist permanently in
|
||||
memory, and we go into recording mode to accept a series of them,
|
||||
concatenated with newlines dividing them, in a text stream.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>And here is recording mode:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">StarTemplates::open_spool</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">StarTemplates::open_spool</span></span>:<br/><a href="4-st.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">kind_recording</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">StarTemplates::record_to_spool</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">StarTemplates::record_to_spool</span></span>:<br/><a href="4-st.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</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">kind_recording</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="4-nf.html#SP2" class="function-link"><span class="function-syntax">NeptuneFiles::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"can't record outside recording"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax">, </span><span class="string-syntax">"%S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</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">StarTemplates::close_spool</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">StarTemplates::close_spool</span></span>:<br/><a href="4-st.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-ns.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-km.html">1</a></li><li class="progresschapter"><a href="2-knd.html">2</a></li><li class="progresschapter"><a href="3-dmn.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-nf.html">nf</a></li><li class="progresssection"><a href="4-mcr.html">mcr</a></li><li class="progresssection"><a href="4-ns.html">ns</a></li><li class="progresscurrent">st</li><li class="progresssection"><a href="4-kc.html">kc</a></li><li class="progresssection"><a href="4-kc2.html">kc2</a></li><li class="progressnext"><a href="4-kc.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -127,7 +127,7 @@ the case of somebody making "region" a subkind of some other kind of object.)
|
|||
See <a href="2-knd.html#SP21" class="internal">Kinds::make_subkind</a>.
|
||||
</li><li>● <span class="extract"><span class="extract-syntax">NEW_BASE_KINDS_CALLBACK</span></span> is called when a new base kind (properly
|
||||
speaking, a new arity-0 kind constructor) is made. See <a href="2-knd.html#SP20" class="internal">Kinds::new_base</a>
|
||||
and <a href="4-kc.html#SP12" class="internal">KindCommands::despatch</a> — there are two ways this can happen.
|
||||
and <a href="4-nf.html#SP1" class="internal">NeptuneFiles::read_command</a> — there are two ways this can happen.
|
||||
</li><li>● <span class="extract"><span class="extract-syntax">NOTIFY_NATURAL_LANGUAGE_KINDS_CALLBACK</span></span> is called when the kind "natural
|
||||
language" is created (if it is): see <a href="2-fk.html#SP13" class="internal">FamiliarKinds::notice_new_kind</a>.
|
||||
</li><li>● <span class="extract"><span class="extract-syntax">PROBLEM_KINDS_CALLBACK</span></span> is called when a syntax error is found, and can
|
||||
|
|
|
@ -367,7 +367,7 @@ which determines whether \(K\) is definite.
|
|||
</li><li>● New base kinds can be created either by calling <a href="2-knd.html#SP20" class="internal">Kinds::new_base</a>,<sup id="fnref:6"><a href="#fn:6" rel="footnote">6</a></sup> or in
|
||||
the process of reading in "Neptune files".<sup id="fnref:7"><a href="#fn:7" rel="footnote">7</a></sup> New constructors can only
|
||||
be made the latter way. See <a href="4-nf.html#SP1" class="internal">NeptuneFiles::load</a>, which sends individual commands
|
||||
to <a href="4-kc.html#SP12" class="internal">KindCommands::despatch</a>, which in turn deals with the low-level code in
|
||||
to <a href="4-nf.html#SP1" class="internal">NeptuneFiles::read_command</a>, which in turn deals with the low-level code in
|
||||
the <a href="4-kc2.html" class="internal">Kind Constructors</a> section.<sup id="fnref:8"><a href="#fn:8" rel="footnote">8</a></sup>
|
||||
</li><li>● It is possible to move kinds within the lattice of kinds, i.e., to change
|
||||
their hierarchical relationship, even after creation. See <a href="2-knd.html#SP21" class="internal">Kinds::make_subkind</a>.
|
||||
|
|
|
@ -144,10 +144,25 @@
|
|||
<spon class="sectiontitle">Neptune Files</span></a> -
|
||||
<span class="sectionpurpose">To read in details of built-in kind constructors from so-called Neptune files, setting them up ready for use.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="4-mcr.html">
|
||||
<spon class="sectiontitle">Macros</span></a> -
|
||||
<span class="sectionpurpose">Neptune supports named macros, though they are only lists of kind commands.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="4-ns.html">
|
||||
<spon class="sectiontitle">Neptune Syntax</span></a> -
|
||||
<span class="sectionpurpose">To parse individual commands from Neptune files.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="4-st.html">
|
||||
<spon class="sectiontitle">Star Templates</span></a> -
|
||||
<span class="sectionpurpose">Allowing Neptune files to generate additional source text.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="4-kc.html">
|
||||
<spon class="sectiontitle">Kind Commands</span></a> -
|
||||
<span class="sectionpurpose">To parse and act upon individual commands from Neptune files.</span></p>
|
||||
<span class="sectionpurpose">To apply a given command to a given kind constructor.</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="sectionentry"><a href="4-kc2.html">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="1-ic.html#SP1">§1. Phases</a></li><li><a href="1-ic.html#SP3">§3. Startup phase</a></li><li><a href="1-ic.html#SP4">§4. Configuration phase</a></li><li><a href="1-ic.html#SP8">§8. The Pretinkering, Tinkering, Nested and Projected phases</a></li><li><a href="1-ic.html#SP10">§10. The Graph Construction and Operational phases</a></li><li><a href="1-ic.html#SP11">§11. The nest list</a></li><li><a href="1-ic.html#SP16">§16. The shared project</a></li><li><a href="1-ic.html#SP19">§19. Kit requests</a></li><li><a href="1-ic.html#SP20">§20. Access to unmanaged Inform resources</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Phases. </b>The <a href="index.html" class="internal">supervisor</a> module provides services to the parent tool.
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Phases. </b>The <a href="index.html" class="internal">supervisor</a> module provides services to the parent tool.
|
||||
</p>
|
||||
|
||||
<p class="commentary">This section defines how the parent communicates with us to get everything
|
||||
|
@ -89,7 +89,7 @@ at which time the parent can freely use its facilities.
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">GRAPH_CONSTRUCTION_INBUILD_PHASE</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">OPERATIONAL_INBUILD_PHASE</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>We're going to use the following assertions to make sure we don't slip up.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>We're going to use the following assertions to make sure we don't slip up.
|
||||
Some functions run only in some phases. Phases can be skipped, but not taken
|
||||
out of turn.
|
||||
</p>
|
||||
|
@ -109,7 +109,7 @@ out of turn.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inbuild_phase</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Startup phase. </b>The following is called when the <a href="index.html" class="internal">supervisor</a> module starts up.
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Startup phase. </b>The following is called when the <a href="index.html" class="internal">supervisor</a> module starts up.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -141,7 +141,7 @@ out of turn.
|
|||
<span class="plain-syntax"> </span><a href="1-ic.html#SP5" class="function-link"><span class="function-syntax">Supervisor::set_defaults</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Configuration phase. </b>Initially, then, we are in the configuration phase. When the parent defines
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Configuration phase. </b>Initially, then, we are in the configuration phase. When the parent defines
|
||||
its command-line options, we expect it to call <span class="extract"><span class="extract-syntax">Supervisor::declare_options</span></span>
|
||||
so that we can define further options — this provides the large set of
|
||||
common options found in both <span class="extract"><span class="extract-syntax">inform7</span></span> and <span class="extract"><span class="extract-syntax">inbuild</span></span>, our two possible parents.
|
||||
|
@ -155,7 +155,7 @@ common options found in both <span class="extract"><span class="extract-syntax">
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-ic.html#SP4_6" class="named-paragraph-link"><span class="named-paragraph">Declare Inter-related options</span><span class="named-paragraph-number">4.6</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>§4.1. </b>These options all predate the 2015-20 reworking of the compiler, and their
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>These options all predate the 2015-20 reworking of the compiler, and their
|
||||
names are a series of historical accidents. <span class="extract"><span class="extract-syntax">-format</span></span> in particular works in
|
||||
a clunky sort of way and should perhaps be deprecated in favour of some
|
||||
better way to choose a virtual machine to compile to.
|
||||
|
@ -171,7 +171,7 @@ better way to choose a virtual machine to compile to.
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">RNG_CLSW</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">CASE_CLSW</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_2"></a><b>§4.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare Inform-related options</span><span class="named-paragraph-number">4.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP4_2" class="paragraph-anchor"></a><b>§4.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare Inform-related options</span><span class="named-paragraph-number">4.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -195,7 +195,7 @@ better way to choose a virtual machine to compile to.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CommandLine::end_group</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_3"></a><b>§4.3. </b>Again, except for <span class="extract"><span class="extract-syntax">-nest</span></span>, these go back to the mid-2010s.
|
||||
<p class="commentary firstcommentary"><a id="SP4_3" class="paragraph-anchor"></a><b>§4.3. </b>Again, except for <span class="extract"><span class="extract-syntax">-nest</span></span>, these go back to the mid-2010s.
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">INBUILD_RESOURCES_CLSG</span>
|
||||
|
@ -204,7 +204,7 @@ better way to choose a virtual machine to compile to.
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">EXTERNAL_CLSW</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRANSIENT_CLSW</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_4"></a><b>§4.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare resource-related options</span><span class="named-paragraph-number">4.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP4_4" class="paragraph-anchor"></a><b>§4.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare resource-related options</span><span class="named-paragraph-number">4.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -220,7 +220,7 @@ better way to choose a virtual machine to compile to.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CommandLine::end_group</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_5"></a><b>§4.5. </b>These are all new in 2020. They are not formally shared with the <span class="extract"><span class="extract-syntax">inter</span></span> tool,
|
||||
<p class="commentary firstcommentary"><a id="SP4_5" class="paragraph-anchor"></a><b>§4.5. </b>These are all new in 2020. They are not formally shared with the <span class="extract"><span class="extract-syntax">inter</span></span> tool,
|
||||
but <span class="extract"><span class="extract-syntax">-pipeline-file</span></span> and <span class="extract"><span class="extract-syntax">-variable</span></span> have the same effect as they would there.
|
||||
</p>
|
||||
|
||||
|
@ -230,7 +230,7 @@ but <span class="extract"><span class="extract-syntax">-pipeline-file</span></sp
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">PIPELINE_FILE_CLSW</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">PIPELINE_VARIABLE_CLSW</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_6"></a><b>§4.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare Inter-related options</span><span class="named-paragraph-number">4.6</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP4_6" class="paragraph-anchor"></a><b>§4.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare Inter-related options</span><span class="named-paragraph-number">4.6</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -246,7 +246,7 @@ but <span class="extract"><span class="extract-syntax">-pipeline-file</span></sp
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CommandLine::end_group</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>Use of the above options will cause the following global variables to be
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>Use of the above options will cause the following global variables to be
|
||||
set appropriately.
|
||||
</p>
|
||||
|
||||
|
@ -268,7 +268,7 @@ set appropriately.
|
|||
<span class="plain-syntax"> </span><a href="1-ic.html#SP6" class="function-link"><span class="function-syntax">Supervisor::set_inter_pipeline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"compile"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>The pipeline name can be set not only here but also by <span class="extract"><span class="extract-syntax">inform7</span></span> much
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>The pipeline name can be set not only here but also by <span class="extract"><span class="extract-syntax">inform7</span></span> much
|
||||
later on (way past the configuration stage), if it reads a sentence like:
|
||||
</p>
|
||||
|
||||
|
@ -285,7 +285,7 @@ later on (way past the configuration stage), if it reads a sentence like:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_pipeline_name</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>The <a href="index.html" class="internal">supervisor</a> module itself doesn't parse command-line options: that's for
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The <a href="index.html" class="internal">supervisor</a> module itself doesn't parse command-line options: that's for
|
||||
the parent to do, using code from Foundation. When the parent finds an option
|
||||
it doesn't know about, that will be one of ourse, so it should call the following:
|
||||
</p>
|
||||
|
@ -323,7 +323,7 @@ it doesn't know about, that will be one of ourse, so it should call the followin
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b>Note that the following has no effect unless the <span class="extract"><span class="extract-syntax">codegen</span></span> module is part
|
||||
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b>Note that the following has no effect unless the <span class="extract"><span class="extract-syntax">codegen</span></span> module is part
|
||||
of the parent. In practice, that will be true for <span class="extract"><span class="extract-syntax">inform7</span></span> but not <span class="extract"><span class="extract-syntax">inbuild</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -346,7 +346,7 @@ of the parent. In practice, that will be true for <span class="extract"><span cl
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>§7.2. </b>16339 is a well-known prime number for use in 16-bit random number algorithms,
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>16339 is a well-known prime number for use in 16-bit random number algorithms,
|
||||
such as the one used in the Z-machine VM. It works fine in 32-bit cases too.
|
||||
</p>
|
||||
|
||||
|
@ -358,7 +358,7 @@ such as the one used in the Z-machine VM. It works fine in 32-bit cases too.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">rng_seed_at_start_of_play</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. The Pretinkering, Tinkering, Nested and Projected phases. </b>Once the tool has finished with the command line, it should call this
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. The Pretinkering, Tinkering, Nested and Projected phases. </b>Once the tool has finished with the command line, it should call this
|
||||
function. Inbuild rapidly runs through the next few phases as it does so.
|
||||
From the "nested" phase, the final list of nests in the search path for
|
||||
finding kits, extensions and so on exists; from the "targeted" phase,
|
||||
|
@ -399,7 +399,7 @@ which continues until the parent calls <span class="extract"><span class="extrac
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inbuild_phase</span><span class="plain-syntax"> = </span><span class="constant-syntax">TARGETED_INBUILD_PHASE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8_1"></a><b>§8.1. </b>The VM to be used depends on the settings of all three of <span class="extract"><span class="extract-syntax">-format</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>§8.1. </b>The VM to be used depends on the settings of all three of <span class="extract"><span class="extract-syntax">-format</span></span>,
|
||||
<span class="extract"><span class="extract-syntax">-release</span></span> and <span class="extract"><span class="extract-syntax">-debug</span></span>, and those can be given in any order at the command
|
||||
line, which is why we couldn't work this out earlier:
|
||||
</p>
|
||||
|
@ -416,7 +416,7 @@ line, which is why we couldn't work this out earlier:
|
|||
<span class="plain-syntax"> </span><a href="1-ic.html#SP9" class="function-link"><span class="function-syntax">Supervisor::set_current_vm</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TargetVMs::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">, </span><span class="identifier-syntax">with_debugging</span><span class="plain-syntax">));</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP8">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_target_VM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
@ -429,7 +429,7 @@ line, which is why we couldn't work this out earlier:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_target_VM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. The Graph Construction and Operational phases. </b><span class="extract"><span class="extract-syntax">inbuild</span></span> is now in the Targeted phase, then, meaning that the parent has
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. The Graph Construction and Operational phases. </b><span class="extract"><span class="extract-syntax">inbuild</span></span> is now in the Targeted phase, then, meaning that the parent has
|
||||
called <span class="extract"><span class="extract-syntax">Supervisor::optioneering_complete</span></span> and has been making further
|
||||
preparations of its own. (For example, it could attach further kit
|
||||
dependencies to the shared project.) The parent has one further duty to
|
||||
|
@ -451,7 +451,7 @@ We do that copy by copy.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">census_mode</span><span class="plain-syntax">) </span><a href="7-tm.html#SP2" class="function-link"><span class="function-syntax">ExtensionWebsite::handle_census_mode</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. The nest list. </b>Nests are directories which hold resources to be used by the Intools, and
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. The nest list. </b>Nests are directories which hold resources to be used by the Intools, and
|
||||
one of Inbuild's main roles is to search and manage nests. All nests can
|
||||
hold extensions, kits, language definitions, and so on.
|
||||
</p>
|
||||
|
@ -475,7 +475,7 @@ list contains no Materials folders; each individual project has its own
|
|||
search list of nests which contains its own Materials and then the shared
|
||||
list from there on.
|
||||
</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>Inform customarily has exactly one <span class="extract"><span class="extract-syntax">-internal</span></span> and one <span class="extract"><span class="extract-syntax">-external</span></span> nest,
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>Inform customarily has exactly one <span class="extract"><span class="extract-syntax">-internal</span></span> and one <span class="extract"><span class="extract-syntax">-external</span></span> nest,
|
||||
but in fact any number of each is allowed, including none. However, the
|
||||
first to be declared are used by the compiler as "the" internal and external
|
||||
nests, respectively.
|
||||
|
@ -521,7 +521,7 @@ nests, respectively.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>It is then sorted in tag order:
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>It is then sorted in tag order:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -544,7 +544,7 @@ nests, respectively.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_nest</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_nest_list</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>And the rest of Inform or Inbuild can now use:
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>And the rest of Inform or Inbuild can now use:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -564,7 +564,7 @@ nests, respectively.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_external_nest</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b>As noted above, the transient area is used for ephemera such as dynamically
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>As noted above, the transient area is used for ephemera such as dynamically
|
||||
written documentation and telemetry files. <span class="extract"><span class="extract-syntax">-transient</span></span> sets it, but otherwise
|
||||
the external nest is used.
|
||||
</p>
|
||||
|
@ -578,7 +578,7 @@ the external nest is used.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_transient_resources</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. The shared project. </b>In any single run, each of the Inform tools concerns itself with a single
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. The shared project. </b>In any single run, each of the Inform tools concerns itself with a single
|
||||
Inform 7 program. This can be presented to it either in a project bundle
|
||||
(a directory which contains source, settings, space for an index and for
|
||||
temporary build files), or as a single file (just a text file containing
|
||||
|
@ -601,7 +601,7 @@ specify the bundle twice, or specify the file twice.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. </b>If we are given a <span class="extract"><span class="extract-syntax">-project</span></span> on the command line, we can then work out
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>If we are given a <span class="extract"><span class="extract-syntax">-project</span></span> on the command line, we can then work out
|
||||
where its Materials folder is, and therefore where any expert settings files
|
||||
would be. Note that the name of the expert settings file depends on the name
|
||||
of the parent, i.e., it will be <span class="extract"><span class="extract-syntax">inform7-settings.txt</span></span> or <span class="extract"><span class="extract-syntax">inbuild-settings.txt</span></span>
|
||||
|
@ -625,7 +625,7 @@ depending on who's asking.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. </b>This is a deceptively simple-looking function, which took a lot of time
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>This is a deceptively simple-looking function, which took a lot of time
|
||||
to get right. The situation is that the parent tool may already have
|
||||
identified a copy <span class="extract"><span class="extract-syntax">C</span></span> to be the main Inform project of this run, or it may not.
|
||||
If it has, we ignore <span class="extract"><span class="extract-syntax">-project</span></span> but apply <span class="extract"><span class="extract-syntax">-source</span></span> to change its source text
|
||||
|
@ -658,7 +658,7 @@ location. If it hasn't, we create a project using <span class="extract"><span cl
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19"></a><b>§19. Kit requests. </b>These are triggered by, for example, <span class="extract"><span class="extract-syntax">-kit MyFancyKit</span></span> at the command line.
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. Kit requests. </b>These are triggered by, for example, <span class="extract"><span class="extract-syntax">-kit MyFancyKit</span></span> at the command line.
|
||||
For timing reasons, we store those up in the configuration phase and then
|
||||
add them as dependencies only when a project exists.
|
||||
</p>
|
||||
|
@ -685,7 +685,7 @@ add them as dependencies only when a project exists.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP20"></a><b>§20. Access to unmanaged Inform resources. </b>Inform needs a whole pile of files to have been installed on the host computer
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. Access to unmanaged Inform resources. </b>Inform needs a whole pile of files to have been installed on the host computer
|
||||
before it can run: everything from the Standard Rules to a PDF file explaining
|
||||
what interactive fiction is. They're never written to, only read. They are
|
||||
stored in subdirectories called <span class="extract"><span class="extract-syntax">Miscellany</span></span> or <span class="extract"><span class="extract-syntax">HTML</span></span> of the internal nest;
|
||||
|
|
|
@ -66,14 +66,14 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Supervisor Module</b></li></ul></div>
|
||||
<p class="purpose">Setting up the use of this module.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>This section simoly sets up the module in ways expected by <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>, and
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>This section simoly sets up the module in ways expected by <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>, and
|
||||
contains no code of interest. The following constant exists only in tools
|
||||
which use this module:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SUPERVISOR_MODULE</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This module defines the following classes:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This module defines the following classes:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">build_methodology_CLASS</span>
|
||||
|
@ -137,7 +137,7 @@ which use this module:
|
|||
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">kit_dependency</span><span class="plain-syntax">)</span>
|
||||
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">known_extension_clash</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Like all modules, this one must define a <span class="extract"><span class="extract-syntax">start</span></span> and <span class="extract"><span class="extract-syntax">end</span></span> function:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Like all modules, this one must define a <span class="extract"><span class="extract-syntax">start</span></span> and <span class="extract"><span class="extract-syntax">end</span></span> function:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">EXTENSION_DICTIONARY_MREASON</span>
|
||||
|
@ -157,7 +157,7 @@ which use this module:
|
|||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SupervisorModule::end</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>§3.1. </b>This module uses <span class="extract"><span class="extract-syntax">syntax</span></span>, and adds the following annotations to the
|
||||
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>§3.1. </b>This module uses <span class="extract"><span class="extract-syntax">syntax</span></span>, and adds the following annotations to the
|
||||
syntax tree.
|
||||
</p>
|
||||
|
||||
|
@ -170,7 +170,7 @@ syntax tree.
|
|||
<span class="identifier-syntax">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">inclusion_of_extension</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax">)</span>
|
||||
<span class="identifier-syntax">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">inclusion_of_extension</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3_2"></a><b>§3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare the tree annotations</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>§3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare the tree annotations</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -180,7 +180,7 @@ syntax tree.
|
|||
<span class="plain-syntax"> </span><a href="1-sm.html#SP4" class="function-link"><span class="function-syntax">SupervisorModule::write_inclusion_of_extension_ANNOT</span></a><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-sm.html#SP3">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SupervisorModule::write_embodying_heading_ANNOT</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">SupervisorModule::write_embodying_heading_ANNOT</span></span>:<br/><a href="1-sm.html#SP3_2">§3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#2">Chapter 2: Conceptual Framework</a></li><li><b>Copy Errors</b></li></ul></div>
|
||||
<p class="purpose">A copy error is attached to a copy when scanning it reveals some malformation.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>Copies can sometimes exist in a damaged form: for example, they are purportedly
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Copies can sometimes exist in a damaged form: for example, they are purportedly
|
||||
extension files but have a mangled identification line. Each copy structure
|
||||
therefore has a list attached of errors which occurred in reading it.
|
||||
</p>
|
||||
|
@ -107,7 +107,7 @@ fields are blank.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure copy_error is accessed in 2/nst, 3/is, 5/ks, 5/ls, 6/inc, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>And now some creators.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>And now some creators.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -153,7 +153,7 @@ fields are blank.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>It becomes tiresome to make creators for every conceivable possibility, so
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>It becomes tiresome to make creators for every conceivable possibility, so
|
||||
we also offer these functions to tack extra details on:
|
||||
</p>
|
||||
|
||||
|
@ -180,7 +180,7 @@ we also offer these functions to tack extra details on:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-></span><span class="element-syntax">details_node2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n2</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>The following should only be called from Copies.
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>The following should only be called from Copies.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -188,7 +188,7 @@ we also offer these functions to tack extra details on:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-></span><span class="element-syntax">copy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>This produces a textual summary of the issue described. It wouldn't do for
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>This produces a textual summary of the issue described. It wouldn't do for
|
||||
a proper Inform problem message, but it's fine for the Inbuild command line
|
||||
output.
|
||||
</p>
|
||||
|
@ -209,7 +209,7 @@ output.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a lexer error</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a lexer error</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -231,7 +231,7 @@ output.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-ce.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a syntax error</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a syntax error</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-cps.html#SP1">§1. Creation</a></li><li><a href="2-cps.html#SP5">§5. List of errors</a></li><li><a href="2-cps.html#SP6">§6. Writing</a></li><li><a href="2-cps.html#SP7">§7. Reading source text</a></li><li><a href="2-cps.html#SP8">§8. Going operational</a></li><li><a href="2-cps.html#SP9">§9. Sorting</a></li><li><a href="2-cps.html#SP10">§10. Miscellaneous Inbuild commands</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Creation. </b>A "copy" of a work exists in the file system when we've actually got hold of
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Creation. </b>A "copy" of a work exists in the file system when we've actually got hold of
|
||||
some edition of it. For some genres, copies will be files; for others,
|
||||
directories holding a set of files.
|
||||
</p>
|
||||
|
@ -95,7 +95,7 @@ stored here.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_copy is accessed in 1/ic, 2/nst, 3/bg, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps2, 6/st, 6/hdn, 6/tbs, 6/inc, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Copies are created by the managers for the respective genres, usually when
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Copies are created by the managers for the respective genres, usually when
|
||||
claiming. If you are a manager, do not call this...
|
||||
</p>
|
||||
|
||||
|
@ -114,7 +114,7 @@ claiming. If you are a manager, do not call this...
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">copy</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>...call one of these:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>...call one of these:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -130,7 +130,7 @@ claiming. If you are a manager, do not call this...
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">copy</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>And then probably follow up by calling this, to attach a pointer to some
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>And then probably follow up by calling this, to attach a pointer to some
|
||||
additional data specific to your genre:
|
||||
</p>
|
||||
|
||||
|
@ -139,7 +139,7 @@ additional data specific to your genre:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">metadata</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ref</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. List of errors. </b>When copies are found to be malformed, error messages are attached to them
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. List of errors. </b>When copies are found to be malformed, error messages are attached to them
|
||||
for later reporting. These are stored in a list.
|
||||
</p>
|
||||
|
||||
|
@ -159,14 +159,14 @@ for later reporting. These are stored in a list.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Writing. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Writing. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::write_copy</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">Copies::write_copy</span></span>:<br/>Supervisor Module - <a href="1-sm.html#SP4">§4</a><br/>Build Graphs - <a href="3-bg.html#SP6">§6</a>, <a href="3-bg.html#SP7">§7</a>, <a href="3-bg.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-edt.html#SP1" class="function-link"><span class="function-syntax">Editions::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Reading source text. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Reading source text. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::source_text_has_been_read</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">Copies::source_text_has_been_read</span></span>:<br/>Inclusions - <a href="6-inc.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
|
@ -185,14 +185,14 @@ for later reporting. These are stored in a list.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">source_text</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Going operational. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Going operational. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::construct_graph</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">Copies::construct_graph</span></span>:<br/>Inbuild Control - <a href="1-ic.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">genre</span><span class="plain-syntax">, </span><span class="constant-syntax">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. Sorting. </b>The command-line <a href="../inbuild/index.html" class="internal">inbuild</a> uses this when sorting search results.
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Sorting. </b>The command-line <a href="../inbuild/index.html" class="internal">inbuild</a> uses this when sorting search results.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -214,7 +214,7 @@ for later reporting. These are stored in a list.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">r</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. Miscellaneous Inbuild commands. </b>This function implements the command-line instruction to <span class="extract"><span class="extract-syntax">-inspect</span></span>.
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Miscellaneous Inbuild commands. </b>This function implements the command-line instruction to <span class="extract"><span class="extract-syntax">-inspect</span></span>.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -239,7 +239,7 @@ for later reporting. These are stored in a list.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>And here are <span class="extract"><span class="extract-syntax">-build</span></span> and <span class="extract"><span class="extract-syntax">-rebuild</span></span>, though note that <span class="extract"><span class="extract-syntax">Copies::build</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>And here are <span class="extract"><span class="extract-syntax">-build</span></span> and <span class="extract"><span class="extract-syntax">-rebuild</span></span>, though note that <span class="extract"><span class="extract-syntax">Copies::build</span></span>
|
||||
is also called by the <span class="extract"><span class="extract-syntax">core</span></span> module of the Inform 7 compiler to perform
|
||||
its main task: building an Inform project.
|
||||
</p>
|
||||
|
@ -256,7 +256,7 @@ its main task: building an Inform project.
|
|||
<span class="plain-syntax"> </span><a href="3-ib.html#SP5" class="function-link"><span class="function-syntax">IncrementalBuild::rebuild</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">BM</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>Now in quick succession <span class="extract"><span class="extract-syntax">-graph</span></span>, <span class="extract"><span class="extract-syntax">-build-needs</span></span>, <span class="extract"><span class="extract-syntax">-use-needs</span></span>, <span class="extract"><span class="extract-syntax">-build-missing</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>Now in quick succession <span class="extract"><span class="extract-syntax">-graph</span></span>, <span class="extract"><span class="extract-syntax">-build-needs</span></span>, <span class="extract"><span class="extract-syntax">-use-needs</span></span>, <span class="extract"><span class="extract-syntax">-build-missing</span></span>,
|
||||
<span class="extract"><span class="extract-syntax">-use-missing</span></span>:
|
||||
</p>
|
||||
|
||||
|
@ -278,7 +278,7 @@ its main task: building an Inform project.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Nothing is missing\n"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>And here is <span class="extract"><span class="extract-syntax">-archive</span></span> and <span class="extract"><span class="extract-syntax">-archive-to N</span></span>:
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>And here is <span class="extract"><span class="extract-syntax">-archive</span></span> and <span class="extract"><span class="extract-syntax">-archive-to N</span></span>:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -290,7 +290,7 @@ its main task: building an Inform project.
|
|||
<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">N</span><span class="plain-syntax">) </span><a href="3-bg.html#SP9" class="function-link"><span class="function-syntax">Graphs::archive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">vertex</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">BM</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>And lastly <span class="extract"><span class="extract-syntax">-copy-to N</span></span> and <span class="extract"><span class="extract-syntax">-sync-to N</span></span>:
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>And lastly <span class="extract"><span class="extract-syntax">-copy-to N</span></span> and <span class="extract"><span class="extract-syntax">-sync-to N</span></span>:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-edt.html#SP1">§1. Editions</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Editions. </b>An "edition" of a work is a particular version numbered form of it. For
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Editions. </b>An "edition" of a work is a particular version numbered form of it. For
|
||||
example, release 7 of Bronze by Emily Short would be an edition of the
|
||||
work Bronze by Emily Short.
|
||||
</p>
|
||||
|
@ -103,7 +103,7 @@ might work with all VMs, while version 8 required a 32-bit architecture.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_edition is accessed in 1/ic, 2/cps, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 6/vmg, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>When a copy is to be duplicated into a nest <span class="extract"><span class="extract-syntax">N</span></span>, we need to work out where
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>When a copy is to be duplicated into a nest <span class="extract"><span class="extract-syntax">N</span></span>, we need to work out where
|
||||
to put it. For example, version 2.1 of the extension Marbles by Steve Hogarth
|
||||
would go into <span class="extract"><span class="extract-syntax">N/Extensions/Steve Hogarth/Marbles-v2_1.i7x</span></span>. The following
|
||||
contributes only the un-filename-extended leafname <span class="extract"><span class="extract-syntax">Marbles-v2_1</span></span>.
|
||||
|
@ -124,7 +124,7 @@ contributes only the un-filename-extended leafname <span class="extract"><span c
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The <span class="extract"><span class="extract-syntax">-inspect</span></span> command of Inbuild uses the following.
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The <span class="extract"><span class="extract-syntax">-inspect</span></span> command of Inbuild uses the following.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -137,7 +137,7 @@ contributes only the un-filename-extended leafname <span class="extract"><span c
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>For sorting search results:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>For sorting search results:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-gnr.html#SP1">§1. Genres</a></li><li><a href="2-gnr.html#SP5">§5. Method functions</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genres. </b>Each different genre of work managed by Inbuild is represented by an instance
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genres. </b>Each different genre of work managed by Inbuild is represented by an instance
|
||||
of the following structure. (At present, then, there are exactly seven
|
||||
instances of it: nothing the user can do at the command line can change
|
||||
that total.) A work unambiguously specifies what genre it has by means
|
||||
|
@ -104,7 +104,7 @@ the instance <span class="extract"><span class="extract-syntax">kit_genre</span>
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_genre is accessed in 2/rqr, 3/bg, 3/bs2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Some genres of work, such as kits and extensions, can be stored in nests;
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Some genres of work, such as kits and extensions, can be stored in nests;
|
||||
others, such as Inform projects, cannot. Whether a copy can be stored in a
|
||||
nest depends only on its genre.
|
||||
</p>
|
||||
|
@ -115,7 +115,7 @@ nest depends only on its genre.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">G</span><span class="plain-syntax">-></span><span class="element-syntax">stored_in_nests</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The requirements parser needs to identify genres by name, so:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The requirements parser needs to identify genres by name, so:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -127,7 +127,7 @@ nest depends only on its genre.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>For sorting of search results:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>For sorting of search results:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -138,7 +138,7 @@ nest depends only on its genre.
|
|||
<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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Method functions. </b>And here are the method functions which a genre can, optionally, provide.
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Method functions. </b>And here are the method functions which a genre can, optionally, provide.
|
||||
All of these act on a given work, or a given copy of a work, having the
|
||||
genre in question.
|
||||
</p>
|
||||
|
@ -153,7 +153,7 @@ by Emily Short".
|
|||
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">GENRE_WRITE_WORK_MTID</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_work</span><span class="plain-syntax"> *</span><span class="identifier-syntax">work</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>This looks at a textual file locator, which might be a pathname or a
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>This looks at a textual file locator, which might be a pathname or a
|
||||
filename, to see if it might refer to a copy of a work of the given genre.
|
||||
If it does, an <span class="extract"><span class="extract-syntax">inbuild_copy</span></span> is created, and the pointer <span class="extract"><span class="extract-syntax">*C</span></span> is set to
|
||||
point to it. If not, no error is issued, and <span class="extract"><span class="extract-syntax">*C</span></span> is left unchanged.
|
||||
|
@ -172,7 +172,7 @@ attached to the copy for later issuing.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> **</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ext</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">directory_status</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>This searches the nest <span class="extract"><span class="extract-syntax">N</span></span> for anything which (a) looks like a copy of a
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>This searches the nest <span class="extract"><span class="extract-syntax">N</span></span> for anything which (a) looks like a copy of a
|
||||
work of our genre, and (b) meets the given requirements. If a genre does
|
||||
not provide this method, then nothing of that genre can ever appear in
|
||||
<span class="extract"><span class="extract-syntax">-matching</span></span> search results.
|
||||
|
@ -185,7 +185,7 @@ not provide this method, then nothing of that genre can ever appear in
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_nest</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search_results</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>Some genres of work involve Inform source text — Inform projects and
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>Some genres of work involve Inform source text — Inform projects and
|
||||
extensions, for example. Reading in source text is fairly fast, but it's not
|
||||
an instant process, and we don't automatically perform it. (When an extension
|
||||
is scanned for metadata during claiming, only the opening line is looked at.)
|
||||
|
@ -205,7 +205,7 @@ of it from there.
|
|||
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">GENRE_READ_SOURCE_TEXT_FOR_MTID</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>At the Graph Construction phase of Inbuild, each copy is offered the chance
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>At the Graph Construction phase of Inbuild, each copy is offered the chance
|
||||
to finalise its internal representation. For example, this may be when its
|
||||
build graph is constructed, because we can now know for sure that there are
|
||||
no further unsuspected dependencies.
|
||||
|
@ -221,7 +221,7 @@ provides it) which has been claimed by Inbuild.
|
|||
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">GENRE_CONSTRUCT_GRAPH_MTID</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>This method is called when a copy is about to be built or have its graph
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>This method is called when a copy is about to be built or have its graph
|
||||
described, for example by <span class="extract"><span class="extract-syntax">-graph</span></span>, <span class="extract"><span class="extract-syntax">-build</span></span> and <span class="extract"><span class="extract-syntax">-rebuild</span></span>. Nothing actually
|
||||
needs to be done, but if any work is needed before building can take place,
|
||||
now's the time; and the vertex to build from can be altered by setting <span class="extract"><span class="extract-syntax">*V</span></span>.
|
||||
|
@ -236,7 +236,7 @@ is ignored for other inspection options such as <span class="extract"><span clas
|
|||
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">GENRE_BUILDING_SOON_MTID</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax"> **</span><span class="identifier-syntax">V</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>This duplicates, or syncs, a copy <span class="extract"><span class="extract-syntax">C</span></span> of a work in our genre, placing it
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>This duplicates, or syncs, a copy <span class="extract"><span class="extract-syntax">C</span></span> of a work in our genre, placing it
|
||||
at a canonical location inside the given nest <span class="extract"><span class="extract-syntax">N</span></span>. In effect, it implements
|
||||
the Inbuild command-line options <span class="extract"><span class="extract-syntax">-copy-to N</span></span> and <span class="extract"><span class="extract-syntax">-sync-to N</span></span>.
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-nst.html#SP1">§1. Creation</a></li><li><a href="2-nst.html#SP4">§4. Search list</a></li><li><a href="2-nst.html#SP5">§5. Search results</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Creation. </b>To "create" a nest here does not mean actually altering the file system, for
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Creation. </b>To "create" a nest here does not mean actually altering the file system, for
|
||||
example by making a directory: nests here are merely notes in memory of
|
||||
positions in the file system hierarchy which may or may not exist.
|
||||
</p>
|
||||
|
@ -89,7 +89,7 @@ positions in the file system hierarchy which may or may not exist.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_nest is accessed in 1/ic, 3/bg, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/tm, 5/ps2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Nests used by the Inform and Inbuild tools are tagged with the following
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Nests used by the Inform and Inbuild tools are tagged with the following
|
||||
comstamts. (There used to be quite a good joke here, but refactoring of the
|
||||
code removed its premiss. Literate programming is like that sometimes.)
|
||||
</p>
|
||||
|
@ -114,14 +114,14 @@ see below for why. Lower-tag-numbered origins are better than later ones.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">tag_value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Nests::protect</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">Nests::protect</span></span>:<br/>Inbuild Control - <a href="1-ic.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_nest</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">read_only</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Search list. </b>When we search for copies, we do so by looking through nests in a list. The
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Search list. </b>When we search for copies, we do so by looking through nests in a list. The
|
||||
following builds such lists, removing duplicates — where duplicates are
|
||||
shown up by having the same textual form of pathname. (This is not foolproof
|
||||
by any means: Unix is replete with ways to describe the same directory, thanks
|
||||
|
@ -147,7 +147,7 @@ would just produce search results which were more copious than needed.)
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_nest</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_list</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Search results. </b>When we search a list of nests for copies satisfying certain requirements,
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Search results. </b>When we search a list of nests for copies satisfying certain requirements,
|
||||
we create one of these for each hit:
|
||||
</p>
|
||||
|
||||
|
@ -159,7 +159,7 @@ we create one of these for each hit:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inbuild_search_result</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_search_result is accessed in 2/ce, 3/is, 5/ks, 5/ls, 6/inc, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>These can be created only as entries in a list:
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>These can be created only as entries in a list:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -173,7 +173,7 @@ we create one of these for each hit:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_search_result</span><span class="plain-syntax">, </span><span class="identifier-syntax">results</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>And here is our search engine, such as it is. For each nest, we ask each
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>And here is our search engine, such as it is. For each nest, we ask each
|
||||
genre's manager to look for copies of that genre:
|
||||
</p>
|
||||
|
||||
|
@ -188,7 +188,7 @@ genre's manager to look for copies of that genre:
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>Oftentimes, we want only the single best result, and won't even look at the
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>Oftentimes, we want only the single best result, and won't even look at the
|
||||
others:
|
||||
</p>
|
||||
|
||||
|
@ -204,7 +204,7 @@ others:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">best</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>Where "better" is defined as follows. This innocent-looking function is
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>Where "better" is defined as follows. This innocent-looking function is
|
||||
in fact critical to what Inbuild does. It uses tags on nests to prefer copies
|
||||
in the Materials folder to those in the external nest, and to prefer those in
|
||||
turn to copies in the internal nest; and within nests of equal importance,
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-rqr.html#SP1">§1. Creation</a></li><li><a href="2-rqr.html#SP6">§6. Writing</a></li><li><a href="2-rqr.html#SP7">§7. Meeting requirements</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Creation. </b>A requirement is, in effect, the criteria for performing a search. We can
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Creation. </b>A requirement is, in effect, the criteria for performing a search. We can
|
||||
specify the title, and/or the author name, and/or the genre — all given
|
||||
in the <span class="extract"><span class="extract-syntax">work</span></span> field below, with those unspecified left blank — and/or
|
||||
we can give a semantic version number range:
|
||||
|
@ -82,7 +82,7 @@ we can give a semantic version number range:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_requirement is accessed in 1/ic, 2/edt, 2/cps, 3/bg, 3/ib, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps2, 6/st, 6/hdn, 6/tbs, 6/inc, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Here are some creators:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Here are some creators:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -105,7 +105,7 @@ we can give a semantic version number range:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-rqr.html#SP2" class="function-link"><span class="function-syntax">Requirements::anything_of_genre</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The most involved of the creators parses text. An involved example might be:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The most involved of the creators parses text. An involved example might be:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -144,7 +144,7 @@ empty text is legal here, and produces an unlimited requirement.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>Each clause must either be <span class="extract"><span class="extract-syntax">all</span></span> or take the form <span class="extract"><span class="extract-syntax">term=value</span></span>:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Each clause must either be <span class="extract"><span class="extract-syntax">all</span></span> or take the form <span class="extract"><span class="extract-syntax">term=value</span></span>:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -175,7 +175,7 @@ empty text is legal here, and produces an unlimited requirement.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>§4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a term-value pair</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a term-value pair</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -203,7 +203,7 @@ empty text is legal here, and produces an unlimited requirement.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-rqr.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="function-syntax">Requirements::semver</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">Requirements::semver</span></span>:<br/><a href="2-rqr.html#SP4_1">§4.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">errors</span><span class="plain-syntax">) {</span>
|
||||
|
@ -214,7 +214,7 @@ empty text is legal here, and produces an unlimited requirement.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Writing. </b>This is the inverse of the above function, and uses the same notation.
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Writing. </b>This is the inverse of the above function, and uses the same notation.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -240,7 +240,7 @@ empty text is legal here, and produces an unlimited requirement.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">claused</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"all"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Meeting requirements. </b>Finally, we actually use these intricacies for something. Given an edition,
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Meeting requirements. </b>Finally, we actually use these intricacies for something. Given an edition,
|
||||
we return <span class="extract"><span class="extract-syntax">TRUE</span></span> if it meets the requirements and <span class="extract"><span class="extract-syntax">FALSE</span></span> if it does not.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-wrk.html#SP1">§1. Works</a></li><li><a href="2-wrk.html#SP5">§5. Printing</a></li><li><a href="2-wrk.html#SP8">§8. Identification</a></li><li><a href="2-wrk.html#SP11">§11. Documentation links</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Works. </b>A "work" is a single artistic or programming creation; for example, the IF
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Works. </b>A "work" is a single artistic or programming creation; for example, the IF
|
||||
story Bronze by Emily Short might be a work. Mamy versions of this IF story
|
||||
may exist over time, but they will all be versions of the same "work".
|
||||
Extensions are also works: for example, Epistemology by Eric Eve is a work.
|
||||
|
@ -94,7 +94,7 @@ combination of the textual names and the hash code:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inbuild_work</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inbuild_work is accessed in 1/ic, 2/edt, 2/cps, 2/rqr, 3/bg, 3/ib, 3/is2, 4/em, 4/km, 4/lm, 4/pm, 4/pbm, 4/pfm, 4/tm, 5/es, 5/ks, 5/ls, 5/ps2, 6/tbs, 6/inc, 7/tm, 7/dct, 7/ip and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Each work structure is written only once, and its title and author name are
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Each work structure is written only once, and its title and author name are
|
||||
not subsequently altered.
|
||||
</p>
|
||||
|
||||
|
@ -106,7 +106,7 @@ not subsequently altered.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-wrk.html#SP3" class="function-link"><span class="function-syntax">Works::new_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">genre</span><span class="plain-syntax">, </span><span class="identifier-syntax">ti</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Though it is probably the case that the author name and title supplied are
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Though it is probably the case that the author name and title supplied are
|
||||
already of normalised casing, we do not want to rely on that. Works intending
|
||||
to represent (e.g.) the same extension but named with different casing
|
||||
conventions would fail to match: and this could happen if a new build of
|
||||
|
@ -135,7 +135,7 @@ preserved for use in text output, but not identification.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">work</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>§3.1. </b>We hash-code all works on arrival, using the X 30011 algorithm, on the text
|
||||
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>§3.1. </b>We hash-code all works on arrival, using the X 30011 algorithm, on the text
|
||||
of the pseudo-pathname <span class="extract"><span class="extract-syntax">Author/Title</span></span>. The result is an integer between 0 and
|
||||
the following constant minus 1.
|
||||
</p>
|
||||
|
@ -156,7 +156,7 @@ the following constant minus 1.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="identifier-syntax">inbuild_work_hash_code</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">hc</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-wrk.html#SP3">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>Casing is normalised as follows. Every word is capitalised, where a word
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Casing is normalised as follows. Every word is capitalised, where a word
|
||||
begins at the start of the text, after a hyphen, or after a bracket. Thus
|
||||
"Every Word Counts", "Even Double-Barrelled Ones (And Even Parenthetically)".
|
||||
</p>
|
||||
|
@ -175,7 +175,7 @@ begins at the start of the text, after a hyphen, or after a bracket. Thus
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Printing. </b>As noted above, the raw forms are used for output.
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Printing. </b>As noted above, the raw forms are used for output.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -191,7 +191,7 @@ begins at the start of the text, after a hyphen, or after a bracket. Thus
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">raw_author_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>The following is only sensible for extensions, and is used when Inform
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>The following is only sensible for extensions, and is used when Inform
|
||||
generates its Extensions index entries.
|
||||
</p>
|
||||
|
||||
|
@ -206,7 +206,7 @@ generates its Extensions index entries.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"a"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>The Inbuild module provides the <span class="extract"><span class="extract-syntax">%X</span></span> escape sequence for printing names of
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The Inbuild module provides the <span class="extract"><span class="extract-syntax">%X</span></span> escape sequence for printing names of
|
||||
works. (The X used to stand for Extension.) <span class="extract"><span class="extract-syntax">%<X</span></span> ptovides an abbreviated form.
|
||||
</p>
|
||||
|
||||
|
@ -232,7 +232,7 @@ works. (The X used to stand for Extension.) <span class="extract"><span class="e
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Identification. </b>Two works with different hash codes definitely identify different works;
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Identification. </b>Two works with different hash codes definitely identify different works;
|
||||
if the code is the same, we must use <span class="extract"><span class="extract-syntax">Str::eq</span></span> on the actual title and author
|
||||
name. This is in effect case insensitive, since we normalised casing when
|
||||
the works were created.
|
||||
|
@ -253,7 +253,7 @@ order-preserving. To emphasise this we return true or false rather than a
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>This is quite a deal slower, but is trichotomous and can be used for sorting.
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>This is quite a deal slower, but is trichotomous and can be used for sorting.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -265,7 +265,7 @@ order-preserving. To emphasise this we return true or false rather than a
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Because Basic Inform and the Standard Rules extensions are treated slightly
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Because Basic Inform and the Standard Rules extensions are treated slightly
|
||||
differently by the documentation, and so forth, it's convenient to provide a
|
||||
single function testing if a work refers to them.
|
||||
</p>
|
||||
|
@ -289,7 +289,7 @@ single function testing if a work refers to them.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-wrk.html#SP8" class="function-link"><span class="function-syntax">Works::match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">work</span><span class="plain-syntax">, </span><span class="identifier-syntax">a_work_for_basic_inform</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. Documentation links. </b>This is where HTML links to extension documentation are created; the URL for
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Documentation links. </b>This is where HTML links to extension documentation are created; the URL for
|
||||
each extension's page is generated from its <span class="extract"><span class="extract-syntax">inbuild_work</span></span>.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="3-bg.html#SP1">§1. Build graphs</a></li><li><a href="3-bg.html#SP2">§2. Creation</a></li><li><a href="3-bg.html#SP6">§6. Writing</a></li><li><a href="3-bg.html#SP9">§9. Archiving</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Build graphs. </b>See the Inbuild manual for an introduction to the build graph. Properly
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Build graphs. </b>See the Inbuild manual for an introduction to the build graph. Properly
|
||||
speaking, it is a directed acyclic multigraph which us usually disconnected.
|
||||
</p>
|
||||
|
||||
|
@ -117,7 +117,7 @@ compiled, is a file vertex.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure build_vertex is accessed in 1/sm, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 5/es, 5/ks, 5/ls, 5/ps, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 7/dct, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. Creation. </b>First, the three colours of vertex.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. Creation. </b>First, the three colours of vertex.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -151,7 +151,7 @@ compiled, is a file vertex.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Note that each copy is assigned exactly one copy vertex, when it is created.
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Note that each copy is assigned exactly one copy vertex, when it is created.
|
||||
This function should never otherwise be called.
|
||||
</p>
|
||||
|
||||
|
@ -165,7 +165,7 @@ This function should never otherwise be called.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">vertex</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>Next, the two colours of edge. Note that between A and B there can be
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Next, the two colours of edge. Note that between A and B there can be
|
||||
at most one edge of each colour.
|
||||
</p>
|
||||
|
||||
|
@ -190,7 +190,7 @@ at most one edge of each colour.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">-></span><span class="element-syntax">use_edges</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>The script attached to a vertex is a list of instructions for how to build
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>The script attached to a vertex is a list of instructions for how to build
|
||||
the resource it refers to. Some vertices have no instructions provided, so:
|
||||
</p>
|
||||
|
||||
|
@ -200,7 +200,7 @@ the resource it refers to. Some vertices have no instructions provided, so:
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Writing. </b>This is a suitably indented printout of the graph as seen from a given
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Writing. </b>This is a suitably indented printout of the graph as seen from a given
|
||||
vertex: it's used by the Inbuild command <span class="extract"><span class="extract-syntax">-graph</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -255,7 +255,7 @@ vertex: it's used by the Inbuild command <span class="extract"><span class="extr
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>A similar but slightly different recursion for <span class="extract"><span class="extract-syntax">-build-needs</span></span> and <span class="extract"><span class="extract-syntax">-use-needs</span></span>.
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>A similar but slightly different recursion for <span class="extract"><span class="extract-syntax">-build-needs</span></span> and <span class="extract"><span class="extract-syntax">-use-needs</span></span>.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -295,7 +295,7 @@ vertex: it's used by the Inbuild command <span class="extract"><span class="extr
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>And for <span class="extract"><span class="extract-syntax">-build-missing</span></span> and <span class="extract"><span class="extract-syntax">-use-missing</span></span>.
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>And for <span class="extract"><span class="extract-syntax">-build-missing</span></span> and <span class="extract"><span class="extract-syntax">-use-missing</span></span>.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -329,7 +329,7 @@ vertex: it's used by the Inbuild command <span class="extract"><span class="extr
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. Archiving. </b>This isn't simply a matter of printing out, of course, but very similar code
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Archiving. </b>This isn't simply a matter of printing out, of course, but very similar code
|
||||
handles <span class="extract"><span class="extract-syntax">-archive</span></span> and <span class="extract"><span class="extract-syntax">-archive-to N</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -361,7 +361,7 @@ cannot be read from any other nest — so we won't archive it.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9_1"></a><b>§9.1. </b>The most delicate thing here is that we don't want to archive something
|
||||
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>§9.1. </b>The most delicate thing here is that we don't want to archive something
|
||||
to <span class="extract"><span class="extract-syntax">N</span></span> if it's already there; but that is difficult to detect.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Build Methodology</b></li></ul></div>
|
||||
<p class="purpose">Whether to run tasks internally in some merged tool, or run via the shell, or simply trace to the standard output what we think ought to be done.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>This is rather grandly named for what it is: it's just a bundle of settings
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>This is rather grandly named for what it is: it's just a bundle of settings
|
||||
about how to carry out build steps. Should we (a) make a dry run, just printing
|
||||
hypothetical shell commands, or (b) issue those shell commands via <span class="extract"><span class="extract-syntax">system</span></span>,
|
||||
or (c) take direct action by calling functions within the current executable?
|
||||
|
@ -89,7 +89,7 @@ for the tools <span class="extract"><span class="extract-syntax">inter</span></s
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">build_methodology</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 4/lm, 4/pm, 4/tm and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>If the <span class="extract"><span class="extract-syntax">tangled</span></span> flag is set, we expect <span class="extract"><span class="extract-syntax">inform7</span></span>, for example, to be at
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>If the <span class="extract"><span class="extract-syntax">tangled</span></span> flag is set, we expect <span class="extract"><span class="extract-syntax">inform7</span></span>, for example, to be at
|
||||
<span class="extract"><span class="extract-syntax">tools_path/inform7/Tangled/inform7</span></span>; if it is clear, we expect it only to
|
||||
be <span class="extract"><span class="extract-syntax">tools_path/inform7</span></span>. This is relevant only for the command-line Inbuild,
|
||||
which used tangled mode by default, but untangled mode if the user has
|
||||
|
@ -127,7 +127,7 @@ specified an explicit path at the command line.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">BM</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The <span class="extract"><span class="extract-syntax">inform7</span></span> tool only ever uses the internal methodology, for which
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The <span class="extract"><span class="extract-syntax">inform7</span></span> tool only ever uses the internal methodology, for which
|
||||
these filenames are irrelevant, since no shell commands are ever issued.
|
||||
It gets its BM by calling the following:
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="3-bs.html#SP1">§1. Build scripts</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Build scripts. </b>Suppose the incremental build algorithm has decided it wants to build node
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Build scripts. </b>Suppose the incremental build algorithm has decided it wants to build node
|
||||
<span class="extract"><span class="extract-syntax">V</span></span> in the graph: it does so by calling <span class="extract"><span class="extract-syntax">BuildScripts::execute</span></span> on the script
|
||||
attached to <span class="extract"><span class="extract-syntax">V</span></span>. This is only a list of steps:
|
||||
</p>
|
||||
|
@ -95,7 +95,7 @@ attached to <span class="extract"><span class="extract-syntax">V</span></span>.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure build_script is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>We execute the steps in sequence, of course. As soon as any step fails,
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>We execute the steps in sequence, of course. As soon as any step fails,
|
||||
returning <span class="extract"><span class="extract-syntax">FALSE</span></span>, the script halts and returns <span class="extract"><span class="extract-syntax">FALSE</span></span>. An empty script
|
||||
always succeeds and returns <span class="extract"><span class="extract-syntax">TRUE</span></span>.
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="3-bs2.html#SP1">§1. Build skills</a></li><li><a href="3-bs2.html#SP3">§3. Build steps</a></li><li><a href="3-bs2.html#SP5">§5. Execution</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Build skills. </b>A "skill" is a single atomic task which we know how to perform. For example,
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Build skills. </b>A "skill" is a single atomic task which we know how to perform. For example,
|
||||
assimilating a binary for a kit is a skill.
|
||||
</p>
|
||||
|
||||
|
@ -90,7 +90,7 @@ assimilating a binary for a kit is a skill.
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure build_skill is accessed in 2/gnr and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Skills provide two method functions: one constructs a shell command to
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Skills provide two method functions: one constructs a shell command to
|
||||
perform the skill, and the other performs the skill directly by calling some
|
||||
function within the current executable. These methods are optional, and if
|
||||
one is absent then the skill can't be performed that way.
|
||||
|
@ -106,7 +106,7 @@ one is absent then the skill can't be performed that way.
|
|||
<span class="identifier-syntax">INT_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">BUILD_SKILL_INTERNAL_MTID</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">build_skill</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_step</span><span class="plain-syntax"> *</span><span class="identifier-syntax">BS</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_methodology</span><span class="plain-syntax"> *</span><span class="identifier-syntax">meth</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Build steps. </b>These are essentially just skills, but with a docket of contextual data. The
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Build steps. </b>These are essentially just skills, but with a docket of contextual data. The
|
||||
idea is that a function outside the <a href="index.html" class="internal">supervisor</a> module can carry out a skill
|
||||
for us using only the contextual information in this structure, without having
|
||||
to access any of <span class="extract"><span class="extract-syntax">inbuild</span></span>'s variables directly.
|
||||
|
@ -124,7 +124,7 @@ to access any of <span class="extract"><span class="extract-syntax">inbuild</spa
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">build_step</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure build_step is accessed in 2/cps, 3/bg, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 5/ks, 5/ps2, 6/hdn, 6/inc and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>We build scripts for a vertex by attaching one step at a time to it:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>We build scripts for a vertex by attaching one step at a time to it:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -142,7 +142,7 @@ to access any of <span class="extract"><span class="extract-syntax">inbuild</spa
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">S</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Execution. </b>Note that this prints a log of shell commands generated to <span class="extract"><span class="extract-syntax">stdout</span></span> when
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Execution. </b>Note that this prints a log of shell commands generated to <span class="extract"><span class="extract-syntax">stdout</span></span> when
|
||||
we are running inside Inbuild at the command line, but not when we are running
|
||||
inside the <span class="extract"><span class="extract-syntax">inform7</span></span> executable, where we are silent throughout.
|
||||
</p>
|
||||
|
@ -161,7 +161,7 @@ inside the <span class="extract"><span class="extract-syntax">inform7</span></sp
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out a shell command, and perhaps print or call it</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out a shell command, and perhaps print or call it</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -169,7 +169,7 @@ inside the <span class="extract"><span class="extract-syntax">inform7</span></sp
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><a href="3-bs2.html#SP6" class="function-link"><span class="function-syntax">BuildSteps::shell</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">BM</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-bs2.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Perform the skill internally if that's called for</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Perform the skill internally if that's called for</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -180,7 +180,7 @@ inside the <span class="extract"><span class="extract-syntax">inform7</span></sp
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-bs2.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>This prints a shell command to <span class="extract"><span class="extract-syntax">stdout</span></span> (except when inside <span class="extract"><span class="extract-syntax">inform7</span></span>)
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>This prints a shell command to <span class="extract"><span class="extract-syntax">stdout</span></span> (except when inside <span class="extract"><span class="extract-syntax">inform7</span></span>)
|
||||
and also executes it if the methodology allows, returning the result. Note
|
||||
that shell commands return 0 to indicate happiness.
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="3-ib.html#SP1">§1. Timestamps</a></li><li><a href="3-ib.html#SP5">§5. Build process</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Timestamps. </b>We want to assign a timestamp to every vertex in the graph, whose meaning is
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Timestamps. </b>We want to assign a timestamp to every vertex in the graph, whose meaning is
|
||||
that what it represents has been up-to-date since that time.
|
||||
</p>
|
||||
|
||||
|
@ -96,7 +96,7 @@ binary Inter files, because those are its build-dependencies.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>The following compares two times: it returns 1 if <span class="extract"><span class="extract-syntax">t1</span></span> is later, -1 if
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>The following compares two times: it returns 1 if <span class="extract"><span class="extract-syntax">t1</span></span> is later, -1 if
|
||||
<span class="extract"><span class="extract-syntax">t2</span></span> is later, and 0 if they are identical.
|
||||
</p>
|
||||
|
||||
|
@ -120,7 +120,7 @@ would be fine, but we're being careful.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>We then take the latest timestamp of any build dependency:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>We then take the latest timestamp of any build dependency:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -136,7 +136,7 @@ would be fine, but we're being careful.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">latest</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>And of any use dependency:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>And of any use dependency:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -152,7 +152,7 @@ would be fine, but we're being careful.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">latest</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Build process. </b>This is a recursive process, beginning at the node representing what we want
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Build process. </b>This is a recursive process, beginning at the node representing what we want
|
||||
to build. As we recurse, we pass a bitmap of the following:
|
||||
</p>
|
||||
|
||||
|
@ -170,7 +170,7 @@ to build. As we recurse, we pass a bitmap of the following:
|
|||
<span class="plain-syntax"> </span><span class="constant-syntax">BUILD_DEPENDENCIES_MATTER_GB</span><span class="plain-syntax"> + </span><span class="constant-syntax">IGNORE_TIMESTAMPS_GB</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">meth</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>This is called when Inbuild's <span class="extract"><span class="extract-syntax">-trace</span></span> switch is set at the command line.
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>This is called when Inbuild's <span class="extract"><span class="extract-syntax">-trace</span></span> switch is set at the command line.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -179,7 +179,7 @@ to build. As we recurse, we pass a bitmap of the following:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">trace_ibg</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>We want to be very sure that this recursion does not lock up, or perform
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>We want to be very sure that this recursion does not lock up, or perform
|
||||
unnecessary work by performing the same node twice. To do this we apply the
|
||||
<span class="extract"><span class="extract-syntax">built</span></span> flag to a node when it has been built; but to make this is not left
|
||||
over from last time around, we only regard it when the <span class="extract"><span class="extract-syntax">last_built_in_generation</span></span> count
|
||||
|
@ -220,7 +220,7 @@ for each time we recurse.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b>In everything which follows, <span class="extract"><span class="extract-syntax">rv</span></span> (prosaically, this stands only for "return
|
||||
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b>In everything which follows, <span class="extract"><span class="extract-syntax">rv</span></span> (prosaically, this stands only for "return
|
||||
value") remains <span class="extract"><span class="extract-syntax">TRUE</span></span> until the first active step fails, at which point no
|
||||
other active steps are ever taken, nor are any recursions made. In effect,
|
||||
the first failure halts the process.
|
||||
|
@ -254,7 +254,7 @@ needs no action taken.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rv</span><span class="plain-syntax">) && (</span><a href="3-bg.html#SP5" class="function-link"><span class="function-syntax">Graphs::can_be_built</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">))) </span><span class="named-paragraph-container code-font"><a href="3-ib.html#SP7_1_3" class="named-paragraph-link"><span class="named-paragraph">Build the node itself, if necessary</span><span class="named-paragraph-number">7.1.3</span></a></span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-ib.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_1"></a><b>§7.1.1. </b>Suppose V needs W (for whatever reason), and that W can only be used with X.
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_1" class="paragraph-anchor"></a><b>§7.1.1. </b>Suppose V needs W (for whatever reason), and that W can only be used with X.
|
||||
It follows that we will have to build X as well as W, since the process of
|
||||
building V is itself a use of W, and therefore of X. So we always enable the
|
||||
<span class="extract"><span class="extract-syntax">USE_DEPENDENCIES_MATTER_GB</span></span> bit when recursing through an edge.
|
||||
|
@ -271,7 +271,7 @@ building V is itself a use of W, and therefore of X. So we always enable the
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">gb</span><span class="plain-syntax"> | </span><span class="constant-syntax">USE_DEPENDENCIES_MATTER_GB</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">BM</span><span class="plain-syntax">, </span><span class="identifier-syntax">changes</span><span class="plain-syntax">, </span><span class="identifier-syntax">generation</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_list</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-ib.html#SP7_1">§7.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_2"></a><b>§7.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Build the use dependencies of the node</span><span class="named-paragraph-number">7.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_2" class="paragraph-anchor"></a><b>§7.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Build the use dependencies of the node</span><span class="named-paragraph-number">7.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -282,7 +282,7 @@ building V is itself a use of W, and therefore of X. So we always enable the
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">gb</span><span class="plain-syntax"> | </span><span class="constant-syntax">USE_DEPENDENCIES_MATTER_GB</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">BM</span><span class="plain-syntax">, </span><span class="identifier-syntax">changes</span><span class="plain-syntax">, </span><span class="identifier-syntax">generation</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_list</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-ib.html#SP7_1">§7.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_3"></a><b>§7.1.3. </b>Now for the node <span class="extract"><span class="extract-syntax">V</span></span> itself.
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_3" class="paragraph-anchor"></a><b>§7.1.3. </b>Now for the node <span class="extract"><span class="extract-syntax">V</span></span> itself.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Build the node itself, if necessary</span><span class="named-paragraph-number">7.1.3</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -302,7 +302,7 @@ building V is itself a use of W, and therefore of X. So we always enable the
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="3-ib.html#SP7_1">§7.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_3_1"></a><b>§7.1.3.1. </b>This is where the incremental promise is finally kept. If the timestamp of
|
||||
<p class="commentary firstcommentary"><a id="SP7_1_3_1" class="paragraph-anchor"></a><b>§7.1.3.1. </b>This is where the incremental promise is finally kept. If the timestamp of
|
||||
<span class="extract"><span class="extract-syntax">V</span></span> is definitely before later than that of everything it depends on, then
|
||||
it would be redundant to recreate it.
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="3-is.html#SP1">§1. Creation</a></li><li><a href="3-is.html#SP2">§2. Assimilation</a></li><li><a href="3-is.html#SP4">§4. Code generation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Creation. </b>Note that code generation can only be done internally, and only in fact within
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Creation. </b>Note that code generation can only be done internally, and only in fact within
|
||||
the <span class="extract"><span class="extract-syntax">inform7</span></span> compiler: this is because the Inter code which it generates from
|
||||
is being held in memory by <span class="extract"><span class="extract-syntax">inform7</span></span>.
|
||||
</p>
|
||||
|
@ -91,7 +91,7 @@ is being held in memory by <span class="extract"><span class="extract-syntax">in
|
|||
<span class="plain-syntax"> </span><a href="3-is.html#SP4" class="function-link"><span class="function-syntax">InterSkill::code_generate_internally</span></a><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. Assimilation. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. Assimilation. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InterSkill::assimilate_via_shell</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">InterSkill::assimilate_via_shell</span></span>:<br/><a href="3-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">build_skill</span><span class="plain-syntax"> *</span><span class="identifier-syntax">skill</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_step</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">,</span>
|
||||
|
@ -106,7 +106,7 @@ is being held in memory by <span class="extract"><span class="extract-syntax">in
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Something to watch out for here is that, when running internally as part of
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Something to watch out for here is that, when running internally as part of
|
||||
<span class="extract"><span class="extract-syntax">inform7</span></span>, we use the copy of the <span class="extract"><span class="extract-syntax">assimilate</span></span> pipeline inside the installation
|
||||
of <span class="extract"><span class="extract-syntax">inform7</span></span> (it will be in the internal nest). When we perform assimilation
|
||||
from the command line using the <span class="extract"><span class="extract-syntax">inter</span></span> tool, we use the <span class="extract"><span class="extract-syntax">assimilate</span></span> pipeline
|
||||
|
@ -163,7 +163,7 @@ or should be, so the effect is the same.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Code generation. </b>This can only be done internally, for reasons given above, and only when the
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Code generation. </b>This can only be done internally, for reasons given above, and only when the
|
||||
<span class="extract"><span class="extract-syntax">codegen</span></span> module is present in the current executable (which in practice means:
|
||||
only inside <span class="extract"><span class="extract-syntax">inform7</span></span>).
|
||||
</p>
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Inform7 Skill</b></li></ul></div>
|
||||
<p class="purpose">The skill of turning source text into Inter code.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>This skill can be performed externally with a shell command to <span class="extract"><span class="extract-syntax">inform7</span></span>, or,
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>This skill can be performed externally with a shell command to <span class="extract"><span class="extract-syntax">inform7</span></span>, or,
|
||||
if we are running inside <span class="extract"><span class="extract-syntax">inform7</span></span> anyway, internally with a function call.
|
||||
</p>
|
||||
|
||||
|
@ -114,7 +114,7 @@ if we are running inside <span class="extract"><span class="extract-syntax">info
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Note that we create the Materials folder in the file system if it doesn't
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Note that we create the Materials folder in the file system if it doesn't
|
||||
already exist, but only for projects in bundles. (If we did this for projects
|
||||
in single files, the result would be that batch-testing Inform via <a href="../../../intest/docs/index.html" class="internal">intest</a>
|
||||
would create thousands of unwanted folders. Still, it's a slightly arbitrary
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Inform6 Skill</b></li></ul></div>
|
||||
<p class="purpose">The skill of compiling Inform 6 into a story file for the target VM.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>This can only be performed via the shell, as the Inform 6 compiler is never
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>This can only be performed via the shell, as the Inform 6 compiler is never
|
||||
part of the executables of the more modern Inform tools, and so can't be
|
||||
called as a function.
|
||||
</p>
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Inblorb Skill</b></li></ul></div>
|
||||
<p class="purpose">The skill of packaging a story file and associated resources into a blorb.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">build_skill</span><span class="plain-syntax"> *</span><span class="identifier-syntax">package_using_inblorb_skill</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-em.html#SP1">§1. Genre definition</a></li><li><a href="4-em.html#SP5">§5. Claiming</a></li><li><a href="4-em.html#SP6">§6. Searching</a></li><li><a href="4-em.html#SP7">§7. Copying</a></li><li><a href="4-em.html#SP8">§8. Build graph</a></li><li><a href="4-em.html#SP9">§9. Source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">extension_genre</span></span> can be summarised as follows. Copies consist of single
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">extension_genre</span></span> can be summarised as follows. Copies consist of single
|
||||
files. These are recognised by having the filename extension <span class="extract"><span class="extract-syntax">.i7x</span></span>. They are
|
||||
stored in nests, in <span class="extract"><span class="extract-syntax">N/Extensions/Author/Title-vVersion.i7x</span></span>. Their build
|
||||
graphs are a single vertex with no build edges, but with use edges to any
|
||||
|
@ -82,7 +82,7 @@ to make the graphs of every such extension. Instead we build out the graph
|
|||
later on, as needed, just for extensions of interest: see below.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExtensionManager::start</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">ExtensionManager::start</span></span>:<br/>Inbuild Control - <a href="1-ic.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
|
@ -99,7 +99,7 @@ later on, as needed, just for extensions of interest: see below.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%X"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Extensions live in their namesake subdirectory of a nest:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Extensions live in their namesake subdirectory of a nest:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -108,7 +108,7 @@ later on, as needed, just for extensions of interest: see below.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">location</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Extensions"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>Extension copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_extension</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Extension copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_extension</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -142,7 +142,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -169,7 +169,7 @@ So we'll open it and look.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-em.html#SP4" class="function-link"><span class="function-syntax">ExtensionManager::new_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Searching. </b>Here we look through a nest to find all extensions matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Searching. </b>Here we look through a nest to find all extensions matching the supplied
|
||||
requirements.
|
||||
</p>
|
||||
|
||||
|
@ -226,7 +226,7 @@ so we'll quietly allow for it.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Copying. </b>Now the task is to copy an extension into place in a nest. This is easy,
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Copying. </b>Now the task is to copy an extension into place in a nest. This is easy,
|
||||
since an extension is a single file; to sync, we just overwrite.
|
||||
</p>
|
||||
|
||||
|
@ -265,7 +265,7 @@ since an extension is a single file; to sync, we just overwrite.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Build graph. </b>As far as building goes, the build graph for an extension is just a single vertex:
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Build graph. </b>As far as building goes, the build graph for an extension is just a single vertex:
|
||||
you don't need to build an extension at all. But it may well have use edges,
|
||||
thanks to including other extensions, and because of that we have to read the
|
||||
source text before we can do anything with the graph.
|
||||
|
@ -294,7 +294,7 @@ the current VM settings.
|
|||
<span class="plain-syntax"> </span><a href="4-em.html#SP8" class="function-link"><span class="function-syntax">ExtensionManager::ensure_graphed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. Source text. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Source text. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExtensionManager::read_source_text_for</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">ExtensionManager::read_source_text_for</span></span>:<br/><a href="4-em.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">G</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-km.html#SP1">§1. Genre definition</a></li><li><a href="4-km.html#SP4">§4. Claiming</a></li><li><a href="4-km.html#SP5">§5. Searching</a></li><li><a href="4-km.html#SP6">§6. Copying</a></li><li><a href="4-km.html#SP7">§7. Build graph</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">kit_genre</span></span> can be summarised as follows. Kits consist of directories,
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">kit_genre</span></span> can be summarised as follows. Kits consist of directories,
|
||||
containing metadata in <span class="extract"><span class="extract-syntax">D/kit_metadata.txt</span></span>, but which are also valid Inweb
|
||||
webs of Inform 6 source text. They are recognised by having directory names
|
||||
ending in <span class="extract"><span class="extract-syntax">Kit</span></span>, and by having a metadata file in place. They are stored in
|
||||
|
@ -93,7 +93,7 @@ the metadata file.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Kits live in the <span class="extract"><span class="extract-syntax">Inter</span></span> subdirectory of a nest:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Kits live in the <span class="extract"><span class="extract-syntax">Inter</span></span> subdirectory of a nest:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -102,7 +102,7 @@ the metadata file.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">location</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inter"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Kit copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_kit</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Kit copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_kit</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -134,7 +134,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -165,7 +165,7 @@ a valid metadata file.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Searching. </b>Here we look through a nest to find all kits matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Searching. </b>Here we look through a nest to find all kits matching the supplied
|
||||
requirements.
|
||||
</p>
|
||||
|
||||
|
@ -192,7 +192,7 @@ requirements.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Copying. </b>Now the task is to copy a kit into place in a nest. Since a kit is a directory,
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Copying. </b>Now the task is to copy a kit into place in a nest. Since a kit is a directory,
|
||||
we need to <span class="extract"><span class="extract-syntax">rsync</span></span> it.
|
||||
</p>
|
||||
|
||||
|
@ -236,7 +236,7 @@ we need to <span class="extract"><span class="extract-syntax">rsync</span></span
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Build graph. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Build graph. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KitManager::building_soon</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">KitManager::building_soon</span></span>:<br/><a href="4-km.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax"> **</span><span class="identifier-syntax">V</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-lm.html#SP1">§1. Genre definition</a></li><li><a href="4-lm.html#SP4">§4. Claiming</a></li><li><a href="4-lm.html#SP5">§5. Searching</a></li><li><a href="4-lm.html#SP6">§6. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">language_genre</span></span> can be summarised as follows. Language definitions
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">language_genre</span></span> can be summarised as follows. Language definitions
|
||||
consist of directories, containing metadata in <span class="extract"><span class="extract-syntax">D/about.txt</span></span>. They are
|
||||
recognised by having this metadata file in place. They are stored in
|
||||
nests, in <span class="extract"><span class="extract-syntax">N/Languages/Title-vVersion</span></span>. Their build graphs are single
|
||||
|
@ -88,7 +88,7 @@ vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Languages live in the <span class="extract"><span class="extract-syntax">Inter</span></span> subdirectory of a nest:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Languages live in the <span class="extract"><span class="extract-syntax">Inter</span></span> subdirectory of a nest:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -97,7 +97,7 @@ vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">location</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Languages"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Language copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_language</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Language copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_language</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -129,7 +129,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -165,7 +165,7 @@ a valid metadata file. The name should be in English text, without accents.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Searching. </b>Here we look through a nest to find all languages matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Searching. </b>Here we look through a nest to find all languages matching the supplied
|
||||
requirements.
|
||||
</p>
|
||||
|
||||
|
@ -191,7 +191,7 @@ requirements.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Copying. </b>Now the task is to copy a language into place in a nest. Since a language is a folder,
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Copying. </b>Now the task is to copy a language into place in a nest. Since a language is a folder,
|
||||
we need to <span class="extract"><span class="extract-syntax">rsync</span></span> it.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-pbm.html#SP1">§1. Genre definition</a></li><li><a href="4-pbm.html#SP3">§3. Claiming</a></li><li><a href="4-pbm.html#SP4">§4. Searching</a></li><li><a href="4-pbm.html#SP5">§5. Copying</a></li><li><a href="4-pbm.html#SP6">§6. Build graph</a></li><li><a href="4-pbm.html#SP7">§7. Source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">project_bundle_genre</span></span> can be summarised as follows. Copies consist of
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">project_bundle_genre</span></span> can be summarised as follows. Copies consist of
|
||||
directories, which are Inform project bundles: for example,
|
||||
<span class="extract"><span class="extract-syntax">Counterfeit Monkey.inform</span></span> might be such a bundle. They are recognised by
|
||||
being directories and having names ending in <span class="extract"><span class="extract-syntax">.inform</span></span>. They cannot be
|
||||
|
@ -98,7 +98,7 @@ However it is stored in the file system, a project is a project.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Project copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_project</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Project copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_project</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -118,7 +118,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -142,7 +142,7 @@ not a file, false if we know the reverse, and otherwise not applicable.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-pbm.html#SP2" class="function-link"><span class="function-syntax">ProjectBundleManager::new_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Pathnames::directory_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Searching. </b>Here we look through a nest to find all projects matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Searching. </b>Here we look through a nest to find all projects matching the supplied
|
||||
requirements; though in fact... projects are not nesting birds.
|
||||
</p>
|
||||
|
||||
|
@ -151,7 +151,7 @@ requirements; though in fact... projects are not nesting birds.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search_results</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Copying. </b>Now the task is to copy a project into place in a nest; or would be, if only
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Copying. </b>Now the task is to copy a project into place in a nest; or would be, if only
|
||||
projects lived there.
|
||||
</p>
|
||||
|
||||
|
@ -162,7 +162,7 @@ projects lived there.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="identifier-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Build graph. </b>As with extensions, the graph for a project is made only on demand, because to make
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Build graph. </b>As with extensions, the graph for a project is made only on demand, because to make
|
||||
it would mean fully parsing and partially syntax-analysing its source text.
|
||||
</p>
|
||||
|
||||
|
@ -173,7 +173,7 @@ it would mean fully parsing and partially syntax-analysing its source text.
|
|||
<span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">project</span><span class="plain-syntax">-></span><span class="element-syntax">chosen_build_target</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Source text. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Source text. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ProjectBundleManager::read_source_text_for</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">ProjectBundleManager::read_source_text_for</span></span>:<br/><a href="4-pbm.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">G</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-pfm.html#SP1">§1. Genre definition</a></li><li><a href="4-pfm.html#SP3">§3. Claiming</a></li><li><a href="4-pfm.html#SP4">§4. Searching</a></li><li><a href="4-pfm.html#SP5">§5. Copying</a></li><li><a href="4-pfm.html#SP6">§6. Build graph</a></li><li><a href="4-pfm.html#SP7">§7. Source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">project_file_genre</span></span> can be summarised as follows. Copies consist of
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">project_file_genre</span></span> can be summarised as follows. Copies consist of
|
||||
single files. These are recognised by having the filename extension <span class="extract"><span class="extract-syntax">.txt</span></span>,
|
||||
<span class="extract"><span class="extract-syntax">.ni</span></span> or <span class="extract"><span class="extract-syntax">.i7</span></span>. They cannot be stored in nests. Their build graphs are
|
||||
extensive, having "upstream" vertices representing possible ways to build or
|
||||
|
@ -96,7 +96,7 @@ However it is stored in the file system, a project is a project.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Project copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_project</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Project copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_project</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -116,7 +116,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -143,7 +143,7 @@ or <span class="extract"><span class="extract-syntax">.i7</span></span>.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-pfm.html#SP2" class="function-link"><span class="function-syntax">ProjectFileManager::new_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Filenames::get_leafname</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">), </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Searching. </b>Here we look through a nest to find all projects matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Searching. </b>Here we look through a nest to find all projects matching the supplied
|
||||
requirements; though in fact... projects are not nesting birds.
|
||||
</p>
|
||||
|
||||
|
@ -152,7 +152,7 @@ requirements; though in fact... projects are not nesting birds.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search_results</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Copying. </b>Now the task is to copy a project into place in a nest; or would be, if only
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Copying. </b>Now the task is to copy a project into place in a nest; or would be, if only
|
||||
projects lived there.
|
||||
</p>
|
||||
|
||||
|
@ -163,7 +163,7 @@ projects lived there.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="identifier-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Build graph. </b>As with extensions, the graph for a project is made only on demand, because to make
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Build graph. </b>As with extensions, the graph for a project is made only on demand, because to make
|
||||
it would mean fully parsing and partially syntax-analysing its source text.
|
||||
</p>
|
||||
|
||||
|
@ -174,7 +174,7 @@ it would mean fully parsing and partially syntax-analysing its source text.
|
|||
<span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">project</span><span class="plain-syntax">-></span><span class="element-syntax">chosen_build_target</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Source text. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Source text. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ProjectFileManager::read_source_text_for</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">ProjectFileManager::read_source_text_for</span></span>:<br/><a href="4-pfm.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_genre</span><span class="plain-syntax"> *</span><span class="identifier-syntax">G</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-pm.html#SP1">§1. Genre definition</a></li><li><a href="4-pm.html#SP4">§4. Claiming</a></li><li><a href="4-pm.html#SP5">§5. Searching</a></li><li><a href="4-pm.html#SP6">§6. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">pipeline_genre</span></span> can be summarised as follows. Copies consist of single
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">pipeline_genre</span></span> can be summarised as follows. Copies consist of single
|
||||
files. These are recognised by having the filename extension <span class="extract"><span class="extract-syntax">.interpipeline</span></span>.
|
||||
They are stored in nests, in <span class="extract"><span class="extract-syntax">N/Pipelines/Title-vVersion.i7x</span></span>. Their build
|
||||
graphs are single vertices with no build or use edges.
|
||||
|
@ -87,7 +87,7 @@ graphs are single vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Pipelines live in their namesake subdirectory of a nest:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Pipelines live in their namesake subdirectory of a nest:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -96,7 +96,7 @@ graphs are single vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">location</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pipelines"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Pipeline copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_pipeline</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Pipeline copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_pipeline</span></span>,
|
||||
which stores data about pipelines used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -114,7 +114,7 @@ which stores data about pipelines used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -145,7 +145,7 @@ not a file, false if we know the reverse, and otherwise not applicable.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Searching. </b>Here we look through a nest to find all pipelines matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Searching. </b>Here we look through a nest to find all pipelines matching the supplied
|
||||
requirements.
|
||||
</p>
|
||||
|
||||
|
@ -171,7 +171,7 @@ requirements.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Copying. </b>Now the task is to copy a pipeline into place in a nest. This is easy,
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Copying. </b>Now the task is to copy a pipeline into place in a nest. This is easy,
|
||||
since a pipeline is a single file; to sync, we just overwrite.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="4-tm.html#SP1">§1. Genre definition</a></li><li><a href="4-tm.html#SP4">§4. Claiming</a></li><li><a href="4-tm.html#SP5">§5. Searching</a></li><li><a href="4-tm.html#SP6">§6. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">template_genre</span></span> can be summarised as follows. Website templates
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Genre definition. </b>The <span class="extract"><span class="extract-syntax">template_genre</span></span> can be summarised as follows. Website templates
|
||||
are directories. They are recognised by containing either a metadata file
|
||||
called <span class="extract"><span class="extract-syntax">(manifest).txt</span></span> or <span class="extract"><span class="extract-syntax">index.html</span></span>, or both. They are stored in
|
||||
nests, in <span class="extract"><span class="extract-syntax">N/Templates/Title-vVersion</span></span>. Their build graphs are single
|
||||
|
@ -88,7 +88,7 @@ vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Templates live in the <span class="extract"><span class="extract-syntax">Templates</span></span> subdirectory of a nest:
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Templates live in the <span class="extract"><span class="extract-syntax">Templates</span></span> subdirectory of a nest:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -97,7 +97,7 @@ vertices with no build or use edges.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-></span><span class="element-syntax">location</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Templates"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Template copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_template</span></span>,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Template copies are annotated with a structure called an <span class="extract"><span class="extract-syntax">inform_template</span></span>,
|
||||
which stores data about extensions used by the Inform compiler.
|
||||
</p>
|
||||
|
||||
|
@ -117,7 +117,7 @@ which stores data about extensions used by the Inform compiler.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Claiming. </b>Here <span class="extract"><span class="extract-syntax">arg</span></span> is a textual form of a filename or pathname, such as may have been
|
||||
supplied at the command line; <span class="extract"><span class="extract-syntax">ext</span></span> is a substring of it, and is its extension
|
||||
(e.g., <span class="extract"><span class="extract-syntax">jpg</span></span> if <span class="extract"><span class="extract-syntax">arg</span></span> is <span class="extract"><span class="extract-syntax">Geraniums.jpg</span></span>), or is empty if there isn't one;
|
||||
<span class="extract"><span class="extract-syntax">directory_status</span></span> is true if we know for some reason that this is a directory
|
||||
|
@ -144,7 +144,7 @@ either a manifest file, or else an <span class="extract"><span class="extract-sy
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Searching. </b>Here we look through a nest to find all kits matching the supplied
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Searching. </b>Here we look through a nest to find all kits matching the supplied
|
||||
requirements.
|
||||
</p>
|
||||
|
||||
|
@ -171,7 +171,7 @@ requirements.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Copying. </b>Now the task is to copy a template into place in a nest. Since a template is
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Copying. </b>Now the task is to copy a template into place in a nest. Since a template is
|
||||
a folder, we need to <span class="extract"><span class="extract-syntax">rsync</span></span> it.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="5-es.html#SP1">§1. Scanning metadata</a></li><li><a href="5-es.html#SP3">§3. Cached metadata</a></li><li><a href="5-es.html#SP4">§4. Search list</a></li><li><a href="5-es.html#SP6">§6. Graph</a></li><li><a href="5-es.html#SP7">§7. Read source text</a></li><li><a href="5-es.html#SP9">§9. Miscellaneous</a></li><li><a href="5-es.html#SP15">§15. Version requirements</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>An extension has a title and an author name, each of which is limited in
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>An extension has a title and an author name, each of which is limited in
|
||||
length to one character less than the following constants:
|
||||
</p>
|
||||
|
||||
|
@ -101,7 +101,7 @@ length to one character less than the following constants:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_extension is accessed in 1/sm, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 5/ks, 5/ls, 5/ps, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 7/tm, 7/dct, 7/cns, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the extension genre is created.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the extension genre is created.
|
||||
We scan the extension file for the title, author, version number and any
|
||||
compatibility notes given (such as "for Glulx only").
|
||||
</p>
|
||||
|
@ -124,7 +124,7 @@ compatibility notes given (such as "for Glulx only").
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">reqs</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1"></a><b>§2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the extension docket</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the extension docket</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -150,7 +150,7 @@ compatibility notes given (such as "for Glulx only").
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">sort_usage_date</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2"></a><b>§2.2. </b>The following scans a potential extension file. If it seems malformed, a
|
||||
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>§2.2. </b>The following scans a potential extension file. If it seems malformed, a
|
||||
suitable error is written to the stream <span class="extract"><span class="extract-syntax">error_text</span></span>. If not, this is left
|
||||
alone, and the version number is returned.
|
||||
</p>
|
||||
|
@ -184,7 +184,7 @@ alone, and the version number is returned.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">version_text</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1"></a><b>§2.2.1. </b>The titling line is terminated by any of <span class="extract"><span class="extract-syntax">0A</span></span>, <span class="extract"><span class="extract-syntax">0D</span></span>, <span class="extract"><span class="extract-syntax">0A 0D</span></span> or <span class="extract"><span class="extract-syntax">0D 0A</span></span>, or
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1" class="paragraph-anchor"></a><b>§2.2.1. </b>The titling line is terminated by any of <span class="extract"><span class="extract-syntax">0A</span></span>, <span class="extract"><span class="extract-syntax">0D</span></span>, <span class="extract"><span class="extract-syntax">0A 0D</span></span> or <span class="extract"><span class="extract-syntax">0D 0A</span></span>, or
|
||||
by the local <span class="extract"><span class="extract-syntax">\n</span></span> for good measure.
|
||||
</p>
|
||||
|
||||
|
@ -201,7 +201,7 @@ by the local <span class="extract"><span class="extract-syntax">\n</span></span>
|
|||
<span class="plain-syntax"> </span><a href="2-wrk.html#SP4" class="function-link"><span class="function-syntax">Works::normalise_casing</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">titling_line</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2">§2.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_2"></a><b>§2.2.2. </b>In the following, all possible newlines are converted to white space, and
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_2" class="paragraph-anchor"></a><b>§2.2.2. </b>In the following, all possible newlines are converted to white space, and
|
||||
all white space before a quoted rubric text is ignored. We need to do this
|
||||
partly because users have probably keyed a double line break before the
|
||||
rubric, but also because we might have stopped reading the titling line
|
||||
|
@ -226,7 +226,7 @@ thing we read here is a meaningless <span class="extract"><span class="extract-s
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2">§2.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3"></a><b>§2.2.3. </b>In general, once case-normalised, a titling line looks like this:
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3" class="paragraph-anchor"></a><b>§2.2.3. </b>In general, once case-normalised, a titling line looks like this:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
@ -263,7 +263,7 @@ load the entire file.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2">§2.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_1"></a><b>§2.2.3.1. </b>We make no attempt to check the version number for validity: the purpose
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_1" class="paragraph-anchor"></a><b>§2.2.3.1. </b>We make no attempt to check the version number for validity: the purpose
|
||||
of the census is to identify extensions and reject accidentally included
|
||||
other files, not to syntax-check all extensions to see if they would work
|
||||
if used.
|
||||
|
@ -279,7 +279,7 @@ if used.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2_3">§2.2.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_2"></a><b>§2.2.3.2. </b>The earliest "by" is the divider: note that extension titles are not
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_2" class="paragraph-anchor"></a><b>§2.2.3.2. </b>The earliest "by" is the divider: note that extension titles are not
|
||||
allowed to contain this word, so "North By Northwest By Cary Grant" is
|
||||
not a situation we need to contend with.
|
||||
</p>
|
||||
|
@ -298,7 +298,7 @@ not a situation we need to contend with.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2_3">§2.2.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_3"></a><b>§2.2.3.3. </b>Similarly, extension titles are not allowed to contain parentheses, so
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_3_3" class="paragraph-anchor"></a><b>§2.2.3.3. </b>Similarly, extension titles are not allowed to contain parentheses, so
|
||||
this is unambiguous.
|
||||
</p>
|
||||
|
||||
|
@ -312,7 +312,7 @@ this is unambiguous.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2_2_3">§2.2.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_3"></a><b>§2.3. </b>Note that we don't attempt to modify the <span class="extract"><span class="extract-syntax">inbuild_work</span></span> structure inside
|
||||
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>§2.3. </b>Note that we don't attempt to modify the <span class="extract"><span class="extract-syntax">inbuild_work</span></span> structure inside
|
||||
the edition; we create an entirely new <span class="extract"><span class="extract-syntax">inbuild_work</span></span>. That's because they
|
||||
are immutable, and need to be for the extensions dictionary to work.
|
||||
</p>
|
||||
|
@ -343,7 +343,7 @@ are immutable, and need to be for the extensions dictionary to work.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Cached metadata. </b>The following data hides between runs in the <a href="7-dct.html" class="internal">Dictionary</a>.
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Cached metadata. </b>The following data hides between runs in the <a href="7-dct.html" class="internal">Dictionary</a>.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -418,7 +418,7 @@ are immutable, and need to be for the extensions dictionary to work.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-es.html#SP3" class="function-link"><span class="function-syntax">Extensions::compare_by_edition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E1</span><span class="plain-syntax">, </span><span class="identifier-syntax">E2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Search list. </b>Sometimes ane extension is being looked at in isolation, and then <span class="extract"><span class="extract-syntax">read_into_project</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Search list. </b>Sometimes ane extension is being looked at in isolation, and then <span class="extract"><span class="extract-syntax">read_into_project</span></span>
|
||||
will be <span class="extract"><span class="extract-syntax">NULL</span></span>; but if it is being loaded to be included in the source text of a
|
||||
project, then...
|
||||
</p>
|
||||
|
@ -428,7 +428,7 @@ project, then...
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">read_into_project</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>...and this affects its search list, because now its own inclusions can see
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>...and this affects its search list, because now its own inclusions can see
|
||||
the Materials folder of the project in question:
|
||||
</p>
|
||||
|
||||
|
@ -447,7 +447,7 @@ the Materials folder of the project in question:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">search_list</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Graph. </b>The dependency graph is not so much constructed as discovered; dependencies
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Graph. </b>The dependency graph is not so much constructed as discovered; dependencies
|
||||
are made to each other extension as it's Included in this one, during the
|
||||
course of reading in the text.
|
||||
</p>
|
||||
|
@ -466,7 +466,7 @@ no project involved, we must take action ourselves.)
|
|||
<span class="plain-syntax"> </span><a href="6-inc.html#SP1" class="function-link"><span class="function-syntax">Inclusions::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Read source text. </b>The scan only skimmed the surface of the file, and didn't try to parse it as
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Read source text. </b>The scan only skimmed the surface of the file, and didn't try to parse it as
|
||||
natural language text with Preform. But if the extension turns out to be one
|
||||
that we need to use for something, we'll need to read its full text eventually.
|
||||
This is that time.
|
||||
|
@ -493,7 +493,7 @@ This is that time.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b>We concoct a textual synopsis in the form
|
||||
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b>We concoct a textual synopsis in the form
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -517,7 +517,7 @@ range, we flatten them from general ISO to plain ASCII.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">)));</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>§7.2. </b>Note that if there is an active project, then we are reading the extension
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>Note that if there is an active project, then we are reading the extension
|
||||
in order to include it in that, and so we send it to the project's syntax tree,
|
||||
rather than to the extension's own one. But if we are simply examining the
|
||||
extension by running <span class="extract"><span class="extract-syntax">-graph</span></span> on it in the Inbuild command line, for example,
|
||||
|
@ -538,7 +538,7 @@ then its sentences will go to the extension's own tree.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">body_text_unbroken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_1"></a><b>§7.2.1. </b>If an extension file contains the special text (outside literal mode) of
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_1" class="paragraph-anchor"></a><b>§7.2.1. </b>If an extension file contains the special text (outside literal mode) of
|
||||
<span class="extract"><span class="extract-syntax">---- Documentation ----</span></span> then this is taken as the end of the Inform source,
|
||||
and the beginning of a snippet of documentation about the extension; text from
|
||||
that point on is saved until later, but not broken into sentences for the
|
||||
|
@ -553,7 +553,7 @@ and no documentation.
|
|||
<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"> { FALSE, - }</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>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_2"></a><b>§7.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Break the extension's text into body and documentation</span><span class="named-paragraph-number">7.2.2</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_2" class="paragraph-anchor"></a><b>§7.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Break the extension's text into body and documentation</span><span class="named-paragraph-number">7.2.2</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -563,7 +563,7 @@ and no documentation.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">body_text_unbroken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="comment-syntax"> mark this to be sentence-broken</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-es.html#SP7_2">§7.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>When the extension source text was read from its <span class="extract"><span class="extract-syntax">source_file</span></span>, we
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>When the extension source text was read from its <span class="extract"><span class="extract-syntax">source_file</span></span>, we
|
||||
attached a reference to say which <span class="extract"><span class="extract-syntax">inform_extension</span></span> it was, and here we
|
||||
make use of that:
|
||||
</p>
|
||||
|
@ -577,7 +577,7 @@ make use of that:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-em.html#SP4" class="function-link"><span class="function-syntax">ExtensionManager::from_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. Miscellaneous. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. Miscellaneous. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Extensions::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">) {</span>
|
||||
|
@ -593,7 +593,7 @@ make use of that:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">raw_author_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Three pieces of information will be set later on, by other parts of Inform
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Three pieces of information will be set later on, by other parts of Inform
|
||||
calling the routines below.
|
||||
</p>
|
||||
|
||||
|
@ -616,7 +616,7 @@ that happens, the following function will be called to set the rubric.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">rubric_as_lexed</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>The optional extra credit line is used to acknowledge I6 sources,
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>The optional extra credit line is used to acknowledge I6 sources,
|
||||
collaborators, translators and so on.
|
||||
</p>
|
||||
|
||||
|
@ -627,7 +627,7 @@ collaborators, translators and so on.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTENSIONS_CENSUS</span><span class="plain-syntax">, </span><span class="string-syntax">"Extension extra credit: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">extra_credit_as_lexed</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>The use option "authorial modesty" is unusual in applying to the extension
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>The use option "authorial modesty" is unusual in applying to the extension
|
||||
it is found in, not the whole source text. When we read it, we call one of
|
||||
the following routines, depending on whether it was in an extension or in
|
||||
the main source text:
|
||||
|
@ -643,7 +643,7 @@ the main source text:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">general_authorial_modesty</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>The inclusion sentence for an extension is where it was Included in a
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>The inclusion sentence for an extension is where it was Included in a
|
||||
project's syntax tree (if it was). It isn't used in compilation, only for
|
||||
problem messages and the index.
|
||||
</p>
|
||||
|
@ -657,7 +657,7 @@ problem messages and the index.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">inclusion_sentence</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>An extension is "standard" if it's either the Standard Rules or Basic Inform.
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>An extension is "standard" if it's either the Standard Rules or Basic Inform.
|
||||
(This affects indexing and crediting.)
|
||||
</p>
|
||||
|
||||
|
@ -667,7 +667,7 @@ problem messages and the index.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">standard</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. Version requirements. </b>When it's known that an extension must satisfy a given version requirement —
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. Version requirements. </b>When it's known that an extension must satisfy a given version requirement —
|
||||
say, being version 7.2.1 or better — the following is called. Note that
|
||||
if incompatible requirements are placed on it, the range in <span class="extract"><span class="extract-syntax">E->must_satisfy</span></span>
|
||||
becomes empty and stays that way.
|
||||
|
@ -679,7 +679,7 @@ becomes empty and stays that way.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumberRanges::intersect_range</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">must_satisfy</span><span class="plain-syntax">-></span><span class="element-syntax">version_range</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">-></span><span class="element-syntax">version_range</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. </b>And it is certainly possible, if an extension is loaded for multiple
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>And it is certainly possible, if an extension is loaded for multiple
|
||||
reasons with different versioning needs, that the extension no longer meets
|
||||
its requirements (even though it did when first loaded). This tests for that:
|
||||
</p>
|
||||
|
|
|
@ -82,7 +82,7 @@ MathJax = {
|
|||
|
||||
<ul class="toc"><li><a href="5-ks.html#SP1">§1. Scanning metadata</a></li><li><a href="5-ks.html#SP8">§8. The kits included by a project</a></li><li><a href="5-ks.html#SP10">§10. Kind definitions</a></li><li><a href="5-ks.html#SP11">§11. Language element activation</a></li><li><a href="5-ks.html#SP12">§12. Early source</a></li><li><a href="5-ks.html#SP13">§13. Build graph</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>Metadata for kits is stored in the following structure. "Attachment" for a
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>Metadata for kits is stored in the following structure. "Attachment" for a
|
||||
kit is the process of taking the Inter code from a binary Inter file in the
|
||||
kit directory and merging it into code already generated by the <span class="extract"><span class="extract-syntax">core</span></span>
|
||||
module of <span class="extract"><span class="extract-syntax">inform7</span></span>.
|
||||
|
@ -107,7 +107,7 @@ module of <span class="extract"><span class="extract-syntax">inform7</span></spa
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_kit</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_kit is accessed in 1/sm, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 5/es, 5/ls, 5/ps, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 7/dct, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Kits come with an "if this then that" service for including other kits,
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Kits come with an "if this then that" service for including other kits,
|
||||
and we represent rules with the following:
|
||||
</p>
|
||||
|
||||
|
@ -120,7 +120,7 @@ and we represent rules with the following:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_kit_ittt</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_kit_ittt is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Kits can also enable elements of the Inform programming language: that is,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Kits can also enable elements of the Inform programming language: that is,
|
||||
enable compiler support for them. For example, the WorldModelKit enables
|
||||
interactive fiction features of the compiler, but BasicInformKit does not.
|
||||
</p>
|
||||
|
@ -133,7 +133,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">element_activation</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure element_activation is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>Here goes, then:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Here goes, then:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -161,7 +161,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><a href="5-ks.html#SP5" class="function-link"><span class="function-syntax">Kits::read_metadata</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>The following reads line by line through the <span class="extract"><span class="extract-syntax">kit_metadata.txt</span></span> file:
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>The following reads line by line through the <span class="extract"><span class="extract-syntax">kit_metadata.txt</span></span> file:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -206,7 +206,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add compatibility</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add compatibility</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -220,7 +220,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add early source</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add early source</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -228,7 +228,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">early_source</span><span class="plain-syntax">, </span><span class="string-syntax">"\n\n"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_3"></a><b>§5.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add versioned extension</span><span class="named-paragraph-number">5.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_3" class="paragraph-anchor"></a><b>§5.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add versioned extension</span><span class="named-paragraph-number">5.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -246,7 +246,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_4"></a><b>§5.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add unversioned extension</span><span class="named-paragraph-number">5.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_4" class="paragraph-anchor"></a><b>§5.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add unversioned extension</span><span class="named-paragraph-number">5.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -255,7 +255,7 @@ interactive fiction features of the compiler, but BasicInformKit does not.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">extensions</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>We provide if this then that, where <span class="extract"><span class="extract-syntax">inc</span></span> is true, and if this then not that,
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>We provide if this then that, where <span class="extract"><span class="extract-syntax">inc</span></span> is true, and if this then not that,
|
||||
where it's false.
|
||||
</p>
|
||||
|
||||
|
@ -268,7 +268,7 @@ where it's false.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">ITTT</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_kit_ittt</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">ittt</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>Language elements can similarly be activated or deactivated, though the
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>Language elements can similarly be activated or deactivated, though the
|
||||
latter may not be useful in practice:
|
||||
</p>
|
||||
|
||||
|
@ -280,7 +280,7 @@ latter may not be useful in practice:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">EA</span><span class="plain-syntax">, </span><span class="reserved-syntax">element_activation</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">activations</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. The kits included by a project. </b>A project can call this to obtain the <span class="extract"><span class="extract-syntax">inform_kit</span></span> structure for the copy of
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. The kits included by a project. </b>A project can call this to obtain the <span class="extract"><span class="extract-syntax">inform_kit</span></span> structure for the copy of
|
||||
a kit, going only on a name such as <span class="extract"><span class="extract-syntax">BasicInformKit</span></span>:
|
||||
</p>
|
||||
|
||||
|
@ -294,7 +294,7 @@ a kit, going only on a name such as <span class="extract"><span class="extract-s
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-km.html#SP3" class="function-link"><span class="function-syntax">KitManager::from_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>The ITTT process for a project calls this to see if the ITTT rules for
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>The ITTT process for a project calls this to see if the ITTT rules for
|
||||
a <span class="extract"><span class="extract-syntax">K</span></span> require further kit dependencies to be added to the project: if they
|
||||
do, then the dependencies are added and we return <span class="extract"><span class="extract-syntax">TRUE</span></span>. If there was
|
||||
nothing to do, we return <span class="extract"><span class="extract-syntax">FALSE</span></span>.
|
||||
|
@ -314,7 +314,7 @@ nothing to do, we return <span class="extract"><span class="extract-syntax">FALS
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">changes_made</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. Kind definitions. </b>The base kinds for the Inform language, such as "real number" or "text", are
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Kind definitions. </b>The base kinds for the Inform language, such as "real number" or "text", are
|
||||
not defined in high-level source text, nor by Inter, but by special configuration
|
||||
files held in the <span class="extract"><span class="extract-syntax">kinds</span></span> subdirectory of the kits used. The following function
|
||||
loads the base kinds in a kit <span class="extract"><span class="extract-syntax">K</span></span>:
|
||||
|
@ -328,12 +328,12 @@ loads the base kinds in a kit <span class="extract"><span class="extract-syntax"
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">location_if_path</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"kinds"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Filenames::in</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">segment</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Loading kinds definitions from %f\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I6T::interpret_kindt</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">I6T::interpret_neptune</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. Language element activation. </b>Note that this function is meaningful only when this module is part of the
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Language element activation. </b>Note that this function is meaningful only when this module is part of the
|
||||
<span class="extract"><span class="extract-syntax">inform7</span></span> executable, and it invites us to activate or deactivate language
|
||||
features as <span class="extract"><span class="extract-syntax">K</span></span> would like.
|
||||
</p>
|
||||
|
@ -358,7 +358,7 @@ features as <span class="extract"><span class="extract-syntax">K</span></span> w
|
|||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. Early source. </b>As we have seen, kits can ask for extensions to be included.
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. Early source. </b>As we have seen, kits can ask for extensions to be included.
|
||||
</p>
|
||||
|
||||
<p class="commentary">As a last resort, a kit can also ask for a sentence or two to be mandatorily
|
||||
|
@ -392,7 +392,7 @@ into the lexer by our caller.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_paths</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. Build graph. </b>The build graph for a kit is quite extensive, since a kit contains Inter
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Build graph. </b>The build graph for a kit is quite extensive, since a kit contains Inter
|
||||
binaries for four different architectures; and each of those has a
|
||||
dependency on every section file of the web of Inform 6 source for the kit.
|
||||
If there are \(S\) sections then the graph has \(S+5\) vertices and \(4(S+1)\) edges.
|
||||
|
@ -425,7 +425,7 @@ not ours.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ks.html#SP13_4" class="named-paragraph-link"><span class="named-paragraph">Add use edges from the kit vertex to each extension it asks to include</span><span class="named-paragraph-number">13.4</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13_1"></a><b>§13.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges to the binaries for each architecture</span><span class="named-paragraph-number">13.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP13_1" class="paragraph-anchor"></a><b>§13.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges to the binaries for each architecture</span><span class="named-paragraph-number">13.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -438,7 +438,7 @@ not ours.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_2"></a><b>§13.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges from the binary vertices to the contents vertex</span><span class="named-paragraph-number">13.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP13_2" class="paragraph-anchor"></a><b>§13.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges from the binary vertices to the contents vertex</span><span class="named-paragraph-number">13.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -447,7 +447,7 @@ not ours.
|
|||
<span class="plain-syntax"> </span><a href="3-bg.html#SP4" class="function-link"><span class="function-syntax">Graphs::need_this_to_build</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">BV</span><span class="plain-syntax">, </span><span class="identifier-syntax">CV</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_3"></a><b>§13.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges from the binary vertices to each section vertex</span><span class="named-paragraph-number">13.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP13_3" class="paragraph-anchor"></a><b>§13.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add build edges from the binary vertices to each section vertex</span><span class="named-paragraph-number">13.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -464,7 +464,7 @@ not ours.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ks.html#SP13">§13</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13_4"></a><b>§13.4. </b>Suppose our kit wants to include Locksmith by Emily Short. If that's an
|
||||
<p class="commentary firstcommentary"><a id="SP13_4" class="paragraph-anchor"></a><b>§13.4. </b>Suppose our kit wants to include Locksmith by Emily Short. If that's an
|
||||
extension we have already read in, we can place a use edge to its existing
|
||||
build vertex. If not, the best we can do is a use edge to a requirement
|
||||
vertex, i.e., to a vertex meaning "we would like Locksmith but can't find it".
|
||||
|
|
|
@ -69,7 +69,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="5-ls.html#SP1">§1. Scanning metadata</a></li><li><a href="5-ls.html#SP5">§5. Logging</a></li><li><a href="5-ls.html#SP6">§6. Language code</a></li><li><a href="5-ls.html#SP7">§7. Kit</a></li><li><a href="5-ls.html#SP8">§8. Finding by name</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>Metadata for natural languages is stored in the following structure.
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>Metadata for natural languages is stored in the following structure.
|
||||
Inform can read and write text in multiple natural languages, though it
|
||||
needs help to do so: each natural language known to Inform comes from a
|
||||
small resource folder called its "bundle". (This includes English.)
|
||||
|
@ -87,7 +87,7 @@ small resource folder called its "bundle". (This includes English.)
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_language</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_language is accessed in 1/sm, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 5/es, 5/ks, 5/ps, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 7/dct, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -110,7 +110,7 @@ small resource folder called its "bundle". (This includes English.)
|
|||
<span class="plain-syntax"> </span><a href="5-ls.html#SP4" class="function-link"><span class="function-syntax">Languages::path_to_bundle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1"></a><b>§2.1. </b>Within the bundle folder is a file called <span class="extract"><span class="extract-syntax">about.txt</span></span>, which sets numbered
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b>Within the bundle folder is a file called <span class="extract"><span class="extract-syntax">about.txt</span></span>, which sets numbered
|
||||
fields to excerpts of text. The following are the field numbers:
|
||||
</p>
|
||||
|
||||
|
@ -122,7 +122,7 @@ fields to excerpts of text. The following are the field numbers:
|
|||
<span class="definition-keyword">define</span> <span class="constant-syntax">KIT_LFIELD</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax"> </span><span class="comment-syntax"> e.g. "GermanLanguageKit"</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_LANGUAGE_FIELDS</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax"> </span><span class="comment-syntax"> one more than the highest number above</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2"></a><b>§2.2. </b>If we can't find the file, it doesn't matter except that all of the excerpts
|
||||
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>§2.2. </b>If we can't find the file, it doesn't matter except that all of the excerpts
|
||||
remain empty. But we may as well tell the debugging log.
|
||||
</p>
|
||||
|
||||
|
@ -139,7 +139,7 @@ remain empty. But we may as well tell the debugging log.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Can't find about file: %f\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">about_file</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ls.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The format of the file is very simple. Each line is introduced by a number
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The format of the file is very simple. Each line is introduced by a number
|
||||
from 1 to <span class="extract"><span class="extract-syntax">MAX_LANGUAGE_FIELDS</span></span> minus one, and then contains text which
|
||||
extends for the rest of the line.
|
||||
</p>
|
||||
|
@ -161,14 +161,14 @@ extends for the rest of the line.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="function-syntax">Languages::path_to_bundle</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">Languages::path_to_bundle</span></span>:<br/><a href="5-ls.html#SP2">§2</a>, <a href="5-ls.html#SP2_2">§2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inform_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">location_if_path</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Logging. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Logging. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Languages::log</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">Languages::log</span></span>:<br/>Supervisor Module - <a href="1-sm.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opts</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vL</span><span class="plain-syntax">) {</span>
|
||||
|
@ -177,7 +177,7 @@ extends for the rest of the line.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="identifier-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">); }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Language code. </b>This is used when we write the bibliographic data for the work of IF we're
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Language code. </b>This is used when we write the bibliographic data for the work of IF we're
|
||||
making; this enables online databases like IFDB, and smart interpreters, to
|
||||
detect the language of play for a story file without actually running it.
|
||||
</p>
|
||||
|
@ -192,7 +192,7 @@ detect the language of play for a story file without actually running it.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"en"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Kit. </b>Each language needs its own kit of Inter code, named as follows:
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Kit. </b>Each language needs its own kit of Inter code, named as follows:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -205,7 +205,7 @@ detect the language of play for a story file without actually running it.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Finding by name. </b>Given the name of a natural language (e.g., "German") we find the
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Finding by name. </b>Given the name of a natural language (e.g., "German") we find the
|
||||
corresponding definition. That will mean searching for a copy, and that
|
||||
raises the question of where to look — in particular, it's important to
|
||||
include the Materials folder for any relevant project.
|
||||
|
@ -222,7 +222,7 @@ include the Materials folder for any relevant project.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>This function is called only from Preform...
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>This function is called only from Preform...
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_LANGUAGE_FROM_NAME_WORDS_CALLBACK</span><span class="plain-syntax"> </span><a href="5-ls.html#SP9" class="function-link"><span class="function-syntax">Languages::Preform_find</span></a>
|
||||
|
@ -232,7 +232,7 @@ include the Materials folder for any relevant project.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-ls.html#SP10" class="function-link"><span class="function-syntax">Languages::find_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_list_for_Preform_callback</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>...but this one is more generally available.
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>...but this one is more generally available.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -244,7 +244,7 @@ include the Materials folder for any relevant project.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>Finally, the following Preform nonterminal matches the English-language
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>Finally, the following Preform nonterminal matches the English-language
|
||||
name of a language: for example, "French". Unlike the above functions, it
|
||||
looks only at languages already loaded, and doesn't scan nests for more.
|
||||
</p>
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="5-ps.html#SP1">§1. Scanning metadata</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>Metadata for pipelines — or rather, the complete lack of same — is stored
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>Metadata for pipelines — or rather, the complete lack of same — is stored
|
||||
in the following structure.
|
||||
</p>
|
||||
|
||||
|
@ -80,7 +80,7 @@ in the following structure.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_pipeline</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_pipeline is accessed in 1/sm, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 5/es, 5/ks, 5/ls, 5/ps2, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 6/vmg, 7/dct, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="5-ps2.html#SP1">§1. Scanning metadata</a></li><li><a href="5-ps2.html#SP6">§6. Files of source text</a></li><li><a href="5-ps2.html#SP9">§9. The project's languages</a></li><li><a href="5-ps2.html#SP13">§13. Miscellaneous metadata</a></li><li><a href="5-ps2.html#SP14">§14. Kit dependencies</a></li><li><a href="5-ps2.html#SP18">§18. Things to do with kits</a></li><li><a href="5-ps2.html#SP24">§24. The full graph</a></li><li><a href="5-ps2.html#SP27">§27. Reading the source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>Metadata for pipelines — or rather, the complete lack of same — is stored
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>Metadata for pipelines — or rather, the complete lack of same — is stored
|
||||
in the following structure.
|
||||
</p>
|
||||
|
||||
|
@ -96,7 +96,7 @@ in the following structure.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_project</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_project is accessed in 1/sm, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/pbm, 4/pfm, 5/es, 5/ks, 5/ls, 5/ps, 5/ts, 6/st, 6/hdn, 6/tbs, 6/inc, 6/vmg, 7/tm, 7/dct, 7/cns, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
It doesn't actually do any scanning to speak of, in fact: we may eventually
|
||||
learn a lot about the project, but for now we simply initialise to bland
|
||||
placeholders.
|
||||
|
@ -136,7 +136,7 @@ placeholders.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="identifier-syntax">extensions_included</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>The materials folder sits alongside the project and has the same name,
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The materials folder sits alongside the project and has the same name,
|
||||
but ending <span class="extract"><span class="extract-syntax">.materials</span></span> instead of <span class="extract"><span class="extract-syntax">.inform</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -155,7 +155,7 @@ but ending <span class="extract"><span class="extract-syntax">.materials</span><
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">materials</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>The file-system path to the project. For a "bundle" made by the Inform GUI
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>The file-system path to the project. For a "bundle" made by the Inform GUI
|
||||
apps, the bundle itself is a directory (even if this is concealed from the
|
||||
user on macOS) and the following returns that path. For a loose file of
|
||||
Inform source text, it's the directory in which the file is found. (This is
|
||||
|
@ -187,7 +187,7 @@ is small, but one likes to minimise the effect of the CWD.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">materials_nest</span><span class="plain-syntax">-></span><span class="identifier-syntax">location</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>Each project has its own search list of nests, but this always consists of,
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>Each project has its own search list of nests, but this always consists of,
|
||||
first, its own Materials nest, and then the shared search list. For timing
|
||||
reasons, this list is created on demand.
|
||||
</p>
|
||||
|
@ -206,7 +206,7 @@ reasons, this list is created on demand.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">search_list</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Files of source text. </b>A project can have multiple files of I7 source text, but more usually it
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Files of source text. </b>A project can have multiple files of I7 source text, but more usually it
|
||||
has a single, "primary", one.
|
||||
</p>
|
||||
|
||||
|
@ -215,7 +215,7 @@ has a single, "primary", one.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="identifier-syntax">primary_source</span><span class="plain-syntax"> = </span><span class="identifier-syntax">F</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>The following constructs the list of "source vertices" — vertices in the
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The following constructs the list of "source vertices" — vertices in the
|
||||
build graph representing the source files — on demand. The reason this isn't
|
||||
done automatically when the <span class="extract"><span class="extract-syntax">proj</span></span> is created is that we needed to give time
|
||||
for someone to call <a href="5-ps2.html#SP6" class="internal">Projects::set_primary_source</a>, since that will affect
|
||||
|
@ -234,7 +234,7 @@ the outcome.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">source_vertices</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try a set of source files from the Source subdirectory of Materials</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try a set of source files from the Source subdirectory of Materials</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -255,7 +255,7 @@ the outcome.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>§7.2. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Projects::manifest_helper</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">Projects::manifest_helper</span></span>:<br/><a href="5-ps2.html#SP7_1">§7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
|
||||
|
@ -266,7 +266,7 @@ the outcome.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">text</span><span class="plain-syntax">), </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_3"></a><b>§7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try the source file set at the command line, if any was</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>§7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try the source file set at the command line, if any was</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -277,7 +277,7 @@ the outcome.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_4"></a><b>§7.4. </b>If a bundle is found, then by default the source text within it is called
|
||||
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>§7.4. </b>If a bundle is found, then by default the source text within it is called
|
||||
<span class="extract"><span class="extract-syntax">story.ni</span></span>. The <span class="extract"><span class="extract-syntax">.ni</span></span> is an anachronism now, but at one time stood for
|
||||
"natural Inform", the working title for Inform 7 in the early 2000s.
|
||||
</p>
|
||||
|
@ -296,7 +296,7 @@ the outcome.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax">, </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">source_vertices</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>The <a href="../inform7/index.html" class="internal">inform7</a> compiler sometimes wants to know whether a particular
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>The <a href="../inform7/index.html" class="internal">inform7</a> compiler sometimes wants to know whether a particular
|
||||
source file belongs to the project or not, so:
|
||||
</p>
|
||||
|
||||
|
@ -312,7 +312,7 @@ source file belongs to the project or not, so:
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. The project's languages. </b>Inform's ability to work outside of English is limited, at present, but for
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. The project's languages. </b>Inform's ability to work outside of English is limited, at present, but for
|
||||
the sake of future improvements we want to distinguish three uses of natural
|
||||
language. In principle, a project could use different languages for each of
|
||||
these.
|
||||
|
@ -332,7 +332,7 @@ at run-time.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">language_of_play</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Second, the "language of index" is the one in which the Index of a project is
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Second, the "language of index" is the one in which the Index of a project is
|
||||
written.
|
||||
</p>
|
||||
|
||||
|
@ -346,7 +346,7 @@ written.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">language_of_index</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>Third, the "language of syntax" is the one in which the source text of a
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>Third, the "language of syntax" is the one in which the source text of a
|
||||
project is written. For the Basic Inform extension, for example, it is English.
|
||||
</p>
|
||||
|
||||
|
@ -360,7 +360,7 @@ project is written. For the Basic Inform extension, for example, it is English.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">language_of_syntax</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>And this is where these are decided.
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>And this is where these are decided.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -374,7 +374,7 @@ project is written. For the Basic Inform extension, for example, it is English.
|
|||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"built-in English language definition can't be found"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. Miscellaneous metadata. </b>The following function transfers some of the command-line options into settings
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Miscellaneous metadata. </b>The following function transfers some of the command-line options into settings
|
||||
for a specific project.
|
||||
</p>
|
||||
|
||||
|
@ -398,7 +398,7 @@ and that means it's not beneath our notice.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">compile_for_release</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. Kit dependencies. </b>It is a practical impossibility to compile a story file without at least one
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. Kit dependencies. </b>It is a practical impossibility to compile a story file without at least one
|
||||
kit of pre-compiled Inter to merge into it, so all projects will depend on
|
||||
at least one kit, and probably several.
|
||||
</p>
|
||||
|
@ -412,7 +412,7 @@ at least one kit, and probably several.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">kit_dependency</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure kit_dependency is accessed in 3/is2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Projects::add_kit_dependency</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">Projects::add_kit_dependency</span></span>:<br/><a href="5-ps2.html#SP17_1">§17.1</a><br/>Inbuild Control - <a href="1-ic.html#SP19">§19</a><br/>Kit Services - <a href="5-ks.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inform_project</span><span class="plain-syntax"> *</span><span class="identifier-syntax">project</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kit_name</span><span class="plain-syntax">,</span>
|
||||
|
@ -425,7 +425,7 @@ at least one kit, and probably several.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">kd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kit_dependency</span><span class="plain-syntax">, </span><span class="identifier-syntax">project</span><span class="plain-syntax">-></span><span class="element-syntax">kits_to_include</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. </b>This can also be used to test on the fly:
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>This can also be used to test on the fly:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -437,7 +437,7 @@ at least one kit, and probably several.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. </b>Here's where we decide which kits are included.
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>Here's where we decide which kits are included.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -449,7 +449,7 @@ at least one kit, and probably several.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ps2.html#SP17_4" class="named-paragraph-link"><span class="named-paragraph">Log what the dependencies actually were</span><span class="named-paragraph-number">17.4</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1"></a><b>§17.1. </b>At this point <a href="1-ic.html" class="internal">Inbuild Control</a> has called <a href="5-ps2.html#SP15" class="internal">Projects::add_kit_dependency</a>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1" class="paragraph-anchor"></a><b>§17.1. </b>At this point <a href="1-ic.html" class="internal">Inbuild Control</a> has called <a href="5-ps2.html#SP15" class="internal">Projects::add_kit_dependency</a>
|
||||
for any <span class="extract"><span class="extract-syntax">-kit</span></span> options used at the command line, but otherwise no kits have been
|
||||
depended.
|
||||
</p>
|
||||
|
@ -474,7 +474,7 @@ on <a href="../WorldModelKit/index.html" class="internal">WorldModelKit</a>, thr
|
|||
<span class="plain-syntax"> </span><a href="5-ps2.html#SP15" class="function-link"><span class="function-syntax">Projects::add_kit_dependency</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">project</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"CommandParserKit"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_2"></a><b>§17.2. </b>We perform this first with <span class="extract"><span class="extract-syntax">parity</span></span> being <span class="extract"><span class="extract-syntax">TRUE</span></span>, then <span class="extract"><span class="extract-syntax">FALSE</span></span>.
|
||||
<p class="commentary firstcommentary"><a id="SP17_2" class="paragraph-anchor"></a><b>§17.2. </b>We perform this first with <span class="extract"><span class="extract-syntax">parity</span></span> being <span class="extract"><span class="extract-syntax">TRUE</span></span>, then <span class="extract"><span class="extract-syntax">FALSE</span></span>.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Perform if-this-then-that</span><span class="named-paragraph-number">17.2</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -491,7 +491,7 @@ on <a href="../WorldModelKit/index.html" class="internal">WorldModelKit</a>, thr
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP17">§17</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_3"></a><b>§17.3. </b>Lower-priority kits are merged into the Inter tree before higher ones,
|
||||
<p class="commentary firstcommentary"><a id="SP17_3" class="paragraph-anchor"></a><b>§17.3. </b>Lower-priority kits are merged into the Inter tree before higher ones,
|
||||
because of the following sort:
|
||||
</p>
|
||||
|
||||
|
@ -509,7 +509,7 @@ because of the following sort:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">project</span><span class="plain-syntax">-></span><span class="element-syntax">kits_to_include</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sorted</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_4"></a><b>§17.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Log what the dependencies actually were</span><span class="named-paragraph-number">17.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP17_4" class="paragraph-anchor"></a><b>§17.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Log what the dependencies actually were</span><span class="named-paragraph-number">17.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -519,7 +519,7 @@ because of the following sort:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">kd</span><span class="plain-syntax">-></span><span class="element-syntax">kit</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">, </span><span class="identifier-syntax">kd</span><span class="plain-syntax">-></span><span class="element-syntax">kit</span><span class="plain-syntax">-></span><span class="element-syntax">priority</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. Things to do with kits. </b>First up: these internal configuration files set up what "text" and "real number"
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. Things to do with kits. </b>First up: these internal configuration files set up what "text" and "real number"
|
||||
mean, for example, and are optionally included in kits. The following
|
||||
reads them in for every kit which is included in the project.
|
||||
</p>
|
||||
|
@ -533,7 +533,7 @@ reads them in for every kit which is included in the project.
|
|||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19"></a><b>§19. </b>Next, language element activation: this too is decided by kits.
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. </b>Next, language element activation: this too is decided by kits.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -549,7 +549,7 @@ reads them in for every kit which is included in the project.
|
|||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP20"></a><b>§20. </b>And so is the question of whether the compiler is expected to compile a
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. </b>And so is the question of whether the compiler is expected to compile a
|
||||
<span class="extract"><span class="extract-syntax">Main</span></span> function, or whether one has already been included in one of the kits.
|
||||
</p>
|
||||
|
||||
|
@ -562,7 +562,7 @@ reads them in for every kit which is included in the project.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP21"></a><b>§21. </b>The "index structure" is a kind of layout specification for the project
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. </b>The "index structure" is a kind of layout specification for the project
|
||||
Index. Last kit wins:
|
||||
</p>
|
||||
|
||||
|
@ -576,7 +576,7 @@ Index. Last kit wins:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP22"></a><b>§22. </b>Every source text read into Inform is automatically prefixed by a few words
|
||||
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>§22. </b>Every source text read into Inform is automatically prefixed by a few words
|
||||
loading the fundamental "extensions" — text such as "Include Basic Inform by
|
||||
Graham Nelson." If Inform were a computer, this would be the BIOS which boots
|
||||
up its operating system. Each kit can contribute such extensions, so there
|
||||
|
@ -590,7 +590,7 @@ may be multiple sentences, which we need to count up.
|
|||
<span class="plain-syntax"> </span><a href="5-ks.html#SP12" class="function-link"><span class="function-syntax">Kits::early_source_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">kd</span><span class="plain-syntax">-></span><span class="element-syntax">kit</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP23"></a><b>§23. </b>The following is for passing requests to <a href="../inter/index.html" class="internal">inter</a>, which does not contain
|
||||
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>§23. </b>The following is for passing requests to <a href="../inter/index.html" class="internal">inter</a>, which does not contain
|
||||
<a href="index.html" class="internal">supervisor</a>, and so doesn't use the data structure <a href="5-ks.html#SP1" class="internal">inform_kit</a>. That
|
||||
means we can't give it a list of kits: we have to give it a list of their
|
||||
details instead.
|
||||
|
@ -611,7 +611,7 @@ details instead.
|
|||
<span class="plain-syntax">}</span>
|
||||
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP24"></a><b>§24. The full graph. </b>This can be quite grandiose even though most of it will never come to anything,
|
||||
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>§24. The full graph. </b>This can be quite grandiose even though most of it will never come to anything,
|
||||
rather like a family tree for a minor European royal family.
|
||||
</p>
|
||||
|
||||
|
@ -628,7 +628,7 @@ rather like a family tree for a minor European royal family.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP24_1"></a><b>§24.1. </b>So the structure here is a simple chain of dependencies, but note that
|
||||
<p class="commentary firstcommentary"><a id="SP24_1" class="paragraph-anchor"></a><b>§24.1. </b>So the structure here is a simple chain of dependencies, but note that
|
||||
they are upstream of the project's vertex <span class="extract"><span class="extract-syntax">V</span></span>, not downstream:
|
||||
</p>
|
||||
|
||||
|
@ -723,7 +723,7 @@ elaborate use of <a href="../inblorb/index.html" class="internal">inblorb</a> to
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">chosen_build_target</span><span class="plain-syntax"> = </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">unblorbed_vertex</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2"></a><b>§24.2. </b>The graph also extends downstream of <span class="extract"><span class="extract-syntax">V</span></span>, representing the things we will
|
||||
<p class="commentary firstcommentary"><a id="SP24_2" class="paragraph-anchor"></a><b>§24.2. </b>The graph also extends downstream of <span class="extract"><span class="extract-syntax">V</span></span>, representing the things we will
|
||||
need before we can run <a href="../inform7/index.html" class="internal">inform7</a> on the project: and this is not a linear
|
||||
run of arrows at all, but fans considerably outwards — to its languages,
|
||||
kits and extensions, and then to their dependencies in turn.
|
||||
|
@ -742,7 +742,7 @@ the project: that's because <a href="2-cps.html#SP7" class="internal">Copies::ge
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ps2.html#SP24_2_3" class="named-paragraph-link"><span class="named-paragraph">The project depends on the languages it is written in</span><span class="named-paragraph-number">24.2.3</span></a></span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP24">§24</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_1"></a><b>§24.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on its source text</span><span class="named-paragraph-number">24.2.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_1" class="paragraph-anchor"></a><b>§24.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on its source text</span><span class="named-paragraph-number">24.2.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -751,7 +751,7 @@ the project: that's because <a href="2-cps.html#SP7" class="internal">Copies::ge
|
|||
<span class="plain-syntax"> </span><a href="3-bg.html#SP4" class="function-link"><span class="function-syntax">Graphs::need_this_to_build</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP24_2">§24.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_2"></a><b>§24.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on the kits it includes</span><span class="named-paragraph-number">24.2.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_2" class="paragraph-anchor"></a><b>§24.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on the kits it includes</span><span class="named-paragraph-number">24.2.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -761,7 +761,7 @@ the project: that's because <a href="2-cps.html#SP7" class="internal">Copies::ge
|
|||
<span class="plain-syntax"> </span><a href="5-ps2.html#SP25" class="function-link"><span class="function-syntax">Projects::graph_dependent_kit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">kd</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP24_2">§24.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_3"></a><b>§24.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on the languages it is written in</span><span class="named-paragraph-number">24.2.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP24_2_3" class="paragraph-anchor"></a><b>§24.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The project depends on the languages it is written in</span><span class="named-paragraph-number">24.2.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -773,7 +773,7 @@ the project: that's because <a href="2-cps.html#SP7" class="internal">Copies::ge
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">) </span><a href="5-ps2.html#SP25" class="function-link"><span class="function-syntax">Projects::graph_dependent_language</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP24_2">§24.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP25"></a><b>§25. </b>The point of these two functions is that if A uses B which uses C then we
|
||||
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>§25. </b>The point of these two functions is that if A uses B which uses C then we
|
||||
want the dependencies <span class="extract"><span class="extract-syntax">A -> B -> C</span></span> rather than <span class="extract"><span class="extract-syntax">A -> B</span></span> together with <span class="extract"><span class="extract-syntax">A -> C</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -800,7 +800,7 @@ want the dependencies <span class="extract"><span class="extract-syntax">A ->
|
|||
<span class="plain-syntax"> </span><a href="5-ps2.html#SP25" class="function-link"><span class="function-syntax">Projects::graph_dependent_kit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">LV</span><span class="plain-syntax">, </span><span class="identifier-syntax">kd2</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP26"></a><b>§26. </b>One last task. It's unlikely, but possible, that an extension has been
|
||||
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>§26. </b>One last task. It's unlikely, but possible, that an extension has been
|
||||
included in a project twice, for different reasons, but that the two
|
||||
inclusions have requirements about the extension's version which can't
|
||||
both be met. Therefore we run through the downstream vertices and check
|
||||
|
@ -829,7 +829,7 @@ each extension against the intersection of all requirements put on it:
|
|||
<span class="plain-syntax"> </span><a href="5-ps2.html#SP26" class="function-link"><span class="function-syntax">Projects::check_extension_versions_d</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP27"></a><b>§27. Reading the source text. </b>We cannot know what extensions a project needs without reading its source
|
||||
<p class="commentary firstcommentary"><a id="SP27" class="paragraph-anchor"></a><b>§27. Reading the source text. </b>We cannot know what extensions a project needs without reading its source
|
||||
text, where the Include... sentences are, and of course we cannot parse the
|
||||
source text to find those unless the Preform grammar is in place.
|
||||
</p>
|
||||
|
@ -873,7 +873,7 @@ for the extensions they refer to, in a post-processing phase.
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP27_1"></a><b>§27.1. </b>Under the "Implied inclusions" heading come sentences to include the
|
||||
<p class="commentary firstcommentary"><a id="SP27_1" class="paragraph-anchor"></a><b>§27.1. </b>Under the "Implied inclusions" heading come sentences to include the
|
||||
extensions required by kits but not explicitly asked for in source text,
|
||||
like Basic Inform or Standard Rules; and also any sentences in the
|
||||
<span class="extract"><span class="extract-syntax">Options.txt</span></span> file, if the user has one.
|
||||
|
@ -904,7 +904,7 @@ like Basic Inform or Standard Rules; and also any sentences in the
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::pop_bud</span><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">l</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP27">§27</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP27_2"></a><b>§27.2. </b>We don't need to make an implied heading here, because the sentence-breaker
|
||||
<p class="commentary firstcommentary"><a id="SP27_2" class="paragraph-anchor"></a><b>§27.2. </b>We don't need to make an implied heading here, because the sentence-breaker
|
||||
in the <a href="../syntax-module/index.html" class="internal">syntax</a> module does that automatically whenever it detects source
|
||||
text originating in a different file; which, of course, will now happen, since
|
||||
up to now the source text hasn't come from a file at all.
|
||||
|
@ -938,7 +938,7 @@ it comes.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::pop_bud</span><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">l</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP27">§27</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP27_3"></a><b>§27.3. </b>Inventions are when the <a href="../inform7/index.html" class="internal">inform7</a> compiler makes up extra sentences, not
|
||||
<p class="commentary firstcommentary"><a id="SP27_3" class="paragraph-anchor"></a><b>§27.3. </b>Inventions are when the <a href="../inform7/index.html" class="internal">inform7</a> compiler makes up extra sentences, not
|
||||
in the source text as such. They all go under the following implied heading.
|
||||
Note that we leave the tree with its attachment point under this heading,
|
||||
ready for those inventions (if in fact there are any).
|
||||
|
@ -958,7 +958,7 @@ ready for those inventions (if in fact there are any).
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::push_bud</span><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-></span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax">); </span><span class="comment-syntax"> never popped</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ps2.html#SP27">§27</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP27_4"></a><b>§27.4. </b>The ordering here is, as so often in this section of code, important. We
|
||||
<p class="commentary firstcommentary"><a id="SP27_4" class="paragraph-anchor"></a><b>§27.4. </b>The ordering here is, as so often in this section of code, important. We
|
||||
have to know which language elements are in use before we can safely look
|
||||
for Include... sentences, because some of those sentences are conditional
|
||||
on that. We have to perform the tree surgery asked for by Include... in
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="5-ts.html#SP1">§1. Scanning metadata</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Scanning metadata. </b>Metadata for website templates — or rather, the complete lack of same — is
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Scanning metadata. </b>Metadata for website templates — or rather, the complete lack of same — is
|
||||
stored in the following structure.
|
||||
</p>
|
||||
|
||||
|
@ -80,7 +80,7 @@ stored in the following structure.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">inform_template</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure inform_template is accessed in 1/sm, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 5/es, 5/ks, 5/ls, 5/ps, 5/ps2, 6/st, 6/hdn, 6/tbs, 6/inc, 6/vmg, 7/dct, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>This is called as soon as a new copy <span class="extract"><span class="extract-syntax">C</span></span> of the language genre is created.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -67,7 +67,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Control Structures</b></li></ul></div>
|
||||
<p class="purpose">To specify the syntax of control structures such as repeat, if and otherwise.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>Certain phrases are "control structures": otherwise, if, repeat, while and
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Certain phrases are "control structures": otherwise, if, repeat, while and
|
||||
so on. These have different expectations in terms of the layout of surrounding
|
||||
phrases in rule or phrase definitions, and the following structure defines
|
||||
the relevant behaviour. (The contents are static.)
|
||||
|
@ -88,7 +88,7 @@ the relevant behaviour. (The contents are static.)
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">control_structure_phrase</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure control_structure_phrase is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">control_structure_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ControlStructures::new</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">ControlStructures::new</span></span>:<br/><a href="6-cs.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mnemonic</span><span class="plain-syntax">) {</span>
|
||||
|
@ -105,7 +105,7 @@ the relevant behaviour. (The contents are static.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">csp</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Some cryptic mnemonics for logging the invocation tree:
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Some cryptic mnemonics for logging the invocation tree:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -114,7 +114,7 @@ the relevant behaviour. (The contents are static.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">csp</span><span class="plain-syntax">-></span><span class="element-syntax">mnemonic</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>The following set is built in to the Inform language; Basic Inform and such
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>The following set is built in to the Inform language; Basic Inform and such
|
||||
extensions cannot extend it.
|
||||
</p>
|
||||
|
||||
|
@ -124,7 +124,7 @@ extensions cannot extend it.
|
|||
<span class="plain-syntax"> *</span><span class="identifier-syntax">otherwise_if_CSP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">default_case_CSP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">case_CSP</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">say_CSP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">now_CSP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">instead_CSP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>And this is where they are all created:
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And this is where they are all created:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -177,7 +177,7 @@ extensions cannot extend it.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">instead_CSP</span><span class="plain-syntax"> = </span><a href="6-cs.html#SP2" class="function-link"><span class="function-syntax">ControlStructures::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"INS"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>Control structures such as "if" act as a sort of super-punctuation inside
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Control structures such as "if" act as a sort of super-punctuation inside
|
||||
rule and phrase definitions, and in particular they affect the actual
|
||||
punctuation of the sentences there (consider the rules about colons versus
|
||||
semicolons). So, though it's still early in Inform's run, we need to seek
|
||||
|
@ -216,7 +216,7 @@ overlapping with this, and they need to match.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">now</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"> { NOW_SIGF, - }</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>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>This is used to see if an "if" is being used with the comma notation:
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>This is used to see if an "if" is being used with the comma notation:
|
||||
</p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
|
@ -224,7 +224,7 @@ overlapping with this, and they need to match.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</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>
|
||||
</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>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>This is used to see if an "if" is being used with the comma notation:
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>This is used to see if an "if" is being used with the comma notation:
|
||||
</p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
|
@ -233,7 +233,7 @@ overlapping with this, and they need to match.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">instead</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>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>Finally, this is used to see if a control structure opens a block:
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>Finally, this is used to see if a control structure opens a block:
|
||||
</p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
|
@ -241,7 +241,7 @@ overlapping with this, and they need to match.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">begin</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>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>And some miscellaneous provisions:
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>And some miscellaneous provisions:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -83,7 +83,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="6-hdn.html#SP1">§1. The hierarchy</a></li><li><a href="6-hdn.html#SP4">§4. Heading trees</a></li><li><a href="6-hdn.html#SP6">§6. Heading metadata</a></li><li><a href="6-hdn.html#SP8">§8. Declarations</a></li><li><a href="6-hdn.html#SP14">§14. The heading tree</a></li><li><a href="6-hdn.html#SP16">§16. Verifying the heading tree</a></li><li><a href="6-hdn.html#SP17">§17. Falling under headings</a></li><li><a href="6-hdn.html#SP18">§18. Miscellaneous other services</a></li><li><a href="6-hdn.html#SP21">§21. Headings with extension dependencies</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. The hierarchy. </b>Headings in the source text correspond to <span class="extract"><span class="extract-syntax">HEADING_NT</span></span> nodes in syntax
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. The hierarchy. </b>Headings in the source text correspond to <span class="extract"><span class="extract-syntax">HEADING_NT</span></span> nodes in syntax
|
||||
trees, and mostly occur when the user has explicitly typed a heading such as:
|
||||
</p>
|
||||
|
||||
|
@ -111,7 +111,7 @@ Compare these two sequences:
|
|||
affects the meaning of the program.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Headings therefore have a numbered "level" of importance, with lower numbers
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Headings therefore have a numbered "level" of importance, with lower numbers
|
||||
more important than higher. The hierarchy runs:
|
||||
</p>
|
||||
|
||||
|
@ -131,7 +131,7 @@ are currently unused.
|
|||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NO_HEADING_LEVELS</span><span class="plain-syntax"> </span><span class="constant-syntax">10</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>As an example, a sequence in the primary source text of (Chapter I, Book
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>As an example, a sequence in the primary source text of (Chapter I, Book
|
||||
Two, Section 5, Chapter I, Section 1, Chapter III) would be formed up into
|
||||
the heading tree:
|
||||
</p>
|
||||
|
@ -155,7 +155,7 @@ tree, which we call the "indentation", and there is no simple relationship
|
|||
between the two numbers: see below for how it is calculated.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Heading trees. </b>Enough theory: now some practice. Each syntax tree also has a heading tree,
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Heading trees. </b>Enough theory: now some practice. Each syntax tree also has a heading tree,
|
||||
with one "pseudo-heading" (at notional level \(-1\)) as root. All nodes are
|
||||
instances of:
|
||||
</p>
|
||||
|
@ -194,7 +194,7 @@ instances of:
|
|||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure heading_tree is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>So now we calculate the indentation of a heading. The level \(\ell_n\) of a
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>So now we calculate the indentation of a heading. The level \(\ell_n\) of a
|
||||
heading depends only on its wording (or source file origin), but the indentation
|
||||
of the \(n\)th heading, \(i_n\), depends on \((\ell_1, \ell_2, ..., \ell_n)\), the
|
||||
sequence of all levels so far:
|
||||
|
@ -231,7 +231,7 @@ on each heading in sequence:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Heading metadata. </b>Each heading gets the following metadata:
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Heading metadata. </b>Each heading gets the following metadata:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -257,7 +257,7 @@ on each heading in sequence:
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">heading</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure heading is accessed in 1/sm, 3/bs2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>It is guaranteed that this will be called once for each heading (except the
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>It is guaranteed that this will be called once for each heading (except the
|
||||
pseudo-heading, which doesn't count) in sequence order:
|
||||
</p>
|
||||
|
||||
|
@ -281,7 +281,7 @@ pseudo-heading, which doesn't count) in sequence order:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">h</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Declarations. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> each time a new
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Declarations. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> each time a new
|
||||
<span class="extract"><span class="extract-syntax">HEADING_NT</span></span> node is created in the syntax tree for a project. It has to
|
||||
return <span class="extract"><span class="extract-syntax">TRUE</span></span> or <span class="extract"><span class="extract-syntax">FALSE</span></span> to say whether sentences falling under the current
|
||||
heading should be included in the project's source text. (For instance,
|
||||
|
@ -301,7 +301,7 @@ included if the target virtual machine on this run of Inform is the Z-machine.)
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b><a href="5-ps2.html#SP27" class="internal">Projects::read_source_text_for</a> also constructs implied super-headings
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b><a href="5-ps2.html#SP27" class="internal">Projects::read_source_text_for</a> also constructs implied super-headings
|
||||
which do not originate in the sentence-breaker, and which therefore need a
|
||||
different way in. (These are never skipped.)
|
||||
</p>
|
||||
|
@ -313,7 +313,7 @@ different way in. (These are never skipped.)
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">implied_heading_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Either way, we can always get back from the parse node to the heading:
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Either way, we can always get back from the parse node to the heading:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -321,7 +321,7 @@ different way in. (These are never skipped.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_embodying_heading</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>So, then, each <span class="extract"><span class="extract-syntax">HEADING_NT</span></span> node in the parse tree produces a call to this
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>So, then, each <span class="extract"><span class="extract-syntax">HEADING_NT</span></span> node in the parse tree produces a call to this
|
||||
function, which attaches a new <a href="6-hdn.html#SP6" class="internal">heading</a> object to it, and populates that
|
||||
with the result of parsing any caveats in its wording.
|
||||
</p>
|
||||
|
@ -350,7 +350,7 @@ with the result of parsing any caveats in its wording.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">h</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11_1"></a><b>§11.1. </b>And these are the aforementioned caveats:
|
||||
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>§11.1. </b>And these are the aforementioned caveats:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PLATFORM_UNMET_HQ</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span>
|
||||
|
@ -388,7 +388,7 @@ with the result of parsing any caveats in its wording.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">h</span><span class="plain-syntax">-></span><span class="element-syntax">for_use_with</span><span class="plain-syntax"> = </span><span class="identifier-syntax">work_identified</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP11">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>When a heading has been found, we repeatedly try to match it against
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>When a heading has been found, we repeatedly try to match it against
|
||||
<heading-qualifier> to see if it ends with text telling us what to do with
|
||||
the source text it governs. For example,
|
||||
</p>
|
||||
|
@ -439,7 +439,7 @@ allowed; they should probably be withdrawn.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">by</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="named-paragraph-container code-font"><a href="6-hdn.html#SP12_3" class="named-paragraph-link"><span class="named-paragraph">Set for-use-with extension identifier</span><span class="named-paragraph-number">12.3</span></a></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>
|
||||
<p class="commentary firstcommentary"><a id="SP12_1"></a><b>§12.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnknownLanguageElement problem</span><span class="named-paragraph-number">12.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP12_1" class="paragraph-anchor"></a><b>§12.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnknownLanguageElement problem</span><span class="named-paragraph-number">12.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -450,7 +450,7 @@ allowed; they should probably be withdrawn.
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12_2"></a><b>§12.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnknownVirtualMachine problem</span><span class="named-paragraph-number">12.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP12_2" class="paragraph-anchor"></a><b>§12.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnknownVirtualMachine problem</span><span class="named-paragraph-number">12.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -459,7 +459,7 @@ allowed; they should probably be withdrawn.
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-></span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12_3"></a><b>§12.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set for-use-with extension identifier</span><span class="named-paragraph-number">12.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP12_3" class="paragraph-anchor"></a><b>§12.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set for-use-with extension identifier</span><span class="named-paragraph-number">12.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -475,7 +475,7 @@ allowed; they should probably be withdrawn.
|
|||
<span class="plain-syntax"> ==> { </span><span class="identifier-syntax">R</span><span class="plain-syntax">[0] + </span><span class="constant-syntax">4</span><span class="plain-syntax">, - };</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>This nonterminal matches any description of a virtual machine, and produces
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>This nonterminal matches any description of a virtual machine, and produces
|
||||
the result <span class="extract"><span class="extract-syntax">TRUE</span></span> if the VM we are building for fits that description, <span class="extract"><span class="extract-syntax">FALSE</span></span>
|
||||
otherwise.
|
||||
</p>
|
||||
|
@ -492,7 +492,7 @@ otherwise.
|
|||
<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>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. The heading tree. </b>Until <a href="6-hdn.html#SP14" class="internal">Headings::assemble_tree</a> runs, the <a href="6-hdn.html#SP6" class="internal">heading</a> nodes listed as belonging
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. The heading tree. </b>Until <a href="6-hdn.html#SP14" class="internal">Headings::assemble_tree</a> runs, the <a href="6-hdn.html#SP6" class="internal">heading</a> nodes listed as belonging
|
||||
to the heading tree are not in fact formed up into a tree structure.
|
||||
</p>
|
||||
|
||||
|
@ -508,7 +508,7 @@ to the heading tree are not in fact formed up into a tree structure.
|
|||
<span class="plain-syntax"> </span><a href="6-hdn.html#SP16" class="function-link"><span class="function-syntax">Headings::verify_heading_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14_1"></a><b>§14.1. </b>It's possible to call <a href="6-hdn.html#SP14" class="internal">Headings::assemble_tree</a> more than once, to allow
|
||||
<p class="commentary firstcommentary"><a id="SP14_1" class="paragraph-anchor"></a><b>§14.1. </b>It's possible to call <a href="6-hdn.html#SP14" class="internal">Headings::assemble_tree</a> more than once, to allow
|
||||
for late news coming in (see <a href="6-hdn.html#SP11" class="internal">Headings::attach</a> above), so we always begin by
|
||||
disassembling the tree, and then we can be sure that we start from nothing.
|
||||
</p>
|
||||
|
@ -530,7 +530,7 @@ of subordinates. Everything else is.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP14">§14</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP14_2"></a><b>§14.2. </b>The idea of the heading loop is that when we place a heading, we also place
|
||||
<p class="commentary firstcommentary"><a id="SP14_2" class="paragraph-anchor"></a><b>§14.2. </b>The idea of the heading loop is that when we place a heading, we also place
|
||||
subsequent headings of lesser or equal status until we cannot do so any longer.
|
||||
That means that if we reach h and find that it has no parent, it must be
|
||||
subordinate to no earlier heading: thus, it must be attached to the pseudo-heading
|
||||
|
@ -545,7 +545,7 @@ at the top of the tree.
|
|||
<span class="plain-syntax"> </span><a href="6-hdn.html#SP15" class="function-link"><span class="function-syntax">Headings::move_below</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">h</span><span class="plain-syntax">, &(</span><span class="identifier-syntax">T</span><span class="plain-syntax">-></span><span class="identifier-syntax">headings</span><span class="plain-syntax">-></span><span class="element-syntax">heading_root</span><span class="plain-syntax">));</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP14">§14</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP14_3"></a><b>§14.3. </b>Note that the following could be summed up as "move subsequent headings as
|
||||
<p class="commentary firstcommentary"><a id="SP14_3" class="paragraph-anchor"></a><b>§14.3. </b>Note that the following could be summed up as "move subsequent headings as
|
||||
deep in the tree as we can see they need to be from h's perspective alone".
|
||||
This isn't always the final position. For instance, given the sequence
|
||||
Volume 1, Chapter I, Section A, Chapter II, the tree is adjusted twice:
|
||||
|
@ -580,7 +580,7 @@ runs in linear time.)
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP14">§14</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b>The above function, then, calls <span class="extract"><span class="extract-syntax">Headings::move_below</span></span> to attach a heading
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>The above function, then, calls <span class="extract"><span class="extract-syntax">Headings::move_below</span></span> to attach a heading
|
||||
to the tree as a child of a given parent:
|
||||
</p>
|
||||
|
||||
|
@ -593,7 +593,7 @@ to the tree as a child of a given parent:
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-hdn.html#SP15_2" class="named-paragraph-link"><span class="named-paragraph">Add ch to the end of the list of children of pa</span><span class="named-paragraph-number">15.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15_1"></a><b>§15.1. </b>If ch is present in the tree, it must have a parent, unless it is the
|
||||
<p class="commentary firstcommentary"><a id="SP15_1" class="paragraph-anchor"></a><b>§15.1. </b>If ch is present in the tree, it must have a parent, unless it is the
|
||||
pseudo-heading: but the latter can never be moved, so it isn't. Therefore
|
||||
we can remove ch by striking it out from the children list of the parent.
|
||||
(Any children which ch has, grandchildren so to speak, come with it.)
|
||||
|
@ -616,7 +616,7 @@ we can remove ch by striking it out from the children list of the parent.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ch</span><span class="plain-syntax">-></span><span class="element-syntax">next_heading</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP15">§15</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP15_2"></a><b>§15.2. </b>Two cases: the new parent is initially childless, or it isn't.
|
||||
<p class="commentary firstcommentary"><a id="SP15_2" class="paragraph-anchor"></a><b>§15.2. </b>Two cases: the new parent is initially childless, or it isn't.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add ch to the end of the list of children of pa</span><span class="named-paragraph-number">15.2</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -632,7 +632,7 @@ we can remove ch by striking it out from the children list of the parent.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP15">§15</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. Verifying the heading tree. </b>We have now, in effect, computed the indentation value of each heading twice,
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. Verifying the heading tree. </b>We have now, in effect, computed the indentation value of each heading twice,
|
||||
by two entirely different methods: first by the mathematical argument above,
|
||||
then by observing that it is the depth in the heading tree. Seeing if
|
||||
these two methods have given the same answer provides a convenient check on
|
||||
|
@ -657,7 +657,7 @@ our working.
|
|||
<span class="plain-syntax"> </span><a href="6-hdn.html#SP16" class="function-link"><span class="function-syntax">Headings::verify_heading_tree_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">root</span><span class="plain-syntax">, </span><span class="identifier-syntax">h</span><span class="plain-syntax">-></span><span class="element-syntax">next_heading</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. Falling under headings. </b>Given a position in the source code, or an excerpt of source text, which
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. Falling under headings. </b>Given a position in the source code, or an excerpt of source text, which
|
||||
heading does it fall under?
|
||||
</p>
|
||||
|
||||
|
@ -688,7 +688,7 @@ file and a line number of at least 1).
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="6-hdn.html#SP17" class="function-link"><span class="function-syntax">Headings::of_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::location</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. Miscellaneous other services. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. Miscellaneous other services. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Headings::indexed</span><span class="plain-syntax">(</span><span class="reserved-syntax">heading</span><span class="plain-syntax"> *</span><span class="identifier-syntax">h</span><span class="plain-syntax">) {</span>
|
||||
|
@ -701,7 +701,7 @@ file and a line number of at least 1).
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-es.html#SP8" class="function-link"><span class="function-syntax">Extensions::corresponding_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">h</span><span class="plain-syntax">-></span><span class="element-syntax">start_location</span><span class="plain-syntax">.</span><span class="identifier-syntax">file_of_origin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19"></a><b>§19. </b>Although Implied (0) headings do have text, contrary to the implication of
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. </b>Although Implied (0) headings do have text, contrary to the implication of
|
||||
the function here, this text is only what happens to be first in the file,
|
||||
or else is something supplied by <a href="index.html" class="internal">supervisor</a> purely to make the debugging
|
||||
log comprehensible: it isn't a heading typed as such by the user, which is all
|
||||
|
@ -714,7 +714,7 @@ that we are interested in for this purpose. So we send back a null word range.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">h</span><span class="plain-syntax">-></span><span class="element-syntax">heading_text</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP20"></a><b>§20. </b>Whence:
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. </b>Whence:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">WORDING_FOR_HEADING_NODE_PROBLEMS_CALLBACK</span><span class="plain-syntax"> </span><a href="6-hdn.html#SP20" class="function-link"><span class="function-syntax">Headings::wording_for_heading_node</span></a>
|
||||
|
@ -724,7 +724,7 @@ that we are interested in for this purpose. So we send back a null word range.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="6-hdn.html#SP19" class="function-link"><span class="function-syntax">Headings::get_text</span></a><span class="plain-syntax">(</span><a href="6-hdn.html#SP10" class="function-link"><span class="function-syntax">Headings::from_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP21"></a><b>§21. Headings with extension dependencies. </b>If the content under a heading depended on a VM not in use, or was marked
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. Headings with extension dependencies. </b>If the content under a heading depended on a VM not in use, or was marked
|
||||
not for release in a release run, we were able to exclude it just by
|
||||
skipping. The same cannot be done when a heading says that it should be
|
||||
used only if a given extension is, or is not, being used, because when
|
||||
|
@ -741,7 +741,7 @@ But when the following is called, we do know that.
|
|||
<span class="plain-syntax"> </span><a href="6-hdn.html#SP22" class="function-link"><span class="function-syntax">Headings::satisfy_individual_heading_dependency</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">h</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP22"></a><b>§22. </b>And now the code to check an individual heading's usage. This whole
|
||||
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>§22. </b>And now the code to check an individual heading's usage. This whole
|
||||
thing is carefully timed so that we can still afford to cut up and rearrange
|
||||
the parse tree on quite a large scale, and that's just what we do.
|
||||
</p>
|
||||
|
@ -794,7 +794,7 @@ the parse tree on quite a large scale, and that's just what we do.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP22_1"></a><b>§22.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading in an unincluded extension</span><span class="named-paragraph-number">22.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP22_1" class="paragraph-anchor"></a><b>§22.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading in an unincluded extension</span><span class="named-paragraph-number">22.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -804,7 +804,7 @@ the parse tree on quite a large scale, and that's just what we do.
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP22">§22</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP23"></a><b>§23. </b>To excise, we simply prune the heading's contents from the parse tree,
|
||||
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>§23. </b>To excise, we simply prune the heading's contents from the parse tree,
|
||||
though optionally grafting them to another node rather than discarding them
|
||||
altogether.
|
||||
</p>
|
||||
|
@ -834,7 +834,7 @@ elsewhere).
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">hpn</span><span class="plain-syntax">-></span><span class="identifier-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP23_1"></a><b>§23.1. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP23_1" class="paragraph-anchor"></a><b>§23.1. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">heading</span><span class="plain-syntax"> *</span><span class="function-syntax">Headings::find_dependent_heading</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">Headings::find_dependent_heading</span></span>:<br/><a href="6-hdn.html#SP23">§23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
|
||||
|
@ -856,7 +856,7 @@ elsewhere).
|
|||
<span class="plain-syntax"> </span><a href="6-hdn.html#SP23_1" class="function-link"><span class="function-syntax">Headings::suppress_dependencies</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP23_2"></a><b>§23.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading subordinate to another replaced heading</span><span class="named-paragraph-number">23.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP23_2" class="paragraph-anchor"></a><b>§23.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading subordinate to another replaced heading</span><span class="named-paragraph-number">23.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -866,7 +866,7 @@ elsewhere).
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP23">§23</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP22_2"></a><b>§22.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't find heading in the given extension</span><span class="named-paragraph-number">22.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP22_2" class="paragraph-anchor"></a><b>§22.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't find heading in the given extension</span><span class="named-paragraph-number">22.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -886,7 +886,7 @@ elsewhere).
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">vt</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-hdn.html#SP22">§22</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP22_3"></a><b>§22.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading unless level matches</span><span class="named-paragraph-number">22.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP22_3" class="paragraph-anchor"></a><b>§22.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Can't replace heading unless level matches</span><span class="named-paragraph-number">22.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -69,7 +69,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="6-inc.html#SP5">§5. Extension loading</a></li><li><a href="6-inc.html#SP7">§7. Checking the begins here and ends here sentences</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>Our main task here is to look through the syntax tree for <span class="extract"><span class="extract-syntax">INCLUDE_NT</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Our main task here is to look through the syntax tree for <span class="extract"><span class="extract-syntax">INCLUDE_NT</span></span>
|
||||
nodes, which are requests to include an extension, and replace them with
|
||||
syntax trees for the extensions in question.
|
||||
</p>
|
||||
|
@ -116,7 +116,7 @@ read twice.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>§1.1. </b>The INCLUDE node becomes an INCLUSION, which in turn contains the extension's code.
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b>The INCLUDE node becomes an INCLUSION, which in turn contains the extension's code.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Replace INCLUDE node with sentence nodes for any extensions required</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -148,7 +148,7 @@ read twice.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Here we parse the content of an Include sentence: i.e., what comes after the
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Here we parse the content of an Include sentence: i.e., what comes after the
|
||||
word "Include", which might e.g. be "Locksmith by Emily Short".
|
||||
</p>
|
||||
|
||||
|
@ -168,7 +168,7 @@ word "Include", which might e.g. be "Locksmith by Emily Short".
|
|||
<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"> { 0, -, <<t1>> = Wordings::first_wn(W), <<t2>> = Wordings::last_wn(W) }</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>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1"></a><b>§2.1. </b>Quite a popular mistake, this:
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b>Quite a popular mistake, this:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_IncludeExtQuoted problem</span><span class="named-paragraph-number">2.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
|
@ -181,7 +181,7 @@ word "Include", which might e.g. be "Locksmith by Emily Short".
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>This nonterminal parses text which will probably be something like "3.14" or
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>This nonterminal parses text which will probably be something like "3.14" or
|
||||
"12/110410", but at this stage it accepts anything: actual parsing comes later.
|
||||
</p>
|
||||
|
||||
|
@ -192,7 +192,7 @@ word "Include", which might e.g. be "Locksmith by Emily Short".
|
|||
<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>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="function-syntax">Inclusions::fulfill_request_to_include_extension</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">Inclusions::fulfill_request_to_include_extension</span></span>:<br/><a href="6-inc.html#SP1_1">§1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_H0</span><span class="plain-syntax">,</span>
|
||||
|
@ -207,7 +207,7 @@ word "Include", which might e.g. be "Locksmith by Emily Short".
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>§4.1. </b>A request consists of author, name and version, the latter being optional.
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>A request consists of author, name and version, the latter being optional.
|
||||
We obtain the extension file structure corresponding to this: it may have
|
||||
no text at all (for instance if Inform could not open the file), or it may be
|
||||
one we have seen before, thanks to an earlier inclusion. Only when it
|
||||
|
@ -235,7 +235,7 @@ parse tree.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="6-inc.html#SP5" class="function-link"><span class="function-syntax">Inclusions::load</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">last_H0</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">for_project</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Extension loading. </b>Note that we ignore a request for an extension which has already been
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Extension loading. </b>Note that we ignore a request for an extension which has already been
|
||||
loaded, except if the new request ups the ante in terms of the minimum
|
||||
version permitted: in which case we need to record that the requirement has
|
||||
been tightened. That is, if we previously wanted version 2 of Pantomime
|
||||
|
@ -265,7 +265,7 @@ Sausages by Mr Punch, and loaded it, but then read the sentence
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the extension file into the lexer, and break it into body and documentation</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the extension file into the lexer, and break it into body and documentation</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -297,7 +297,7 @@ Sausages by Mr Punch, and loaded it, but then read the sentence
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1_1"></a><b>§5.1.1. </b>Here the problem is not that the extension is broken in some way: it's
|
||||
<p class="commentary firstcommentary"><a id="SP5_1_1" class="paragraph-anchor"></a><b>§5.1.1. </b>Here the problem is not that the extension is broken in some way: it's
|
||||
just not what we can currently use. Therefore the correction should be a
|
||||
matter of removing the inclusion, not of altering the extension, so we
|
||||
report this problem at the inclusion line.
|
||||
|
@ -312,7 +312,7 @@ report this problem at the inclusion line.
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP5_1">§5.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1_2"></a><b>§5.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a cannot-find problem</span><span class="named-paragraph-number">5.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1_2" class="paragraph-anchor"></a><b>§5.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a cannot-find problem</span><span class="named-paragraph-number">5.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -339,7 +339,7 @@ report this problem at the inclusion line.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP5_1">§5.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">last_PM_ExtVersionMalformed_at</span><span class="plain-syntax"> = -1;</span>
|
||||
|
@ -355,7 +355,7 @@ report this problem at the inclusion line.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6_1"></a><b>§6.1. </b>Because we tend to call <span class="extract"><span class="extract-syntax">Inclusions::parse_version</span></span> repeatedly on
|
||||
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>§6.1. </b>Because we tend to call <span class="extract"><span class="extract-syntax">Inclusions::parse_version</span></span> repeatedly on
|
||||
the same word, we want to recover tidily from this problem, and not report it
|
||||
over and over. We do this by altering the text to <span class="extract"><span class="extract-syntax">1</span></span>, the lowest well-formed
|
||||
version number text.
|
||||
|
@ -374,7 +374,7 @@ version number text.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP6">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Checking the begins here and ends here sentences. </b>When a newly loaded extension is being sentence-broken, problem messages
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Checking the begins here and ends here sentences. </b>When a newly loaded extension is being sentence-broken, problem messages
|
||||
will be turned up unless it contains the matching pair of "begins here"
|
||||
and "ends here" sentences. Assuming it does, the sentence breaker has no
|
||||
objection, but it also calls the two routines below to verify that these
|
||||
|
@ -390,7 +390,7 @@ version number is given (if it is), and check that we are not trying to
|
|||
use an extension which is marked as not working on the current VM.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>This parses the subject noun-phrase in the sentence
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>This parses the subject noun-phrase in the sentence
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
@ -403,7 +403,7 @@ use an extension which is marked as not working on the current VM.
|
|||
<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="named-paragraph-container code-font"><a href="6-inc.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem</span><span class="named-paragraph-number">8.1</span></a></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>
|
||||
<p class="commentary firstcommentary"><a id="SP8_1"></a><b>§8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem</span><span class="named-paragraph-number">8.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>§8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem</span><span class="named-paragraph-number">8.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -412,7 +412,7 @@ use an extension which is marked as not working on the current VM.
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-inc.html#SP8">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inclusions::check_begins_here</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">Inclusions::check_begins_here</span></span>:<br/>Source Text - <a href="6-st.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">) {</span>
|
||||
|
@ -422,7 +422,7 @@ use an extension which is marked as not working on the current VM.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">S</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Similarly, we check the "ends here" sentence. Here there are no
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>Similarly, we check the "ends here" sentence. Here there are no
|
||||
side-effects: we merely verify that the name matches the one quoted in
|
||||
the "begins here".
|
||||
</p>
|
||||
|
|
|
@ -70,13 +70,13 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="6-st.html#SP1">§1. Bridge to the Lexer</a></li><li><a href="6-st.html#SP4">§4. Bridge to the problems system</a></li><li><a href="6-st.html#SP6">§6. Bridge to the syntax analyser</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Bridge to the Lexer. </b>Lexing is the business of the <a href="../words-module/index.html" class="internal">words</a> module, and we need to tell it what
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Bridge to the Lexer. </b>Lexing is the business of the <a href="../words-module/index.html" class="internal">words</a> module, and we need to tell it what
|
||||
data type to use when referencing natural languages.
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inform_language</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Lexical errors — overly long words, half-open quotations, and such — are
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Lexical errors — overly long words, half-open quotations, and such — are
|
||||
converted into copy errors and attached to the copy currently being worked on.
|
||||
The following callback function performs that service.
|
||||
</p>
|
||||
|
@ -98,7 +98,7 @@ so we will simply store it in a global variable.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>This next function is our bridge to the lexer (see <a href="../words-module/3-tff.html" class="internal">Text From Files (in words)</a>),
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>This next function is our bridge to the lexer (see <a href="../words-module/3-tff.html" class="internal">Text From Files (in words)</a>),
|
||||
and is used for reading text files of source into either projects or extensions.
|
||||
Note that it doesn't attach the fed text to the copy: the caller must do that,
|
||||
perhaps combining our feed with that of others.
|
||||
|
@ -129,7 +129,7 @@ perhaps combining our feed with that of others.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">sf</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>§3.1. </b>This is where messages like
|
||||
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>§3.1. </b>This is where messages like
|
||||
</p>
|
||||
|
||||
<pre class="ConsoleText-displayed-code all-displayed-code code-font">
|
||||
|
@ -153,7 +153,7 @@ applications.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">wc</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP3">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Bridge to the problems system. </b>These are both used when issuing problem messages on content in the relevant
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Bridge to the problems system. </b>These are both used when issuing problem messages on content in the relevant
|
||||
source files.
|
||||
</p>
|
||||
|
||||
|
@ -176,7 +176,7 @@ source files.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">paraphrase</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">GLOSS_EXTENSION_SOURCE_FILE_PROBLEMS_CALLBACK</span><span class="plain-syntax"> </span><a href="6-st.html#SP5" class="function-link"><span class="function-syntax">SourceText::gloss_extension</span></a>
|
||||
</pre>
|
||||
|
@ -186,7 +186,7 @@ source files.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" in the extension %X"</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. Bridge to the syntax analyser. </b>Similarly, <a href="index.html" class="internal">supervisor</a> sits on top of the <a href="../syntax-module/index.html" class="internal">syntax</a> module, which forms
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Bridge to the syntax analyser. </b>Similarly, <a href="index.html" class="internal">supervisor</a> sits on top of the <a href="../syntax-module/index.html" class="internal">syntax</a> module, which forms
|
||||
up the stream of words from the lexer into syntax trees. This too produces
|
||||
potential errors, and these will also convert into copy errors, but now we
|
||||
have a more elegant way to keep track of the copy; <a href="../syntax-module/index.html" class="internal">syntax</a> can be passed
|
||||
|
@ -205,7 +205,7 @@ a sort of "your ref" pointer to it.
|
|||
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>And in fact we will be producing a number of syntax errors of our own, to
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>And in fact we will be producing a number of syntax errors of our own, to
|
||||
add to those generated in <a href="../syntax-module/index.html" class="internal">syntax</a>.
|
||||
</p>
|
||||
|
||||
|
@ -227,7 +227,7 @@ add to those generated in <a href="../syntax-module/index.html" class="internal"
|
|||
<span class="definition-keyword">enum</span> <span class="constant-syntax">ExtInadequateVM_SYNERROR</span>
|
||||
<span class="definition-keyword">enum</span> <span class="constant-syntax">ExtMisidentifiedEnds_SYNERROR</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. </b>The next tweak to <a href="../syntax-module/index.html" class="internal">syntax</a> is to give it some node metadata. <a href="../syntax-module/index.html" class="internal">syntax</a>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>The next tweak to <a href="../syntax-module/index.html" class="internal">syntax</a> is to give it some node metadata. <a href="../syntax-module/index.html" class="internal">syntax</a>
|
||||
itself places nodes of a small number of basic types into the syntax tree;
|
||||
we want to expand on those. (And the <a href="../core-module/index.html" class="internal">core</a> module will expand on them still
|
||||
further, so this still isn't everything: see <a href="../core-module/8-ptu.html" class="internal">Parse Tree Usage (in core)</a>.)
|
||||
|
@ -260,7 +260,7 @@ Inform users: it increases output to the debugging log.)
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::new</span><span class="plain-syntax">(</span><span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>Sentences in the source text are of five categories: dividing sentences,
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>Sentences in the source text are of five categories: dividing sentences,
|
||||
which divide up the source into segments; structural sentences, which split
|
||||
the source into different forms (standard text, tables, equations, I6 matter,
|
||||
and so on); nonstructural sentences, which make grammatical definitions and
|
||||
|
@ -313,7 +313,7 @@ and here goes:
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">end/ends</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">here</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { -2, - }; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Check we can end an extension here</span><span class="named-paragraph-number">9.2</span></a></span><span class="Preform-constant-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>
|
||||
<p class="commentary firstcommentary"><a id="SP9_1"></a><b>§9.1. </b>Note that the extension end markers are only read in extensions, so they can
|
||||
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>§9.1. </b>Note that the extension end markers are only read in extensions, so they can
|
||||
never accidentally match in the main source text.
|
||||
</p>
|
||||
|
||||
|
@ -328,7 +328,7 @@ never accidentally match in the main source text.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP9">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9_2"></a><b>§9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can end an extension here</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>§9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can end an extension here</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -339,7 +339,7 @@ never accidentally match in the main source text.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP9">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b><a href="../syntax-module/index.html" class="internal">syntax</a> also requires this definition:
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b><a href="../syntax-module/index.html" class="internal">syntax</a> also requires this definition:
|
||||
</p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
|
@ -356,7 +356,7 @@ never accidentally match in the main source text.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">include</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">==></span><span class="Preform-plain-syntax"> { 0, - }; sfsm->nt = INFORM6CODE_NT;</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>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>Rules are ordinarily detected by their colon, which divides the header from the
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>Rules are ordinarily detected by their colon, which divides the header from the
|
||||
rest: colons are not otherwise legal in Inform. But there's an exception. If the
|
||||
sentence consists of text matching the following grammar, followed by comma,
|
||||
followed by more text, then the comma is read as if it's a colon and the
|
||||
|
@ -376,7 +376,7 @@ sentence becomes a rule. For example:
|
|||
<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>
|
||||
</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>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>Properly speaking, despite the definition above, language modifying sentences
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>Properly speaking, despite the definition above, language modifying sentences
|
||||
are nonstructural. So what are they doing here? The answer is that we need to
|
||||
read them early on, because they affect the way that they parse all other
|
||||
sentences. Whereas other nonstructural sentences can wait, these can't.
|
||||
|
@ -388,7 +388,7 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">use</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">language</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">element/elements</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { -1, - }</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>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it breaks a
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it breaks a
|
||||
sentence of type <span class="extract"><span class="Preform-extract-syntax">BEGINHERE_NT</span></span> or <span class="extract"><span class="Preform-extract-syntax">ENDHERE_NT</span></span> — i.e., the beginning or end
|
||||
of an extension.
|
||||
</p>
|
||||
|
@ -402,7 +402,7 @@ of an extension.
|
|||
<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">pn</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ENDHERE_NT</span><span class="plain-syntax">) </span><a href="6-inc.html#SP10" class="function-link"><span class="function-syntax">Inclusions::check_ends_here</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>Lastly, this callback is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it hits a sentence like:
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>Lastly, this callback is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it hits a sentence like:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>The Bibliographic Sentence</b></li></ul></div>
|
||||
<p class="purpose">That line at the top of an Inform source text, saying what it is and who wrote it.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>It might seem sensible to parse the opening sentence of the source text,
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>It might seem sensible to parse the opening sentence of the source text,
|
||||
the bibliographic sentence giving title and author, by looking at the result
|
||||
of sentence-breaking: in other words, to wait until the syntax tree for a
|
||||
project has been read in.
|
||||
|
@ -96,7 +96,7 @@ after it, and may therefore affect how subsequent sentences are broken.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>§1.1. </b>This is what the top line of the main source text should look like, if it's
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b>This is what the top line of the main source text should look like, if it's
|
||||
to declare the title and author.
|
||||
</p>
|
||||
|
||||
|
@ -110,7 +110,7 @@ to declare the title and author.
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{<quoted-text-without-subs>}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { FALSE, - }</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>
|
||||
<p class="commentary firstcommentary"><a id="SP1_2"></a><b>§1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Extract title and author name wording</span><span class="named-paragraph-number">1.2</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_2" class="paragraph-anchor"></a><b>§1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Extract title and author name wording</span><span class="named-paragraph-number">1.2</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -125,7 +125,7 @@ to declare the title and author.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-tbs.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3"></a><b>§1.3. </b>The author is sometimes given outside of quotation marks:
|
||||
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>§1.3. </b>The author is sometimes given outside of quotation marks:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
|
|
@ -67,7 +67,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>The Options File</b></li></ul></div>
|
||||
<p class="purpose">The optional file of Options applied to all of the user's projects.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>An Inform user with unyielding views on punctuation may want to have:
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>An Inform user with unyielding views on punctuation may want to have:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
@ -112,7 +112,7 @@ unyielding the user's views, it's not allowed to write:
|
|||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-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>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>§1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Act on this use option immediately</span><span class="named-paragraph-number">1.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Act on this use option immediately</span><span class="named-paragraph-number">1.1</span></span><span class="Preform-comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -121,7 +121,7 @@ unyielding the user's views, it's not allowed to write:
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="6-tof.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>There is just one options file, so no need to load it more than once.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>There is just one options file, so no need to load it more than once.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Virtual Machine Grammar</b></li></ul></div>
|
||||
<p class="purpose">Grammar for parsing natural language descriptions of a virtual machine.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b>This nonterminal corresponds to the Inbuild version number syntax in the
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>This nonterminal corresponds to the Inbuild version number syntax in the
|
||||
arch module: for example, it matches <span class="extract"><span class="extract-syntax">2.7.6</span></span> or <span class="extract"><span class="extract-syntax">3/990505</span></span>. A bit
|
||||
awkwardly, because a semantic version number is stored as an actual <span class="extract"><span class="extract-syntax">struct</span></span>
|
||||
rather than being created on the heap as an object: so we can't make the
|
||||
|
@ -84,7 +84,7 @@ to give it permanency.
|
|||
<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>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>The following nonterminal matches any valid description of a virtual machine.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>The following nonterminal matches any valid description of a virtual machine.
|
||||
</p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="7-cns.html#SP1">§1. Beginning</a></li><li><a href="7-cns.html#SP4">§4. Census data</a></li><li><a href="7-cns.html#SP7">§7. Performing the census</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Beginning. </b>Each census begins by creating an object:
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Beginning. </b>Each census begins by creating an object:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -81,7 +81,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">extension_census</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure extension_census is accessed in 5/es, 5/ps2, 7/ip and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Here <span class="extract"><span class="extract-syntax">proj</span></span> will be null in case (a), and will be the project just
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Here <span class="extract"><span class="extract-syntax">proj</span></span> will be null in case (a), and will be the project just
|
||||
compiled in case (b).
|
||||
</p>
|
||||
|
||||
|
@ -95,7 +95,7 @@ compiled in case (b).
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Each census object has its own search path for nests — for case (a) the
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Each census object has its own search path for nests — for case (a) the
|
||||
shared search path, for (b) the project's search path.
|
||||
</p>
|
||||
|
||||
|
@ -116,7 +116,7 @@ shared search path, for (b) the project's search path.
|
|||
<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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Census data. </b>For each inhabitant found, so to speak, an instance of <a href="7-cns.html#SP4" class="internal">extension_census_datum</a>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Census data. </b>For each inhabitant found, so to speak, an instance of <a href="7-cns.html#SP4" class="internal">extension_census_datum</a>
|
||||
is created. (These are called ECDs below.)
|
||||
</p>
|
||||
|
||||
|
@ -129,7 +129,7 @@ is created. (These are called ECDs below.)
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">extension_census_datum</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure extension_census_datum is accessed in 6/hdn, 6/inc, 7/dct, 7/ip, 7/ip2 and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>An ECD is actually a wrapper for an <a href="5-es.html#SP1" class="internal">inform_extension</a> object in disguise,
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>An ECD is actually a wrapper for an <a href="5-es.html#SP1" class="internal">inform_extension</a> object in disguise,
|
||||
since the <a href="2-nst.html#SP5" class="internal">inbuild_search_result</a> found that.
|
||||
</p>
|
||||
|
||||
|
@ -150,7 +150,7 @@ since the <a href="2-nst.html#SP5" class="internal">inbuild_search_result</a> fo
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="element-syntax">has_historically_been_used</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>The following give some sorting criteria, and are functions fit to be
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>The following give some sorting criteria, and are functions fit to be
|
||||
handed to <span class="extract"><span class="extract-syntax">qsort</span></span>.
|
||||
</p>
|
||||
|
||||
|
@ -198,7 +198,7 @@ handed to <span class="extract"><span class="extract-syntax">qsort</span></span>
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-es.html#SP3" class="function-link"><span class="function-syntax">Extensions::compare_by_length</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E1</span><span class="plain-syntax">, </span><span class="identifier-syntax">E2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Performing the census. </b>For some reason a census often makes a good story (cf. Luke 2:1-5), but here
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Performing the census. </b>For some reason a census often makes a good story (cf. Luke 2:1-5), but here
|
||||
there's disappointingly little to tell, because the work is all done by a
|
||||
single call to <a href="2-nst.html#SP7" class="internal">Nests::search_for</a>.
|
||||
</p>
|
||||
|
@ -220,7 +220,7 @@ single call to <a href="2-nst.html#SP7" class="internal">Nests::search_for</a>.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b>Recall that the higher-priority materials and external nests are scanned
|
||||
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>§7.1. </b>Recall that the higher-priority materials and external nests are scanned
|
||||
first, so if we find that our new extension has the same title and author as
|
||||
one already known, it must be one that is overridden.
|
||||
</p>
|
||||
|
@ -240,7 +240,7 @@ one already known, it must be one that is overridden.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-cns.html#SP7">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>§7.2. </b>Assuming the new extension was not overridden in this way, we come here.
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>Assuming the new extension was not overridden in this way, we come here.
|
||||
Because we didn't check the version number text for validity, it might
|
||||
through being invalid be longer than we expect: in case this is so, we
|
||||
truncate it.
|
||||
|
|
|
@ -82,7 +82,7 @@ MathJax = {
|
|||
|
||||
<ul class="toc"><li><a href="7-dct.html#SP1">§1. The dictionary file</a></li><li><a href="7-dct.html#SP3">§3. Storage in memory</a></li><li><a href="7-dct.html#SP8">§8. Reading in</a></li><li><a href="7-dct.html#SP10">§10. Writing out</a></li><li><a href="7-dct.html#SP11">§11. Erasing entries</a></li><li><a href="7-dct.html#SP12">§12. Sorting the extension dictionary</a></li><li><a href="7-dct.html#SP14">§14. Writing the HTML extension index</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. The dictionary file. </b>Each time an extension is successfully used, a dictionary of items defined in
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. The dictionary file. </b>Each time an extension is successfully used, a dictionary of items defined in
|
||||
the user's extensions is updated: this is used to generate the dynamic
|
||||
documentation on installed extensions, and is stored between runs in a cache
|
||||
file inside the Inform GUI applications. The dictionary is a UTF-8 encoded
|
||||
|
@ -99,7 +99,7 @@ loss if this should be mislaid.)
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Filenames::in</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Dictionary.txt"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>In December 2007, the dictionary file of a user who had employed 155 different
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>In December 2007, the dictionary file of a user who had employed 155 different
|
||||
extensions (by 33 different authors) contained 2223 entries, the longest of
|
||||
which formed a line 95 characters long: the most prolific extension made 380
|
||||
definitions. The total file size was about 130K.
|
||||
|
@ -134,7 +134,7 @@ and therefore also in excerpts with meanings, in extension titles and in
|
|||
author names. It can therefore safely be used as a field divider.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Storage in memory. </b>Each record (i.e., line in the above file) is stored in memory thus. A
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Storage in memory. </b>Each record (i.e., line in the above file) is stored in memory thus. A
|
||||
record marked "to be erased" will not be saved back to the file in due course.
|
||||
</p>
|
||||
|
||||
|
@ -151,7 +151,7 @@ record marked "to be erased" will not be saved back to the file in due course.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">extension_dictionary_entry</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure extension_dictionary_entry is accessed in 3/bg, 3/ib and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ExtensionDictionary::new_ede</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">ExtensionDictionary::new_ede</span></span>:<br/><a href="7-dct.html#SP5">§5</a>, <a href="7-dct.html#SP6">§6</a>, <a href="7-dct.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">category</span><span class="plain-syntax">,</span>
|
||||
|
@ -171,7 +171,7 @@ record marked "to be erased" will not be saved back to the file in due course.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTENSIONS_CENSUS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created $d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ede</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>§4.1. </b>Data on, for example, when an extension was last used is cached in <span class="extract"><span class="extract-syntax">indexing</span></span>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>Data on, for example, when an extension was last used is cached in <span class="extract"><span class="extract-syntax">indexing</span></span>
|
||||
records in the dictionary file. When we generate such an EDE, we must have
|
||||
new information on those, so we update the <a href="2-wrk.html#SP1" class="internal">inbuild_work</a> object representing
|
||||
the extension:
|
||||
|
@ -204,7 +204,7 @@ the extension:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">udate</span><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>This is where the <span class="extract"><span class="extract-syntax">indexing</span></span> records are made; they time-stamp the extension
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>This is where the <span class="extract"><span class="extract-syntax">indexing</span></span> records are made; they time-stamp the extension
|
||||
with its time of last usage, and the word count. (<span class="extract"><span class="extract-syntax">the_present</span></span> is a global
|
||||
variable created by <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.)
|
||||
</p>
|
||||
|
@ -227,7 +227,7 @@ variable created by <a href="../../../inweb/docs/foundation-module/index.html" c
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">dbuff</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>We provide two more convenient creator functions: from a wording or from text.
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>We provide two more convenient creator functions: from a wording or from text.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -248,7 +248,7 @@ variable created by <a href="../../../inweb/docs/foundation-module/index.html" c
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-></span><span class="identifier-syntax">as_copy</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">title</span><span class="plain-syntax">, </span><span class="identifier-syntax">headword</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. </b>The following logs the dictionary, and looks roughly like the file records,
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The following logs the dictionary, and looks roughly like the file records,
|
||||
but note that it lists the erasure flag too:
|
||||
</p>
|
||||
|
||||
|
@ -259,7 +259,7 @@ but note that it lists the erasure flag too:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ede</span><span class="plain-syntax">-></span><span class="element-syntax">entry_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">ede</span><span class="plain-syntax">-></span><span class="element-syntax">type</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Reading in. </b>Not a surprising function: open, convert one line at a time to an
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Reading in. </b>Not a surprising function: open, convert one line at a time to an
|
||||
<a href="7-dct.html#SP3" class="internal">extension_dictionary_entry</a> object, close.
|
||||
</p>
|
||||
|
||||
|
@ -276,7 +276,7 @@ but note that it lists the erasure flag too:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTENSIONS_CENSUS</span><span class="plain-syntax">, </span><span class="string-syntax">"Finished reading dictionary file\n"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8_1"></a><b>§8.1. </b>The extension dictionary file is stored only transiently and may never have
|
||||
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>§8.1. </b>The extension dictionary file is stored only transiently and may never have
|
||||
been made, or may have been wiped by a zealous mobile OS. If it doesn't exist,
|
||||
we try to make an empty one. Should these attempts fail, we simply return:
|
||||
there might be permissions reasons, and it doesn't matter too much.
|
||||
|
@ -295,7 +295,7 @@ there might be permissions reasons, and it doesn't matter too much.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP8">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>We parse lines in a fairly forgiving way. Material before the initial stroke
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>We parse lines in a fairly forgiving way. Material before the initial stroke
|
||||
is ignored; material after the final stroke is also ignored, and any line not
|
||||
containing five vertical strokes (i.e., four stroke-divided fields) is ignored
|
||||
altogether. We're being forgiving in case the user has picked up Inform again
|
||||
|
@ -347,7 +347,7 @@ days when overlong records were truncated.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. Writing out. </b>And inversely... Note that erased records are not written.
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Writing out. </b>And inversely... Note that erased records are not written.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -361,7 +361,7 @@ days when overlong records were truncated.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_CLOSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">DICTF</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10_1"></a><b>§10.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write into DICTF</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>§10.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write into DICTF</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -377,7 +377,7 @@ days when overlong records were truncated.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTENSIONS_CENSUS</span><span class="plain-syntax">, </span><span class="string-syntax">"Finished writing dictionary file\n"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP10">§10</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. Erasing entries. </b>As noted above, any entry marked <span class="extract"><span class="extract-syntax">erased</span></span> is not written back to the
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Erasing entries. </b>As noted above, any entry marked <span class="extract"><span class="extract-syntax">erased</span></span> is not written back to the
|
||||
dictionary file, and effectively that takes it out of the dictionary for
|
||||
subsequent runs of Inform.
|
||||
</p>
|
||||
|
@ -401,7 +401,7 @@ left over from some previous usage of it: it may, after all, have changed.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXTENSIONS_CENSUS</span><span class="plain-syntax">, </span><span class="string-syntax">"Done\n"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. Sorting the extension dictionary. </b>This function returns the number of (unerased) entries in the dictionary,
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. Sorting the extension dictionary. </b>This function returns the number of (unerased) entries in the dictionary,
|
||||
and on its exit the (unerased) entries each occur once in alphabetical
|
||||
order in the linked list beginning at <span class="extract"><span class="extract-syntax">first_in_sorted_dictionary</span></span>.
|
||||
If two entries have identical headwords, the earliest created is the
|
||||
|
@ -439,7 +439,7 @@ as high as 10,000.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_entries</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12_1"></a><b>§12.1. </b>Dictionary entries must be in mixed case: we might have both "green" the
|
||||
<p class="commentary firstcommentary"><a id="SP12_1" class="paragraph-anchor"></a><b>§12.1. </b>Dictionary entries must be in mixed case: we might have both "green" the
|
||||
colour and "Green" the kind of person (an environmental activist), say.
|
||||
But we want to compare them with <span class="extract"><span class="extract-syntax">strcmp</span></span>, which is much faster than its
|
||||
case-insensitive analogue. So we trade memory for speed and store a modified
|
||||
|
@ -477,7 +477,7 @@ since implementations have the freedom to sort unstably in different ways.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12_2"></a><b>§12.2. </b>We unbundle the linked list of EDEs in creation order:
|
||||
<p class="commentary firstcommentary"><a id="SP12_2" class="paragraph-anchor"></a><b>§12.2. </b>We unbundle the linked list of EDEs in creation order:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Fill the array with pointers to the EDEs</span><span class="named-paragraph-number">12.2</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -491,7 +491,7 @@ since implementations have the freedom to sort unstably in different ways.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">sorted_extension_dictionary</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">ede</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12_3"></a><b>§12.3. </b>We then use the sorted version of the same array to reorder the EDEs:
|
||||
<p class="commentary firstcommentary"><a id="SP12_3" class="paragraph-anchor"></a><b>§12.3. </b>We then use the sorted version of the same array to reorder the EDEs:
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">String the sorted array together into a sorted linked list of EDEs</span><span class="named-paragraph-number">12.3</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -506,7 +506,7 @@ since implementations have the freedom to sort unstably in different ways.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">sorted_extension_dictionary</span><span class="plain-syntax">[</span><span class="identifier-syntax">no_entries</span><span class="plain-syntax">-1]-></span><span class="element-syntax">next_in_sorted_dictionary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP12">§12</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>As always with <span class="extract"><span class="extract-syntax">qsort</span></span>, there's a palaver about the types used for the
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>As always with <span class="extract"><span class="extract-syntax">qsort</span></span>, there's a palaver about the types used for the
|
||||
comparison function so that the result will compile without errors:
|
||||
</p>
|
||||
|
||||
|
@ -519,7 +519,7 @@ comparison function so that the result will compile without errors:
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Str::cmp</span><span class="plain-syntax">((*</span><span class="identifier-syntax">e1</span><span class="plain-syntax">)-></span><span class="element-syntax">sorting</span><span class="plain-syntax">, (*</span><span class="identifier-syntax">e2</span><span class="plain-syntax">)-></span><span class="element-syntax">sorting</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. Writing the HTML extension index. </b>This is the index of terms, not the directory of extensions: it is, in
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. Writing the HTML extension index. </b>This is the index of terms, not the directory of extensions: it is, in
|
||||
fact, the HTML rendering of the dictionary constructed above.
|
||||
</p>
|
||||
|
||||
|
@ -543,7 +543,7 @@ fact, the HTML rendering of the dictionary constructed above.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14_1"></a><b>§14.1. </b>A run of \(N\) words which are all the same should appear in tinted type
|
||||
<p class="commentary firstcommentary"><a id="SP14_1" class="paragraph-anchor"></a><b>§14.1. </b>A run of \(N\) words which are all the same should appear in tinted type
|
||||
throughout, while \(N(N-1)/2\) clashes should be reported to the machinery for
|
||||
clashes given above: if we find definitions A, B, C, for instance, the clashes
|
||||
are reported as A vs B, A vs C, then B vs C. This has \(O(N^2)\) running time,
|
||||
|
@ -575,7 +575,7 @@ to the word "frog", we would be in some trouble here. Let's take the risk.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP14">§14</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b>So, then, "clashes". These occur if, say, two extensions define "chopper" as
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>So, then, "clashes". These occur if, say, two extensions define "chopper" as
|
||||
a kind of vehicle (for instance, meaning a helicopter in one and a motorcycle
|
||||
in the other). This results in two dictionary entries under "chopper" and is
|
||||
recorded as a clash between them. Often, more will turn up: perhaps "chopper"
|
||||
|
@ -596,7 +596,7 @@ extension lexicographically earlier than the second (the right one).
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">known_extension_clash</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure known_extension_clash is accessed in 6/hdn, 6/inc, 7/cns and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">known_extension_clash</span><span class="plain-syntax"> *</span><span class="function-syntax">ExtensionDictionary::new_clash</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">ExtensionDictionary::new_clash</span></span>:<br/><a href="7-dct.html#SP17">§17</a>, <a href="7-dct.html#SP17_2">§17.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">extension_dictionary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">,</span>
|
||||
|
@ -610,7 +610,7 @@ extension lexicographically earlier than the second (the right one).
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kec</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. </b>Every clash of names arises from definitions made in a pair of EDEs,
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>Every clash of names arises from definitions made in a pair of EDEs,
|
||||
which we shall call left and right. Each distinct KEC ("known extension
|
||||
clash") represents a different pair of extensions which clash, one
|
||||
example of a name clashing between them, and a count of the number of
|
||||
|
@ -686,7 +686,7 @@ not seem to have arisen from homonyms like "lead" (the substance) versus
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">kec</span><span class="plain-syntax"> = </span><a href="7-dct.html#SP16" class="function-link"><span class="function-syntax">ExtensionDictionary::new_clash</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17_1"></a><b>§17.1. </b>If two name clashes occur in the same extension then, since we can presume
|
||||
<p class="commentary firstcommentary"><a id="SP17_1" class="paragraph-anchor"></a><b>§17.1. </b>If two name clashes occur in the same extension then, since we can presume
|
||||
that this extension does actually work, the clash cannot cause problems.
|
||||
We also ignore a clash of a property name against some other form of name,
|
||||
because these occur quite often and cause little difficulty in practice: so
|
||||
|
@ -704,7 +704,7 @@ they would only clutter up the dictionary with spurious warnings.
|
|||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">ede2</span><span class="plain-syntax">-></span><span class="element-syntax">type</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"property"</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17_2"></a><b>§17.2. </b>If we can find the righthand extension on the righthand side of any KEC
|
||||
<p class="commentary firstcommentary"><a id="SP17_2" class="paragraph-anchor"></a><b>§17.2. </b>If we can find the righthand extension on the righthand side of any KEC
|
||||
in the list, then the clash is not a new one: we simply increment the number
|
||||
of definition pairs clashing between the left and right extensions, and
|
||||
return. (Thus forgetting what the actual definitions causing the present
|
||||
|
@ -729,7 +729,7 @@ extension anywhere in the list, we must add the new pair of definitions:
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP17">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. </b>The above arrangement was designed to make it easy to print out the
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>The above arrangement was designed to make it easy to print out the
|
||||
clashes in a concise, human-readable way, which is what we now do.
|
||||
</p>
|
||||
|
||||
|
@ -743,7 +743,7 @@ clashes in a concise, human-readable way, which is what we now do.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-dct.html#SP18_2" class="named-paragraph-link"><span class="named-paragraph">Write a paragraph about extensions clashing with the lefthand one here</span><span class="named-paragraph-number">18.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP18_1"></a><b>§18.1. </b>Not the end of the world! Extension clashes are not an error condition: they
|
||||
<p class="commentary firstcommentary"><a id="SP18_1" class="paragraph-anchor"></a><b>§18.1. </b>Not the end of the world! Extension clashes are not an error condition: they
|
||||
are, if anything, a sign of life and activity.
|
||||
</p>
|
||||
|
||||
|
@ -762,7 +762,7 @@ are, if anything, a sign of life and activity.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-dct.html#SP18">§18</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP18_2"></a><b>§18.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a paragraph about extensions clashing with the lefthand one here</span><span class="named-paragraph-number">18.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP18_2" class="paragraph-anchor"></a><b>§18.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write a paragraph about extensions clashing with the lefthand one here</span><span class="named-paragraph-number">18.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="7-ip.html#SP1">§1. Writing the extensions home pages</a></li><li><a href="7-ip.html#SP2">§2. Icons for virtual machines</a></li><li><a href="7-ip.html#SP3">§3. Displaying VM restrictions</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Writing the extensions home pages. </b>There are two of these, both with the same surround:
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Writing the extensions home pages. </b>There are two of these, both with the same surround:
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">HOME_EXTPAGE</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
|
@ -89,7 +89,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::footer</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>§1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the body of the HTML</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the body of the HTML</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -114,7 +114,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ip.html#SP1_1_2" class="named-paragraph-link"><span class="named-paragraph">Write the main content for the page</span><span class="named-paragraph-number">1.1.2</span></a></span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1"></a><b>§1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the heading details text for the page</span><span class="named-paragraph-number">1.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1" class="paragraph-anchor"></a><b>§1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the heading details text for the page</span><span class="named-paragraph-number">1.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -133,7 +133,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1">§1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2"></a><b>§1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the main content for the page</span><span class="named-paragraph-number">1.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2" class="paragraph-anchor"></a><b>§1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the main content for the page</span><span class="named-paragraph-number">1.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -143,7 +143,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1">§1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1_1"></a><b>§1.1.1.1. </b>From here on, then, all the code in this section generates the main directory
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1_1" class="paragraph-anchor"></a><b>§1.1.1.1. </b>From here on, then, all the code in this section generates the main directory
|
||||
page, not the index of terms, which is all handled by
|
||||
<a href="7-dct.html#SP14" class="internal">ExtensionDictionary::write_to_HTML</a>.
|
||||
</p>
|
||||
|
@ -197,7 +197,7 @@ page, not the index of terms, which is all handled by
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_1">§1.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1_2"></a><b>§1.1.1.2. </b>We sometimes position a warning prominently at the top of the listing,
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_1_2" class="paragraph-anchor"></a><b>§1.1.1.2. </b>We sometimes position a warning prominently at the top of the listing,
|
||||
because otherwise its position at the bottom will be invisible unless the user
|
||||
scrolls a long way:
|
||||
</p>
|
||||
|
@ -217,7 +217,7 @@ scrolls a long way:
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_1">§1.1.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1"></a><b>§1.1.2.1. </b>The following is an alphabetised directory of extensions by author and then
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1" class="paragraph-anchor"></a><b>§1.1.2.1. </b>The following is an alphabetised directory of extensions by author and then
|
||||
title, along with some useful information about them, and then a list of
|
||||
any oddities found in the external extensions area.
|
||||
</p>
|
||||
|
@ -244,7 +244,7 @@ any oddities found in the external extensions area.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">no_entries</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="reserved-syntax">extension_census_datum</span><span class="plain-syntax"> *));</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2">§1.1.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_1"></a><b>§1.1.2.1.1. </b>I am the first to admit that this implementation is not inspired. There
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_1" class="paragraph-anchor"></a><b>§1.1.2.1.1. </b>I am the first to admit that this implementation is not inspired. There
|
||||
are five radio buttons, and number 2 is selected by default.
|
||||
</p>
|
||||
|
||||
|
@ -301,7 +301,7 @@ are five radio buttons, and number 2 is selected by default.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_2"></a><b>§1.1.2.1.2. </b>Consequently, of the five divisions, number 2 is shown and the others
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_2" class="paragraph-anchor"></a><b>§1.1.2.1.2. </b>Consequently, of the five divisions, number 2 is shown and the others
|
||||
hidden, by default.
|
||||
</p>
|
||||
|
||||
|
@ -314,7 +314,7 @@ hidden, by default.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"div"</span><span class="plain-syntax">, </span><span class="string-syntax">"id=\"disp%d\" style=\"display: %s;\""</span><span class="plain-syntax">, </span><span class="identifier-syntax">d</span><span class="plain-syntax">, </span><span class="identifier-syntax">display</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_3"></a><b>§1.1.2.1.3. </b>The key at the foot only explicates those symbols actually used, and
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_3" class="paragraph-anchor"></a><b>§1.1.2.1.3. </b>The key at the foot only explicates those symbols actually used, and
|
||||
doesn't explicate the "unindexed" symbol at all, since that's actually
|
||||
just a blank image used for horizontal spacing to keep margins straight.
|
||||
</p>
|
||||
|
@ -352,7 +352,7 @@ just a blank image used for horizontal spacing to keep margins straight.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_4"></a><b>§1.1.2.1.4. </b>Census errors are nothing more than copy errors arising on the copies
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_4" class="paragraph-anchor"></a><b>§1.1.2.1.4. </b>Census errors are nothing more than copy errors arising on the copies
|
||||
of extensions found by the census:
|
||||
</p>
|
||||
|
||||
|
@ -382,7 +382,7 @@ of extensions found by the census:
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_4_1"></a><b>§1.1.2.1.4.1. </b>We only want to warn people here: not to stop them from using Inform
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_4_1" class="paragraph-anchor"></a><b>§1.1.2.1.4.1. </b>We only want to warn people here: not to stop them from using Inform
|
||||
until they put matters right.
|
||||
</p>
|
||||
|
||||
|
@ -405,7 +405,7 @@ until they put matters right.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_4">§1.1.2.1.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_5"></a><b>§1.1.2.1.5. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_5" class="paragraph-anchor"></a><b>§1.1.2.1.5. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SORT_CE_BY_TITLE</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">SORT_CE_BY_AUTHOR</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
|
||||
|
@ -434,7 +434,7 @@ until they put matters right.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">criterion</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6"></a><b>§1.1.2.1.6. </b>Standard rows have black text on striped background colours, these being
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6" class="paragraph-anchor"></a><b>§1.1.2.1.6. </b>Standard rows have black text on striped background colours, these being
|
||||
the usual ones seen in Mac OS X applications such as iTunes.
|
||||
</p>
|
||||
|
||||
|
@ -466,7 +466,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_table</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1">§1.1.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1"></a><b>§1.1.2.1.6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Show a titling row explaining the census sorting, if necessary</span><span class="named-paragraph-number">1.1.2.1.6.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1" class="paragraph-anchor"></a><b>§1.1.2.1.6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Show a titling row explaining the census sorting, if necessary</span><span class="named-paragraph-number">1.1.2.1.6.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -489,7 +489,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6">§1.1.2.1.6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2"></a><b>§1.1.2.1.6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Insert a subtitling row in the census sorting, if necessary</span><span class="named-paragraph-number">1.1.2.1.6.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2" class="paragraph-anchor"></a><b>§1.1.2.1.6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Insert a subtitling row in the census sorting, if necessary</span><span class="named-paragraph-number">1.1.2.1.6.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -511,7 +511,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6">§1.1.2.1.6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_3"></a><b>§1.1.2.1.6.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Show a final titling row closing the census sorting</span><span class="named-paragraph-number">1.1.2.1.6.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_3" class="paragraph-anchor"></a><b>§1.1.2.1.6.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Show a final titling row closing the census sorting</span><span class="named-paragraph-number">1.1.2.1.6.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -522,7 +522,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ip.html#SP1_1_2_1_6_1_2" class="named-paragraph-link"><span class="named-paragraph">End a tinted census line</span><span class="named-paragraph-number">1.1.2.1.6.1.2</span></a></span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6">§1.1.2.1.6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1_1"></a><b>§1.1.2.1.6.1.1. </b>Black text on a grey background.
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1_1" class="paragraph-anchor"></a><b>§1.1.2.1.6.1.1. </b>Black text on a grey background.
|
||||
</p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">CENSUS_TITLING_BG</span><span class="plain-syntax"> </span><span class="string-syntax">"#808080"</span>
|
||||
|
@ -538,7 +538,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&nbsp;"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_1">§1.1.2.1.6.1</a> (three times), <a href="7-ip.html#SP1_1_2_1_6_2">§1.1.2.1.6.2</a> (twice), <a href="7-ip.html#SP1_1_2_1_6_3">§1.1.2.1.6.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1_2"></a><b>§1.1.2.1.6.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a tinted census line</span><span class="named-paragraph-number">1.1.2.1.6.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_1_2" class="paragraph-anchor"></a><b>§1.1.2.1.6.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a tinted census line</span><span class="named-paragraph-number">1.1.2.1.6.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -546,7 +546,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::end_html_row</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_1">§1.1.2.1.6.1</a> (three times), <a href="7-ip.html#SP1_1_2_1_6_2">§1.1.2.1.6.2</a> (twice), <a href="7-ip.html#SP1_1_2_1_6_3">§1.1.2.1.6.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2_1"></a><b>§1.1.2.1.6.2.1. </b>Used only in "by author".
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2_1" class="paragraph-anchor"></a><b>§1.1.2.1.6.2.1. </b>Used only in "by author".
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print the author's line in the extension census table</span><span class="named-paragraph-number">1.1.2.1.6.2.1</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -578,7 +578,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_2">§1.1.2.1.6.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2_2"></a><b>§1.1.2.1.6.2.2. </b>Used only in "by installation".
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_2_2" class="paragraph-anchor"></a><b>§1.1.2.1.6.2.2. </b>Used only in "by installation".
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print the installation region in the extension census table</span><span class="named-paragraph-number">1.1.2.1.6.2.2</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -601,7 +601,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_2">§1.1.2.1.6.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4"></a><b>§1.1.2.1.6.4. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4" class="paragraph-anchor"></a><b>§1.1.2.1.6.4. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">UNINDEXED_SYMBOL</span><span class="plain-syntax"> </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/unindexed_bullet.png\""</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">INDEXED_SYMBOL</span><span class="plain-syntax"> </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/indexed_bullet.png\""</span>
|
||||
|
@ -621,7 +621,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-ip.html#SP1_1_2_1_6_4_4" class="named-paragraph-link"><span class="named-paragraph">Print column 4 of the census line</span><span class="named-paragraph-number">1.1.2.1.6.4.4</span></a></span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6">§1.1.2.1.6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_1"></a><b>§1.1.2.1.6.4.1. </b>The appearance of the line is
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_1" class="paragraph-anchor"></a><b>§1.1.2.1.6.4.1. </b>The appearance of the line is
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
|
@ -669,7 +669,7 @@ the usual ones seen in Mac OS X applications such as iTunes.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_4">§1.1.2.1.6.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_1_1"></a><b>§1.1.2.1.6.4.1.1. </b>VM requirements are parsed by feeding them into the lexer and calling the
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_1_1" class="paragraph-anchor"></a><b>§1.1.2.1.6.4.1.1. </b>VM requirements are parsed by feeding them into the lexer and calling the
|
||||
same routines as would be used when parsing headings about VM requirements
|
||||
in a normal run of Inform. Note that because the requirements are in round
|
||||
brackets, which the lexer will split off as distinct words, we can ignore
|
||||
|
@ -686,7 +686,7 @@ the first and last word and just look at what is in between:
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_4_1">§1.1.2.1.6.4.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_2"></a><b>§1.1.2.1.6.4.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print column 2 of the census line</span><span class="named-paragraph-number">1.1.2.1.6.4.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_2" class="paragraph-anchor"></a><b>§1.1.2.1.6.4.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print column 2 of the census line</span><span class="named-paragraph-number">1.1.2.1.6.4.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -698,7 +698,7 @@ the first and last word and just look at what is in between:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_4">§1.1.2.1.6.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_3"></a><b>§1.1.2.1.6.4.3. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_3" class="paragraph-anchor"></a><b>§1.1.2.1.6.4.3. </b></p>
|
||||
|
||||
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">BUILT_IN_SYMBOL</span><span class="plain-syntax"> </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/builtin_ext.png\""</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">OVERRIDING_SYMBOL</span><span class="plain-syntax"> </span><span class="string-syntax">"border=\"0\" src=\"inform:/doc_images/override_ext.png\""</span>
|
||||
|
@ -729,7 +729,7 @@ the first and last word and just look at what is in between:
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_4">§1.1.2.1.6.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_4"></a><b>§1.1.2.1.6.4.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print column 4 of the census line</span><span class="named-paragraph-number">1.1.2.1.6.4.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1_2_1_6_4_4" class="paragraph-anchor"></a><b>§1.1.2.1.6.4.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Print column 4 of the census line</span><span class="named-paragraph-number">1.1.2.1.6.4.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -751,7 +751,7 @@ the first and last word and just look at what is in between:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip.html#SP1_1_2_1_6_4">§1.1.2.1.6.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. Icons for virtual machines. </b>And everything else is cosmetic: printing, or showing icons to signify,
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. Icons for virtual machines. </b>And everything else is cosmetic: printing, or showing icons to signify,
|
||||
the current VM or some set of permitted VMs. The following plots the
|
||||
icon associated with a given minor VM, and explicates what the icons mean:
|
||||
</p>
|
||||
|
@ -776,7 +776,7 @@ icon associated with a given minor VM, and explicates what the icons mean:
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Displaying VM restrictions. </b>Given a word range, we describe the result as concisely as we can with a
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Displaying VM restrictions. </b>Given a word range, we describe the result as concisely as we can with a
|
||||
row of icons (but do not bother for the common case where some extension
|
||||
has no restriction on its use).
|
||||
</p>
|
||||
|
|
|
@ -66,7 +66,7 @@ function togglePopup(material_id) {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#7">Chapter 7: Extension Indexing</a></li><li><b>Individual Pages</b></li></ul></div>
|
||||
<p class="purpose">To generate the individual pages on extensions in the extension mini-website.</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b><a href="7-tm.html#SP2" class="internal">ExtensionWebsite::go</a> calls the following function to make either a
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b><a href="7-tm.html#SP2" class="internal">ExtensionWebsite::go</a> calls the following function to make either a
|
||||
detailed or a sketchy documentation page on an extension, supplying either
|
||||
a non-null <span class="extract"><span class="extract-syntax">E</span></span> for details, or a non-null <span class="extract"><span class="extract-syntax">ecd</span></span> for a sketch.
|
||||
</p>
|
||||
|
@ -86,7 +86,7 @@ associated files for each example.w
|
|||
<span class="plain-syntax"> </span><a href="7-ip2.html#SP2" class="function-link"><span class="function-syntax">ExtensionPages::write_page_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ecd</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">force_update</span><span class="plain-syntax">, </span><span class="identifier-syntax">proj</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>Here then is the nub of it. An ECD is not really enough information to go on.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Here then is the nub of it. An ECD is not really enough information to go on.
|
||||
We are not always obliged to make a sketchy page from an ECD: we decide against
|
||||
in a normal run where a page exists for it already, as otherwise a user with
|
||||
many extensions installed would detect an annoying slight delay on every run
|
||||
|
@ -129,7 +129,7 @@ is any, as well as the correct identifying headings and requirements.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_egs</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1"></a><b>§2.1. </b>The reader may wonder why we perform the conversion in this slightly recursive
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b>The reader may wonder why we perform the conversion in this slightly recursive
|
||||
way, by calling our parent function again. Wouldn't it be simpler just to set
|
||||
<span class="extract"><span class="extract-syntax">ecd</span></span> to null and let events take their course? The answer is that this would
|
||||
fail if there were examples, because we would return (say) 3 for the number
|
||||
|
@ -153,7 +153,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<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>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2"></a><b>§2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the actual extension documentation page</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>§2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the actual extension documentation page</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -166,7 +166,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::footer</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1"></a><b>§2.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write documentation for a specific extension into the page</span><span class="named-paragraph-number">2.2.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1" class="paragraph-anchor"></a><b>§2.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write documentation for a specific extension into the page</span><span class="named-paragraph-number">2.2.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -199,7 +199,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2">§2.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_1"></a><b>§2.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write Javascript paste icon for source text to include this extension</span><span class="named-paragraph-number">2.2.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_1" class="paragraph-anchor"></a><b>§2.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write Javascript paste icon for source text to include this extension</span><span class="named-paragraph-number">2.2.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -210,7 +210,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&nbsp;"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2_1">§2.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_2"></a><b>§2.2.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up any restrictions on VM usage</span><span class="named-paragraph-number">2.2.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_2" class="paragraph-anchor"></a><b>§2.2.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up any restrictions on VM usage</span><span class="named-paragraph-number">2.2.1.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -221,7 +221,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2_1">§2.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_3"></a><b>§2.2.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the version number, if any, and location</span><span class="named-paragraph-number">2.2.1.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_3" class="paragraph-anchor"></a><b>§2.2.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the version number, if any, and location</span><span class="named-paragraph-number">2.2.1.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -233,7 +233,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2_1">§2.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_4"></a><b>§2.2.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the rubric, if any</span><span class="named-paragraph-number">2.2.1.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_4" class="paragraph-anchor"></a><b>§2.2.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the rubric, if any</span><span class="named-paragraph-number">2.2.1.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -245,7 +245,7 @@ our E, and return 0 in response to the ECD call to prevent further ECD calls.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2_1">§2.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_5"></a><b>§2.2.1.5. </b>This appears above the definition paragraphs because it tends to be only
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_5" class="paragraph-anchor"></a><b>§2.2.1.5. </b>This appears above the definition paragraphs because it tends to be only
|
||||
large extensions which provide TOCs: and they, ipso facto, make many definitions.
|
||||
If the TOC were directly at the top of the supplied documentation, it might
|
||||
easily be scrolled down off screen when the user first visits the page.
|
||||
|
@ -262,7 +262,7 @@ easily be scrolled down off screen when the user first visits the page.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-ip2.html#SP2_2_1">§2.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_6"></a><b>§2.2.1.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the supplied documentation, if any</span><span class="named-paragraph-number">2.2.1.6</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2_1_6" class="paragraph-anchor"></a><b>§2.2.1.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write up the supplied documentation, if any</span><span class="named-paragraph-number">2.2.1.6</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
|
|
@ -68,7 +68,7 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="7-tm.html#SP1">§1. The mini-website</a></li><li><a href="7-tm.html#SP3">§3. Organisation of the website</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. The mini-website. </b>The Inform GUI apps present HTML in-app documentation on extensions: in
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. The mini-website. </b>The Inform GUI apps present HTML in-app documentation on extensions: in
|
||||
effect, a mini-website showing all the extensions available to the current
|
||||
user, and giving detailed documentation on each one. The code in this
|
||||
chapter of <a href="index.html" class="internal">supervisor</a> runs only if and when we want to generate or
|
||||
|
@ -85,7 +85,7 @@ clandestinely on thumb drives at their places of work, and whose employers
|
|||
had locked their computers down fairly heavily.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>The process always involves a "census" of all installed extensions, but
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>The process always involves a "census" of all installed extensions, but
|
||||
can happen for two different reasons:
|
||||
</p>
|
||||
|
||||
|
@ -125,7 +125,7 @@ same either way. Here are the functions for (a) and (b) respectively:
|
|||
<span class="plain-syntax"> </span><a href="7-dct.html#SP10" class="function-link"><span class="function-syntax">ExtensionDictionary::write_back</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1"></a><b>§2.1. </b>This simply ensures that dates used are updated to today's date for
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b>This simply ensures that dates used are updated to today's date for
|
||||
extensions used in the current run; otherwise they wouldn't show in the
|
||||
documentation as used today until the next run, for obscure timing reasons.
|
||||
</p>
|
||||
|
@ -143,7 +143,7 @@ documentation as used today until the next run, for obscure timing reasons.
|
|||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-tm.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2"></a><b>§2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write index pages</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>§2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write index pages</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -151,7 +151,7 @@ documentation as used today until the next run, for obscure timing reasons.
|
|||
<span class="plain-syntax"> </span><a href="7-ip.html#SP1" class="function-link"><span class="function-syntax">ExtensionIndex::write</span></a><span class="plain-syntax">(</span><a href="7-tm.html#SP4" class="function-link"><span class="function-syntax">ExtensionWebsite::index_URL</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"ExtIndex.html"</span><span class="plain-syntax">), </span><span class="constant-syntax">INDEX_EXTPAGE</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-tm.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_3"></a><b>§2.3. </b>Each extension gets its own page in the external documentation area, but
|
||||
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>§2.3. </b>Each extension gets its own page in the external documentation area, but
|
||||
this page can have two forms:
|
||||
</p>
|
||||
|
||||
|
@ -174,7 +174,7 @@ currently have no specific knowledge of it.
|
|||
<span class="plain-syntax"> </span><a href="7-ip2.html#SP1" class="function-link"><span class="function-syntax">ExtensionPages::write_page</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ecd</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">force_update</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">); </span><span class="comment-syntax"> ordinaire</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="7-tm.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Organisation of the website. </b>There is a top level consisting of two home pages: a directory of all
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Organisation of the website. </b>There is a top level consisting of two home pages: a directory of all
|
||||
installed extensions, and an index to the terms defined in those extensions. A
|
||||
cross-link switches between them. Each of these links down to the bottom
|
||||
level, where there is a page for every installed extension (wherever it is
|
||||
|
@ -210,7 +210,7 @@ in the same area but not as part of the site.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>The top-level files <span class="extract"><span class="extract-syntax">Extensions.html</span></span> and <span class="extract"><span class="extract-syntax">ExtIndex.html</span></span> go here:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>The top-level files <span class="extract"><span class="extract-syntax">Extensions.html</span></span> and <span class="extract"><span class="extract-syntax">ExtIndex.html</span></span> go here:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -220,7 +220,7 @@ in the same area but not as part of the site.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Filenames::in</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">leaf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>And individual extension pages here. A complication is that a single
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And individual extension pages here. A complication is that a single
|
||||
extension may also have sidekick pages for any examples in its supplied
|
||||
documentation: so for instance we might actually see —
|
||||
</p>
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
|
||||
<ul class="toc"><li><a href="P-wtmd.html#SP1">§1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">§2. The Supervisor and its Parent</a></li><li><a href="P-wtmd.html#SP4">§4. Genre, work, edition, copy</a></li><li><a href="P-wtmd.html#SP5">§5. Searches and requirements</a></li><li><a href="P-wtmd.html#SP7">§7. Discovery</a></li><li><a href="P-wtmd.html#SP8">§8. Build graph</a></li><li><a href="P-wtmd.html#SP10">§10. Reading source text</a></li><li><a href="P-wtmd.html#SP17">§17. Incremental builds</a></li><li><a href="P-wtmd.html#SP18">§18. Extension census</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Prerequisites. </b>The supervisor module is a part of the Inform compiler toolset. It is
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Prerequisites. </b>The supervisor module is a part of the Inform compiler toolset. It is
|
||||
presented as a literate program or "web". Before diving in:
|
||||
</p>
|
||||
|
||||
|
@ -80,7 +80,7 @@ and where functions have names like <span class="extract"><span class="extract-s
|
|||
uses a module of utility functions called <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
|
||||
For more, see <a href="../../../inweb/docs/foundation-module/P-abgtf.html" class="internal">A Brief Guide to Foundation (in foundation)</a>.
|
||||
</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. The Supervisor and its Parent. </b>The <a href="index.html" class="internal">supervisor</a> module is part of both <a href="../inform7/index.html" class="internal">inform7</a> and <a href="../inbuild/index.html" class="internal">inbuild</a>, and acts
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. The Supervisor and its Parent. </b>The <a href="index.html" class="internal">supervisor</a> module is part of both <a href="../inform7/index.html" class="internal">inform7</a> and <a href="../inbuild/index.html" class="internal">inbuild</a>, and acts
|
||||
as a build manager. To compile an Inform project is not so atomic a task as
|
||||
it sounds, because the project involves not only the original source text but
|
||||
also some extensions, and they may need kits of Inter code, which may need to
|
||||
|
@ -89,14 +89,14 @@ it finds such dependent resources, and sees that they are ready as needed.
|
|||
</p>
|
||||
|
||||
<p class="commentary">When included in <a href="../inform7/index.html" class="internal">inform7</a>, the Supervisor is given a single task which
|
||||
is always the same: build the current Inform 7 project. (See <a href="../core-module/1-mr.html" class="internal">Main Routine (in core)</a>.)
|
||||
is always the same: build the current Inform 7 project.
|
||||
But when included in <a href="../inbuild/index.html" class="internal">inbuild</a>, it might be asked to perform quite a variety
|
||||
of tasks, sometimes several at once, as specified by the user at the command line.
|
||||
(See <a href="../inbuild/1-mn.html" class="internal">Main (in inbuild)</a>.) In this discussion, "the parent" means the tool which
|
||||
is using <a href="index.html" class="internal">supervisor</a>, and might be either <a href="../inform7/index.html" class="internal">inform7</a> or <a href="../inbuild/index.html" class="internal">inbuild</a>.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b><a href="index.html" class="internal">supervisor</a> has a relationship with its parent tool which involves to and
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b><a href="index.html" class="internal">supervisor</a> has a relationship with its parent tool which involves to and
|
||||
fro: it's not as simple as single one-time call from the parent to <a href="index.html" class="internal">supervisor</a>
|
||||
saying "now build this".
|
||||
</p>
|
||||
|
@ -126,7 +126,7 @@ is the parent, a variety of other functions may be made.
|
|||
<ul class="footnotetexts"><li class="footnote" id="fn:1"><p class="inwebfootnote"><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> Compare <a href="../inform7/M-rc.html" class="internal">Reference Card (in inform7)</a> and <a href="../inbuild/M-rc.html" class="internal">Reference Card (in inbuild)</a>
|
||||
to see the effect.
|
||||
<a href="#fnref:1" title="return to text"> ↩</a></p></li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Genre, work, edition, copy. </b>A "genre" is a category of software or artistic work for us to manage. For
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Genre, work, edition, copy. </b>A "genre" is a category of software or artistic work for us to manage. For
|
||||
example, "Inform 7 extension" and "website template" are both genres. Each
|
||||
different genre is represented by an <a href="2-gnr.html#SP1" class="internal">inbuild_genre</a> object, whose method
|
||||
calls provide the behaviour distinctive to that genre. The currently seven
|
||||
|
@ -170,7 +170,7 @@ as will blunders in identifying extensions. In general, though, a copy which
|
|||
has no copy errors is not necessarily a correct program: only one which is
|
||||
in good enough condition for the compiler to look at.
|
||||
<a href="#fnref:2" title="return to text"> ↩</a></p></li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. Searches and requirements. </b>Copies may be strewn all over the user's file system, and it's not for us to
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Searches and requirements. </b>Copies may be strewn all over the user's file system, and it's not for us to
|
||||
go poking around without being asked.<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> Instead, the user will give the
|
||||
parent tool some locations at the command line: and those command-line
|
||||
instructions will be processed by <a href="index.html" class="internal">supervisor</a>. For example, if the user
|
||||
|
@ -207,7 +207,7 @@ when <a href="index.html" class="internal">supervisor</a> is running as part of
|
|||
<a href="#fnref:3" title="return to text"> ↩</a></p></li><li class="footnote" id="fn:4"><p class="inwebfootnote"><sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup> A typical requirement might read, say, "genre=extension, author=Emily Short",
|
||||
which matches any extension by Emily Short.
|
||||
<a href="#fnref:4" title="return to text"> ↩</a></p></li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>Although such searches can be used with vague requirements to scan for,
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Although such searches can be used with vague requirements to scan for,
|
||||
say, everything with a given genre, they can also be used to seek specific
|
||||
pieces of software which we will need. <a href="2-nst.html#SP8" class="internal">Nests::search_for_best</a> is a version
|
||||
of the search engine which returns a single result (or none): the best one.
|
||||
|
@ -224,7 +224,7 @@ For example, if an Inform project says
|
|||
extension to use.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Discovery. </b>A copy is "claimed" when it is found in the file system: either by being
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Discovery. </b>A copy is "claimed" when it is found in the file system: either by being
|
||||
right where the user said it would be, or by a search.
|
||||
</p>
|
||||
|
||||
|
@ -272,7 +272,7 @@ however it is managed on disc.
|
|||
<span class="plain-syntax"> project_file_genre </span><a href="4-pfm.html" class="internal">Project File Manager</a><span class="plain-syntax"> inform_project </span><a href="5-ps2.html" class="internal">Project Services</a>
|
||||
<span class="plain-syntax"> template_genre </span><a href="4-tm.html" class="internal">Template Manager</a><span class="plain-syntax"> inform_template </span><a href="5-ts.html" class="internal">Template Services</a>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. Build graph. </b>See <a href="3-bg.html" class="internal">Build Graphs</a> for the infrastructure of how a dependency graph is stored.
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Build graph. </b>See <a href="3-bg.html" class="internal">Build Graphs</a> for the infrastructure of how a dependency graph is stored.
|
||||
Basically these consist of <a href="3-bg.html#SP1" class="internal">build_vertex</a> objects joined together by edges,
|
||||
represented by lists of other vertices — each vertex has two lists, one of
|
||||
"use edges", the other of "build edges". See the manual at <a href="../inbuild/M-ui.html" class="internal">Using Inbuild (in inbuild)</a>
|
||||
|
@ -292,7 +292,7 @@ such as extensions which could not be found.
|
|||
two colours of edge by <a href="3-bg.html#SP4" class="internal">Graphs::need_this_to_build</a> and <a href="3-bg.html#SP4" class="internal">Graphs::need_this_to_use</a>.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. </b>When are graphs actually built? It would be appealing to do this the moment a
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>When are graphs actually built? It would be appealing to do this the moment a
|
||||
copy is claimed (i.e., as soon as the <a href="2-cps.html#SP1" class="internal">inbuild_copy</a> object is created),
|
||||
but this is impractical: it happens before we know enough about dependencies.
|
||||
So when a copy is claimed it gets an isolated copy vertex with no edges, as a
|
||||
|
@ -323,7 +323,7 @@ claimed during searches will not be compatible with the current VM at all,
|
|||
and that's fine, since they won't be used: but we can't read their text in
|
||||
without throwing copy errors. So we read only what we will use.
|
||||
<a href="#fnref:5" title="return to text"> ↩</a></p></li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. Reading source text. </b>For any copy, <a href="2-cps.html#SP7" class="internal">Copies::get_source_text</a> will instruct the Supervisor to
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Reading source text. </b>For any copy, <a href="2-cps.html#SP7" class="internal">Copies::get_source_text</a> will instruct the Supervisor to
|
||||
read in the Inform source text associated with it — if any: this does nothing
|
||||
for languages, pipelines, website templates or kits. Text for a copy is read
|
||||
at most once, and is cached so that a second read produces the same result
|
||||
|
@ -363,7 +363,7 @@ dependencies, and (b) the syntax tree is only a rudimentary one at this stage,
|
|||
parsing only a few "structural sentences".
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>The definition of "structural sentence" is given in the form of Preform grammar
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>The definition of "structural sentence" is given in the form of Preform grammar
|
||||
in <a href="6-st.html" class="internal">Source Text</a>. (Preform is the natural-language parsing engine provided
|
||||
by the <a href="../words-module/index.html" class="internal">words</a> module, and which the InC dialect of C provides a simple way
|
||||
to type into code.)
|
||||
|
@ -389,7 +389,7 @@ which we will soon need — this is done by another Preform grammar; and
|
|||
</li><li>(3) Move content around to satisfy annotations such as "in place of...",
|
||||
though this stage is performed only later — see below.
|
||||
</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>What happens next involves is carefully timed. What we want is to look
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>What happens next involves is carefully timed. What we want is to look
|
||||
through for sentences like this one:
|
||||
</p>
|
||||
|
||||
|
@ -434,7 +434,7 @@ is not present, Y is present, and vice versa, leaving it a matter of chance
|
|||
which of those states actually happens.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>At any rate, when <a href="6-inc.html#SP1" class="internal">Inclusions::traverse</a> finds an Include sentence which
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>At any rate, when <a href="6-inc.html#SP1" class="internal">Inclusions::traverse</a> finds an Include sentence which
|
||||
it decides is valid, it calls <a href="6-inc.html#SP4" class="internal">Inclusions::fulfill_request_to_include_extension</a>.
|
||||
This performs a search for the best compatible copy of the extension named —
|
||||
see above — and, once such a copy is found, calls <a href="6-inc.html#SP5" class="internal">Inclusions::load</a> to
|
||||
|
@ -455,7 +455,7 @@ build Existing Project unless you also have New Extension.
|
|||
will have been added to the build graph.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>Finally comes the complicated business of rearranging the syntax tree due
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>Finally comes the complicated business of rearranging the syntax tree due
|
||||
to headings like:
|
||||
</p>
|
||||
|
||||
|
@ -470,7 +470,7 @@ made an isolated tree for a single extension, we don't bother, because we
|
|||
couldn't compile that in isolation anyway.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b>This is all quite a long road, and the way is strewn with potential errors.
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>This is all quite a long road, and the way is strewn with potential errors.
|
||||
What if a requested extension can't be found? Or is damaged? Or not compatible
|
||||
with our VM? Or if a heading is "in place of" one which isn't where it claimed?
|
||||
And so on. Such issues are converted into still more copy errors.
|
||||
|
@ -482,7 +482,7 @@ in the parent <a href="../inform7/index.html" class="internal">inform7</a>, they
|
|||
up later and issued as problem messages by <a href="../core-module/2-pwst.html" class="internal">Problems With Source Text (in core)</a>.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. </b>Now that we have read in the text of a project/extension, we know all of its
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>Now that we have read in the text of a project/extension, we know all of its
|
||||
dependencies on other extensions. If we were reading an extension, we now have
|
||||
its complete graph made, because it can only be dependent on other extensions.
|
||||
But a project also depends on kits of Inter codes, on a language definition,
|
||||
|
@ -490,7 +490,7 @@ and so forth: and also on the files it draws its source text from. See
|
|||
<a href="5-ps2.html#SP24" class="internal">Projects::construct_graph</a> for the details.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. Incremental builds. </b>So, then, at this point we can determine the complete build graph for any copy.
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. Incremental builds. </b>So, then, at this point we can determine the complete build graph for any copy.
|
||||
The parent can do several things:
|
||||
</p>
|
||||
|
||||
|
@ -524,7 +524,7 @@ according to the <a href="3-bm.html#SP1" class="internal">build_methodology</a>
|
|||
to configure how it should go about its business.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. Extension census. </b>That's basically everything except for the lengthy but unimportant code in
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. Extension census. </b>That's basically everything except for the lengthy but unimportant code in
|
||||
<a href="7-tm.html" class="internal">Chapter 7: Extension Indexing</a>, which constructs a mini-website of extension documentation for
|
||||
use inside the GUI app. None of this affects how builds are made. See
|
||||
<a href="7-tm.html" class="internal">The Mini-Website</a> for the site's makeup. A little metadata is cached
|
||||
|
|
|
@ -222,7 +222,7 @@ void Kits::load_built_in_kind_constructors(inform_kit *K) {
|
|||
pathname *P = Pathnames::down(K->as_copy->location_if_path, I"kinds");
|
||||
filename *F = Filenames::in(P, segment);
|
||||
LOG("Loading kinds definitions from %f\n", F);
|
||||
I6T::interpret_kindt(F);
|
||||
I6T::interpret_neptune(F);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -24,7 +24,7 @@ be assimilated using pipelines, ... and so on. //supervisor// manages this:
|
|||
it finds such dependent resources, and sees that they are ready as needed.
|
||||
|
||||
When included in //inform7//, the Supervisor is given a single task which
|
||||
is always the same: build the current Inform 7 project. (See //core: Main Routine//.)
|
||||
is always the same: build the current Inform 7 project.
|
||||
But when included in //inbuild//, it might be asked to perform quite a variety
|
||||
of tasks, sometimes several at once, as specified by the user at the command line.
|
||||
(See //inbuild: Main//.) In this discussion, "the parent" means the tool which
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
Total memory consumption was 257146K = 251 MB
|
||||
Total memory consumption was 257185K = 251 MB
|
||||
|
||||
62.5% was used for 1330422 objects, in 273320 frames in 201 x 800K = 160800K = 157 MB:
|
||||
62.5% was used for 1330626 objects, in 273326 frames in 201 x 800K = 160800K = 157 MB:
|
||||
|
||||
9.8% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes
|
||||
5.4% text_stream_array 2569 x 100 = 256900 objects, 14468608 bytes
|
||||
5.4% text_stream_array 2571 x 100 = 257100 objects, 14479872 bytes
|
||||
3.9% parse_node 129992 objects, 10399360 bytes
|
||||
2.8% verb_conjugation 160 objects, 7425280 bytes
|
||||
2.6% parse_node_annotation_array 431 x 500 = 215500 objects, 6909792 bytes
|
||||
|
@ -58,7 +58,7 @@ Total memory consumption was 257146K = 251 MB
|
|||
---- inter_tree 6 objects, 78624 bytes
|
||||
---- inter_schema 1509 objects, 72432 bytes
|
||||
---- rulebook 407 objects, 71632 bytes
|
||||
---- kind_macro_definition 10 objects, 64400 bytes
|
||||
---- kind_macro_definition 10 objects, 69200 bytes
|
||||
---- spatial_data 667 objects, 64032 bytes
|
||||
---- booking 860 objects, 61920 bytes
|
||||
---- grammar_verb 130 objects, 57200 bytes
|
||||
|
@ -95,10 +95,10 @@ Total memory consumption was 257146K = 251 MB
|
|||
---- literal_text 147 objects, 12936 bytes
|
||||
---- stopwatch_timer 148 objects, 11840 bytes
|
||||
---- understanding_reference_array 2 x 100 = 200 objects, 11264 bytes
|
||||
---- pathname 259 objects, 10360 bytes
|
||||
---- pathname 261 objects, 10440 bytes
|
||||
---- adjective 137 objects, 9864 bytes
|
||||
---- method 177 objects, 8496 bytes
|
||||
---- filename 205 objects, 8200 bytes
|
||||
---- filename 207 objects, 8280 bytes
|
||||
---- equation_node 68 objects, 7616 bytes
|
||||
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
|
||||
---- determiner 22 objects, 7216 bytes
|
||||
|
@ -212,7 +212,7 @@ Total memory consumption was 257146K = 251 MB
|
|||
|
||||
37.4% was used for memory not allocated for objects:
|
||||
|
||||
15.8% text stream storage 41849580 bytes in 263289 claims
|
||||
15.9% text stream storage 41888816 bytes in 263476 claims
|
||||
3.5% dictionary storage 9265152 bytes in 16346 claims
|
||||
---- sorting 1048 bytes in 3 claims
|
||||
2.7% source text 7200000 bytes in 3 claims
|
||||
|
@ -229,5 +229,5 @@ Total memory consumption was 257146K = 251 MB
|
|||
---- emitter array storage 14368 bytes in 8 claims
|
||||
---- code generation workspace for objects 9200 bytes in 9 claims
|
||||
|
||||
20.3% was overhead - 53602600 bytes = 52346K = 51 MB
|
||||
20.3% was overhead - 53586376 bytes = 52330K = 51 MB
|
||||
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
100.0% in inform7 run
|
||||
66.1% in compilation to Inter
|
||||
24.9% in //Phrases::Manager::compile_first_block//
|
||||
66.6% in compilation to Inter
|
||||
25.1% in //Phrases::Manager::compile_first_block//
|
||||
8.2% in //Phrases::Manager::compile_as_needed//
|
||||
7.1% in //Strings::compile_responses//
|
||||
6.2% in //World::Compile::compile//
|
||||
4.5% in //MajorNodes::pre_pass//
|
||||
3.2% in //MajorNodes::pass_1//
|
||||
3.3% in //MajorNodes::pass_1//
|
||||
2.0% in //Phrases::Manager::RulePrintingRule_routine//
|
||||
1.8% in //Phrases::Manager::rulebooks_array//
|
||||
1.0% in //VerbsAtRunTime::ConjugateVerb//
|
||||
2.0% in //Phrases::Manager::rulebooks_array//
|
||||
1.1% in //VerbsAtRunTime::ConjugateVerb//
|
||||
0.9% in //Phrases::Manager::traverse//
|
||||
0.5% in //Phrases::Manager::parse_rule_parameters//
|
||||
0.5% in //World::complete//
|
||||
|
@ -18,11 +18,11 @@
|
|||
0.1% in //Kinds::RunTime::compile_data_type_support_routines//
|
||||
0.1% in //PL::Parsing::Verbs::compile_all//
|
||||
0.1% in //Task::make_built_in_kind_constructors//
|
||||
3.1% not specifically accounted for
|
||||
31.5% in running Inter pipeline
|
||||
10.0% in inter step 2/12: link
|
||||
10.0% in step preparation
|
||||
7.3% in inter step 12/12: generate inform6 -> auto.inf
|
||||
3.2% not specifically accounted for
|
||||
31.0% in running Inter pipeline
|
||||
9.9% in inter step 2/12: link
|
||||
9.9% in step preparation
|
||||
7.1% in inter step 12/12: generate inform6 -> auto.inf
|
||||
0.3% in inter step 9/12: make-identifiers-unique
|
||||
0.1% in inter step 10/12: reconcile-verbs
|
||||
0.1% in inter step 11/12: eliminate-redundant-labels
|
||||
|
|
|
@ -1,75 +1,3 @@
|
|||
#DEFAULTS:
|
||||
defined-in-source-text:no
|
||||
is-incompletely-defined:no
|
||||
comparison-routine:UnsignedCompare
|
||||
can-coincide-with-property:no
|
||||
named-values-created-with-assertions:no
|
||||
has-i6-GPR:no
|
||||
multiple-block:no
|
||||
constant-compilation-method:none
|
||||
|
||||
#KIND-VARIABLE:
|
||||
group:1
|
||||
constant-compilation-method:none
|
||||
i6-printing-routine:DA_Number
|
||||
i6-printing-routine-actions:DA_Number
|
||||
index-priority:0
|
||||
|
||||
#KIND-OF-KIND:
|
||||
group:2
|
||||
constant-compilation-method:none
|
||||
i6-printing-routine:DA_Number
|
||||
i6-printing-routine-actions:DA_Number
|
||||
index-priority:0
|
||||
|
||||
#BASE-KIND:
|
||||
group:3
|
||||
conforms-to:VALUE_TY
|
||||
index-priority:3
|
||||
|
||||
#KIND-CONSTRUCTOR:
|
||||
group:4
|
||||
conforms-to:VALUE_TY
|
||||
index-priority:8
|
||||
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
*END
|
||||
|
||||
+VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:value
|
||||
plural:values
|
||||
! Matches any value at all
|
||||
|
||||
+POINTER_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
! Matches any value whose runtime representation is a pointer to a block
|
||||
|
||||
+STORED_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
! Matches any value whose runtime representation is a single word
|
||||
|
||||
+ARITHMETIC_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:arithmetic value
|
||||
plural:arithmetic values
|
||||
|
||||
+REAL_ARITHMETIC_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:real arithmetic value
|
||||
plural:real arithmetic values
|
||||
|
||||
+ENUMERATED_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:enumerated value
|
||||
plural:enumerated values
|
||||
|
||||
+SAYABLE_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:sayable value
|
||||
plural:sayable values
|
||||
|
||||
+OBJECT_TY:
|
||||
apply-macro:#BASE-KIND
|
||||
singular:object
|
||||
|
@ -566,55 +494,3 @@ documentation-reference:kind_listof
|
|||
index-priority:0
|
||||
index-default-value:{ }
|
||||
specification-text:A way to combine a fixed small number of values, of possibly different kinds, together.
|
||||
|
||||
! New kinds of value are initially given these settings:
|
||||
|
||||
#NEW:
|
||||
apply-macro:#BASE-KIND
|
||||
conforms-to:STORED_VALUE_TY
|
||||
is-incompletely-defined:yes
|
||||
named-values-created-with-assertions:yes
|
||||
can-coincide-with-property:yes
|
||||
defined-in-source-text:yes
|
||||
description:a designed type
|
||||
|
||||
! When the source text specifies either a named constant value, or a literal
|
||||
! pattern, it decides whether the new type is to be an enumeration or a unit,
|
||||
! at which point one of the following macros is applied to the type:
|
||||
|
||||
#ENUMERATION:
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
is-incompletely-defined:no
|
||||
named-values-created-with-assertions:yes
|
||||
default-value:1
|
||||
index-default-value:<first-constant>
|
||||
index-priority:5
|
||||
has-i6-GPR:yes
|
||||
comparison-routine:signed
|
||||
can-exchange:yes
|
||||
description:a designed type
|
||||
constant-compilation-method:quantitative
|
||||
apply-template:*UNDERSTOOD-VARIABLE
|
||||
|
||||
#LINGUISTIC:
|
||||
index-priority:7
|
||||
|
||||
#UNIT:
|
||||
conforms-to:ARITHMETIC_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
is-incompletely-defined:no
|
||||
comparison-routine:signed
|
||||
can-exchange:yes
|
||||
defined-in-source-text:yes
|
||||
named-values-created-with-assertions:no
|
||||
default-value:0
|
||||
index-default-value:<0-in-literal-pattern>
|
||||
index-priority:2
|
||||
has-i6-GPR:yes
|
||||
constant-compilation-method:literal
|
||||
apply-template:*UNDERSTOOD-VARIABLE
|
||||
|
||||
#REAL:
|
||||
conforms-to:ARITHMETIC_VALUE_TY
|
||||
conforms-to:REAL_ARITHMETIC_VALUE_TY
|
|
@ -6,7 +6,7 @@ plural:external files
|
|||
conforms-to:STORED_VALUE_TY
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
named-values-created-with-assertions:yes
|
||||
created-with-assertions:yes
|
||||
default-value:0
|
||||
i6-printing-routine:PrintExternalFileName
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
+VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:value
|
||||
plural:values
|
||||
|
||||
+POINTER_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
! for internal use only: cannot be named in source text
|
||||
|
||||
+STORED_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
! for internal use only: cannot be named in source text
|
||||
|
||||
+ARITHMETIC_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:arithmetic value
|
||||
plural:arithmetic values
|
||||
|
||||
+REAL_ARITHMETIC_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:real arithmetic value
|
||||
plural:real arithmetic values
|
||||
|
||||
+ENUMERATED_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:enumerated value
|
||||
plural:enumerated values
|
||||
|
||||
+SAYABLE_VALUE_TY:
|
||||
apply-macro:#KIND-OF-KIND
|
||||
singular:sayable value
|
||||
plural:sayable values
|
89
inform7/Internal/Inter/BasicInformKit/kinds/Macros.neptune
Normal file
89
inform7/Internal/Inter/BasicInformKit/kinds/Macros.neptune
Normal file
|
@ -0,0 +1,89 @@
|
|||
#DEFAULTS:
|
||||
defined-in-source-text:no
|
||||
is-incompletely-defined:no
|
||||
comparison-routine:UnsignedCompare
|
||||
can-coincide-with-property:no
|
||||
created-with-assertions:no
|
||||
has-i6-GPR:no
|
||||
multiple-block:no
|
||||
constant-compilation-method:none
|
||||
|
||||
#KIND-VARIABLE:
|
||||
group:1
|
||||
constant-compilation-method:none
|
||||
i6-printing-routine:DA_Number
|
||||
i6-printing-routine-actions:DA_Number
|
||||
index-priority:0
|
||||
|
||||
#KIND-OF-KIND:
|
||||
group:2
|
||||
constant-compilation-method:none
|
||||
i6-printing-routine:DA_Number
|
||||
i6-printing-routine-actions:DA_Number
|
||||
index-priority:0
|
||||
|
||||
#BASE-KIND:
|
||||
group:3
|
||||
conforms-to:VALUE_TY
|
||||
index-priority:3
|
||||
|
||||
#KIND-CONSTRUCTOR:
|
||||
group:4
|
||||
conforms-to:VALUE_TY
|
||||
index-priority:8
|
||||
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
*END
|
||||
|
||||
! New kinds of value are initially given these settings:
|
||||
|
||||
#NEW:
|
||||
apply-macro:#BASE-KIND
|
||||
conforms-to:STORED_VALUE_TY
|
||||
is-incompletely-defined:yes
|
||||
created-with-assertions:yes
|
||||
can-coincide-with-property:yes
|
||||
defined-in-source-text:yes
|
||||
description:a designed type
|
||||
|
||||
! When the source text specifies either a named constant value, or a literal
|
||||
! pattern, it decides whether the new type is to be an enumeration or a unit,
|
||||
! at which point one of the following macros is applied to the type:
|
||||
|
||||
#ENUMERATION:
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
is-incompletely-defined:no
|
||||
created-with-assertions:yes
|
||||
default-value:1
|
||||
index-default-value:<first-constant>
|
||||
index-priority:5
|
||||
has-i6-GPR:yes
|
||||
comparison-routine:signed
|
||||
can-exchange:yes
|
||||
description:a designed type
|
||||
constant-compilation-method:quantitative
|
||||
apply-template:*UNDERSTOOD-VARIABLE
|
||||
|
||||
#LINGUISTIC:
|
||||
index-priority:7
|
||||
|
||||
#UNIT:
|
||||
conforms-to:ARITHMETIC_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
is-incompletely-defined:no
|
||||
comparison-routine:signed
|
||||
can-exchange:yes
|
||||
defined-in-source-text:yes
|
||||
created-with-assertions:no
|
||||
default-value:0
|
||||
index-default-value:<0-in-literal-pattern>
|
||||
index-priority:2
|
||||
has-i6-GPR:yes
|
||||
constant-compilation-method:literal
|
||||
apply-template:*UNDERSTOOD-VARIABLE
|
||||
|
||||
#REAL:
|
||||
conforms-to:ARITHMETIC_VALUE_TY
|
||||
conforms-to:REAL_ARITHMETIC_VALUE_TY
|
|
@ -2,8 +2,10 @@ priority: 0
|
|||
extension: Basic Inform by Graham Nelson
|
||||
extension: English Language by Graham Nelson
|
||||
dependency: if not WorldModelKit then BasicInformExtrasKit
|
||||
kinds: Core.kindt
|
||||
kinds: Files.kindt
|
||||
kinds: Macros.neptune
|
||||
kinds: KindsOfKinds.neptune
|
||||
kinds: Core.neptune
|
||||
kinds: Files.neptune
|
||||
activate: glulx external files
|
||||
defines Main: no
|
||||
index from: Basic.indext
|
||||
|
|
|
@ -2,4 +2,4 @@ priority: 3
|
|||
extension: Standard Rules by Graham Nelson
|
||||
dependency: if CommandParserKit then WorldModelKit
|
||||
activate: command
|
||||
kinds: Parsing.kindt
|
||||
kinds: Parsing.neptune
|
||||
|
|
|
@ -6,7 +6,7 @@ plural:figure names
|
|||
conforms-to:STORED_VALUE_TY
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
named-values-created-with-assertions:yes
|
||||
created-with-assertions:yes
|
||||
default-value:1
|
||||
|
||||
i6-printing-routine:PrintFigureName
|
|
@ -6,7 +6,7 @@ plural:scenes
|
|||
conforms-to:STORED_VALUE_TY
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
named-values-created-with-assertions:yes
|
||||
created-with-assertions:yes
|
||||
default-value: 0
|
||||
|
||||
loop-domain-schema:for (*1=1: *1<=NUMBER_SCENES_CREATED: *1++)
|
|
@ -6,7 +6,7 @@ plural:sound names
|
|||
conforms-to:STORED_VALUE_TY
|
||||
conforms-to:ENUMERATED_VALUE_TY
|
||||
conforms-to:SAYABLE_VALUE_TY
|
||||
named-values-created-with-assertions:yes
|
||||
created-with-assertions:yes
|
||||
default-value:0
|
||||
|
||||
i6-printing-routine:PrintSoundName
|
|
@ -1,10 +1,10 @@
|
|||
priority: 2
|
||||
extension: Standard Rules by Graham Nelson
|
||||
kinds: Actions.kindt
|
||||
kinds: Times.kindt
|
||||
kinds: Scenes.kindt
|
||||
kinds: Figures.kindt
|
||||
kinds: Sounds.kindt
|
||||
kinds: Actions.neptune
|
||||
kinds: Times.neptune
|
||||
kinds: Scenes.neptune
|
||||
kinds: Figures.neptune
|
||||
kinds: Sounds.neptune
|
||||
activate: interactive fiction
|
||||
activate: multimedia
|
||||
defines Main: yes
|
||||
|
|
|
@ -188,7 +188,7 @@ so on. Those absolute basics are made here.
|
|||
BENCH(FundamentalConstants::emit_build_number)
|
||||
BENCH(PL::Bibliographic::compile_constants)
|
||||
BENCH(Extensions::Files::ShowExtensionVersions_routine)
|
||||
BENCH(Kinds::Constructors::compile_I6_constants)
|
||||
BENCH(Kinds::Constructors::emit_constants)
|
||||
BENCH_IF(scoring_plugin, PL::Score::compile_max_score)
|
||||
BENCH(RTUseOptions::TestUseOption_routine)
|
||||
BENCH(Activities::compile_activity_constants)
|
||||
|
|
|
@ -157,7 +157,8 @@ int Kinds::Knowledge::allow_sometimes(kind *from) {
|
|||
@d PROBLEM_KINDS_CALLBACK Kinds::Knowledge::kinds_problem_handler
|
||||
|
||||
=
|
||||
void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K1, kind *K2) {
|
||||
void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, text_stream *E,
|
||||
kind *K1, kind *K2) {
|
||||
switch (err_no) {
|
||||
case DimensionRedundant_KINDERROR:
|
||||
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DimensionRedundant),
|
||||
|
@ -230,6 +231,16 @@ void Kinds::Knowledge::kinds_problem_handler(int err_no, parse_node *pn, kind *K
|
|||
"scaling is already established",
|
||||
"which is impossible.");
|
||||
break;
|
||||
case NeptuneError_KINDERROR:
|
||||
Problems::quote_stream(1, E);
|
||||
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
|
||||
Problems::issue_problem_segment(
|
||||
"One of the so-called Neptune files used to configure the kinds of value "
|
||||
"built into Inform contained an error. Either there is something wrong with "
|
||||
"this installation of Inform, or new Neptune files are being tried out but "
|
||||
"do not yet work. Specifically: '%1'.");
|
||||
Problems::issue_problem_end();
|
||||
break;
|
||||
default: internal_error("unimplemented problem message");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@ Those three usages live on, but are now called by three different names,
|
|||
even though they share an underlying implementation (which has a general
|
||||
air of being over-engineered, thanks to its once-mightier state).
|
||||
|
||||
(a) We can read a |*.kindt| file which defines the properties of built-in
|
||||
kinds of value, such as "number".
|
||||
(a) We can read a Neptune file which defines the properties of built-in
|
||||
kinds of value, such as |number|.
|
||||
|
||||
(b) We can read a |*.indext| file which acts as a contents page for the
|
||||
Index generated by a project.
|
||||
|
@ -30,13 +30,13 @@ Index generated by a project.
|
|||
a text stream. Expansion doesn't change much, but it does handle the |(+|
|
||||
and |+)| Inform 7 escapes (see below).
|
||||
|
||||
@e KINDT_MODE from 1
|
||||
@e NEPTUNE_MODE from 1
|
||||
@e INDEXT_MODE
|
||||
@e I6TCODE_MODE
|
||||
|
||||
=
|
||||
void I6T::interpret_kindt(filename *segment_file) {
|
||||
I6T::interpreter_shared(Task::syntax_tree(), KINDT_MODE, NULL, NULL, NULL, -1, segment_file);
|
||||
void I6T::interpret_neptune(filename *neptune_file) {
|
||||
I6T::interpreter_shared(Task::syntax_tree(), NEPTUNE_MODE, NULL, NULL, NULL, -1, neptune_file);
|
||||
}
|
||||
|
||||
int do_not_generate_index = FALSE; /* Set by the |-no-index| command line option */
|
||||
|
@ -64,7 +64,7 @@ is run only to call other functions.
|
|||
void I6T::interpreter_shared(parse_node_tree *T, int int_mode, OUTPUT_STREAM, wchar_t *sf, text_stream *segment_name,
|
||||
int N_escape, filename *index_structure) {
|
||||
FILE *Input_File = NULL;
|
||||
int col = 1, cr, sfp = 0;
|
||||
int col = 1, cr, sfp = 0, lc = 0;
|
||||
TEMPORARY_TEXT(heading_name)
|
||||
|
||||
int comment = FALSE;
|
||||
|
@ -80,12 +80,14 @@ void I6T::interpreter_shared(parse_node_tree *T, int int_mode, OUTPUT_STREAM, wc
|
|||
@<Read next character from I6T stream@>;
|
||||
NewCharacter: if (cr == EOF) break;
|
||||
if (comment == FALSE) {
|
||||
if (int_mode == KINDT_MODE) {
|
||||
if (int_mode == NEPTUNE_MODE) {
|
||||
lc++;
|
||||
if ((cr == 10) || (cr == 13)) continue; /* skip blank lines here */
|
||||
@<Read rest of line as argument@>;
|
||||
if ((Str::get_first_char(argument) == '!') ||
|
||||
(Str::get_first_char(argument) == 0)) continue; /* skip blanks and comments */
|
||||
KindCommands::despatch(T, argument);
|
||||
text_file_position tfp = TextFiles::at(index_structure, lc);
|
||||
NeptuneFiles::read_command(T, argument, &tfp);
|
||||
continue;
|
||||
}
|
||||
if (cr == '{') {
|
||||
|
@ -135,14 +137,21 @@ file.
|
|||
if (Str::len(segment_name) > 0) {
|
||||
Input_File = NULL;
|
||||
WRITE_TO(STDERR, "inform: Unable to open segment <%S>\n", segment_name);
|
||||
StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */
|
||||
StandardProblems::unlocated_problem(Task::syntax_tree(),
|
||||
_p_(BelievedImpossible), /* or anyway not usefully testable */
|
||||
"I couldn't open a requested I6T segment: see the console "
|
||||
"output for details.");
|
||||
} else if (index_structure) {
|
||||
Input_File = Filenames::fopen(index_structure, "r");
|
||||
if (Input_File == NULL) {
|
||||
LOG("Filename was %f\n", index_structure);
|
||||
StandardProblems::unlocated_problem(Task::syntax_tree(), _p_(BelievedImpossible), /* or anyway not usefully testable */
|
||||
if (int_mode == NEPTUNE_MODE)
|
||||
StandardProblems::unlocated_problem(Task::syntax_tree(),
|
||||
_p_(BelievedImpossible), /* or anyway not usefully testable */
|
||||
"I couldn't open a Neptune file for defining built-in kinds.");
|
||||
else
|
||||
StandardProblems::unlocated_problem(Task::syntax_tree(),
|
||||
_p_(BelievedImpossible), /* or anyway not usefully testable */
|
||||
"I couldn't open the template file for the index.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,15 +86,18 @@ to some routine of her own, gazumping this one.
|
|||
@e KindsCircular_KINDERROR
|
||||
@e LPCantScaleYet_KINDERROR
|
||||
@e LPCantScaleTwice_KINDERROR
|
||||
@e NeptuneError_KINDERROR
|
||||
|
||||
=
|
||||
void KindsModule::problem_handler(int err_no, parse_node *pn, kind *K1, kind *K2) {
|
||||
void KindsModule::problem_handler(int err_no, parse_node *pn, text_stream *E,
|
||||
kind *K1, kind *K2) {
|
||||
#ifdef PROBLEM_KINDS_CALLBACK
|
||||
PROBLEM_KINDS_CALLBACK(err_no, pn, K1, K2);
|
||||
PROBLEM_KINDS_CALLBACK(err_no, pn, E, K1, K2);
|
||||
#endif
|
||||
#ifndef PROBLEM_KINDS_CALLBACK
|
||||
TEMPORARY_TEXT(text)
|
||||
WRITE_TO(text, "%+W", Node::get_text(pn));
|
||||
if (pn) WRITE_TO(text, "%+W", Node::get_text(pn));
|
||||
if (E) WRITE_TO(text, "%S", E);
|
||||
switch (err_no) {
|
||||
case DimensionRedundant_KINDERROR:
|
||||
Errors::with_text("multiplication rule given twice: %S", text);
|
||||
|
@ -123,6 +126,9 @@ void KindsModule::problem_handler(int err_no, parse_node *pn, kind *K1, kind *K2
|
|||
case LPCantScaleTwice_KINDERROR:
|
||||
Errors::with_text("tries to scale a value which has already been scaled: %S", text);
|
||||
break;
|
||||
case NeptuneError_KINDERROR:
|
||||
Errors::with_text("error in Neptune file: %S", text);
|
||||
break;
|
||||
default: internal_error("unimplemented problem message");
|
||||
}
|
||||
DISCARD_TEXT(text)
|
||||
|
|
|
@ -488,7 +488,7 @@ void Kinds::make_subkind(kind *sub, kind *super) {
|
|||
LOG("Tried to make %u a kind of %u\n", sub, super);
|
||||
if (problem_count == 0)
|
||||
KindsModule::problem_handler(KindUnalterable_KINDERROR,
|
||||
Kinds::Behaviour::get_superkind_set_at(sub), super, existing);
|
||||
Kinds::Behaviour::get_superkind_set_at(sub), NULL, super, existing);
|
||||
break;
|
||||
case SOMETIMES_MATCH:
|
||||
Kinds::make_subkind_inner(sub, super);
|
||||
|
@ -502,7 +502,7 @@ void Kinds::make_subkind_inner(kind *sub, kind *super) {
|
|||
if (Kinds::eq(K, sub)) {
|
||||
if (problem_count == 0)
|
||||
KindsModule::problem_handler(KindsCircular_KINDERROR,
|
||||
Kinds::Behaviour::get_superkind_set_at(super), super,
|
||||
Kinds::Behaviour::get_superkind_set_at(super), NULL, super,
|
||||
Latticework::super(sub));
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -222,7 +222,7 @@ kilopascals" might be a notation for a kind where constants are not named.
|
|||
=
|
||||
int Kinds::Behaviour::has_named_constant_values(kind *K) {
|
||||
if (K == NULL) return FALSE;
|
||||
if (K->construct->named_values_created_with_assertions) return TRUE;
|
||||
if (K->construct->created_with_assertions) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -475,7 +475,7 @@ inter_name *Kinds::Behaviour::get_iname(kind *K) {
|
|||
if (Kinds::Behaviour::is_an_enumeration(K)) {
|
||||
R = Kinds::Behaviour::package(K); external = FALSE;
|
||||
}
|
||||
text_stream *X = K->construct->dt_I6_identifier;
|
||||
text_stream *X = K->construct->print_identifier;
|
||||
if (Kinds::Behaviour::is_quasinumerical(K)) {
|
||||
R = Kinds::Behaviour::package(K); external = FALSE;
|
||||
}
|
||||
|
@ -523,9 +523,9 @@ inter_name *Kinds::Behaviour::get_ranger_iname(kind *K) {
|
|||
inter_name *Kinds::Behaviour::get_name_of_printing_rule_ACTIONS(kind *K) {
|
||||
if (K == NULL) K = K_number;
|
||||
if (K->construct->trace_iname) return K->construct->trace_iname;
|
||||
if (Str::len(K->construct->name_of_printing_rule_ACTIONS) > 0)
|
||||
if (Str::len(K->construct->ACTIONS_identifier) > 0)
|
||||
K->construct->trace_iname =
|
||||
Produce::find_by_name(Emit::tree(), K->construct->name_of_printing_rule_ACTIONS);
|
||||
Produce::find_by_name(Emit::tree(), K->construct->ACTIONS_identifier);
|
||||
else
|
||||
K->construct->trace_iname =
|
||||
Produce::find_by_name(Emit::tree(), I"DA_Name");
|
||||
|
@ -544,14 +544,14 @@ not, it returns |NULL|.
|
|||
=
|
||||
text_stream *Kinds::Behaviour::get_explicit_I6_GPR(kind *K) {
|
||||
if (K == NULL) internal_error("Kinds::Behaviour::get_explicit_I6_GPR on null kind");
|
||||
return K->construct->explicit_i6_GPR;
|
||||
return K->construct->explicit_GPR_identifier;
|
||||
}
|
||||
|
||||
#ifdef CORE_MODULE
|
||||
inter_name *Kinds::Behaviour::get_explicit_I6_GPR_iname(kind *K) {
|
||||
if (K == NULL) internal_error("Kinds::Behaviour::get_explicit_I6_GPR on null kind");
|
||||
if (Str::len(K->construct->explicit_i6_GPR) > 0)
|
||||
return Produce::find_by_name(Emit::tree(), K->construct->explicit_i6_GPR);
|
||||
if (Str::len(K->construct->explicit_GPR_identifier) > 0)
|
||||
return Produce::find_by_name(Emit::tree(), K->construct->explicit_GPR_identifier);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
@ -561,7 +561,7 @@ inter_name *Kinds::Behaviour::get_explicit_I6_GPR_iname(kind *K) {
|
|||
=
|
||||
int Kinds::Behaviour::offers_I6_GPR(kind *K) {
|
||||
if (K == NULL) return FALSE;
|
||||
return K->construct->has_i6_GPR;
|
||||
return K->construct->has_GPR;
|
||||
}
|
||||
|
||||
@ Request that a GPR be compiled for this kind; the return value tell us whether
|
||||
|
@ -570,8 +570,8 @@ this will be allowed or not.
|
|||
=
|
||||
int Kinds::Behaviour::request_I6_GPR(kind *K) {
|
||||
if (K == NULL) return FALSE;
|
||||
if (K->construct->has_i6_GPR == FALSE) return FALSE; /* can't oblige */
|
||||
K->construct->I6_GPR_needed = TRUE; /* make note to oblige later */
|
||||
if (K->construct->has_GPR == FALSE) return FALSE; /* can't oblige */
|
||||
K->construct->needs_GPR = TRUE; /* make note to oblige later */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -580,7 +580,7 @@ int Kinds::Behaviour::request_I6_GPR(kind *K) {
|
|||
=
|
||||
int Kinds::Behaviour::needs_I6_GPR(kind *K) {
|
||||
if (K == NULL) return FALSE;
|
||||
return K->construct->I6_GPR_needed;
|
||||
return K->construct->needs_GPR;
|
||||
}
|
||||
|
||||
@ A recognition-only GPR is used for matching specific data in the course of
|
||||
|
|
|
@ -256,7 +256,7 @@ void Kinds::Dimensions::record_multiplication_rule(kind *left, kind *right, kind
|
|||
|
||||
for (dimr = dimrs->multiplications; dimr; dimr = dimr->next)
|
||||
if (dimr->right == right) {
|
||||
KindsModule::problem_handler(DimensionRedundant_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(DimensionRedundant_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -298,13 +298,13 @@ void Kinds::Dimensions::dim_set_multiplication(kind *left, kind *right,
|
|||
if ((Kinds::is_proper_constructor(left)) ||
|
||||
(Kinds::is_proper_constructor(right)) ||
|
||||
(Kinds::is_proper_constructor(outcome))) {
|
||||
KindsModule::problem_handler(DimensionNotBaseKOV_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(DimensionNotBaseKOV_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
if ((Kinds::Behaviour::is_quasinumerical(left) == FALSE) ||
|
||||
(Kinds::Behaviour::is_quasinumerical(right) == FALSE) ||
|
||||
(Kinds::Behaviour::is_quasinumerical(outcome) == FALSE)) {
|
||||
KindsModule::problem_handler(NonDimensional_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(NonDimensional_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
Kinds::Dimensions::record_multiplication_rule(left, right, outcome);
|
||||
|
@ -490,7 +490,7 @@ to deal with |UNKNOWN_NT| explicitly.
|
|||
accident, but we'll be careful:
|
||||
|
||||
@<Trip a unit sequence overflow@> =
|
||||
KindsModule::problem_handler(UnitSequenceOverflow_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(UnitSequenceOverflow_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
return;
|
||||
|
||||
@ The second operation is taking roots.
|
||||
|
@ -728,7 +728,7 @@ the Kinds index page more helpful. But we must reject a contradiction.
|
|||
Kinds::Behaviour::get_dimensional_form(terms[1]), 1, &product);
|
||||
if (Kinds::Dimensions::compare_unit_sequences(&product,
|
||||
Kinds::Behaviour::get_dimensional_form(terms[2])) == FALSE)
|
||||
KindsModule::problem_handler(DimensionsInconsistent_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(DimensionsInconsistent_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
|
||||
@h Classifying the units.
|
||||
Some of the derived units are dimensionless, others not. |number| and
|
||||
|
|
|
@ -371,7 +371,7 @@ some existing notation, in which case the |equiv| flag is set.
|
|||
(sc->scaling_mode == LP_SCALED_DOWN) ||
|
||||
(equiv) ||
|
||||
((sc->scaling_mode == LP_SCALED_AT) && (sc->use_integer_scaling == FALSE))))
|
||||
KindsModule::problem_handler(LPCantScaleYet_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(LPCantScaleYet_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
sc->int_M = sc->int_scalar;
|
||||
|
||||
@ The harder case, when some scalings already exist for this kind. Firstly,
|
||||
|
@ -382,7 +382,7 @@ scalings (metric units such as mm, km, etc.) already have their |M| value.
|
|||
@<Determine M for a subsequent scaling of the list@> =
|
||||
if (((sc->int_scalar != 1) || (sc->real_scalar != 1.0)) &&
|
||||
((alt) && (sc->scaling_mode == LP_SCALED_AT)))
|
||||
KindsModule::problem_handler(LPCantScaleTwice_KINDERROR, NULL, NULL, NULL);
|
||||
KindsModule::problem_handler(LPCantScaleTwice_KINDERROR, NULL, NULL, NULL, NULL);
|
||||
|
||||
if (equiv)
|
||||
@<Calculate the multiplier for this equivalent scaling@>
|
||||
|
|
|
@ -1,703 +1,11 @@
|
|||
[KindCommands::] Kind Commands.
|
||||
|
||||
To parse and act upon individual commands from Neptune files.
|
||||
To apply a given command to a given kind constructor.
|
||||
|
||||
@ Everyone loves a mini-language, so here is one. At the top level:
|
||||
|
||||
(a) Lines consisting of white space or whose first non-white space character is
|
||||
|!| are ignored as comments.
|
||||
|
||||
(b) A line ending with a colon |:| opens a new block. The text before the colon
|
||||
is the title of the block, except that the first character indicates its type:
|
||||
(-1) An asterisk means that the block is a template definition: for instance,
|
||||
|*PRINTING-ROUTINE:| says the block defines a template called |PRINTING-ROUTINE|.
|
||||
A template consists of Inform 7 source text which extends as far as the next
|
||||
|*END| line.
|
||||
(-2) A sharp sign |#| means that the block is a macro definition. For
|
||||
instance, |#UNIT:| says the block defines a template called |UNIT|. A macro
|
||||
is just a sequence of lines holding kind commands which continues to
|
||||
the beginning of the next block, or the end of the file.
|
||||
(-3) And otherwise the block is a kind definition, but the optional opening
|
||||
character |+| marks the kind as one which Inform requires the existence of.
|
||||
Thus |+NUMBER_TY:|, since Inform will crash if the template doesn't set this
|
||||
kind up, but |BOOJUMS_TY:| would validly declare a new kind called
|
||||
|BOOJUMS_TY| which isn't special to any of Inform's internals. The |+| signs
|
||||
are there as a help for hackers looking at the I6 template and wondering what
|
||||
they can safely monkey with.
|
||||
|
||||
@ The body of a kind definition is a sequence of one-line commands setting
|
||||
what properties the kind has. These commands take the form of a name, a colon,
|
||||
and an operand; for instance,
|
||||
= (text)
|
||||
i6-printing-routine-actions:DA_Number
|
||||
=
|
||||
The operands have different types, and the possibilities are given here:
|
||||
|
||||
@d NO_KCA -1 /* there's no operand */
|
||||
|
||||
@d BOOLEAN_KCA 1 /* must be |yes| or |no| */
|
||||
@d CCM_KCA 2 /* a constant compilation method */
|
||||
@d TEXT_KCA 3 /* any text (no quotation marks or other delimiters are used) */
|
||||
@d VOCABULARY_KCA 4 /* any single word */
|
||||
@d NUMERIC_KCA 5 /* any decimal number */
|
||||
@d CONSTRUCTOR_KCA 6 /* any valid kind number, such as "number" */
|
||||
@d TEMPLATE_KCA 7 /* the name of a template whose definition is given in the file */
|
||||
@d MACRO_KCA 8 /* the name of a macro whose definition is given in the file */
|
||||
|
||||
@ When processing a command, we parse it into one of the following structures:
|
||||
|
||||
=
|
||||
typedef struct single_kind_command {
|
||||
struct kind_command_definition *which_kind_command;
|
||||
int boolean_argument; /* where appropriate */
|
||||
int numeric_argument; /* where appropriate */
|
||||
struct text_stream *textual_argument; /* where appropriate */
|
||||
int ccm_argument; /* where appropriate */
|
||||
struct word_assemblage vocabulary_argument; /* where appropriate */
|
||||
struct text_stream *constructor_argument; /* where appropriate */
|
||||
struct kind_template_definition *template_argument; /* where appropriate */
|
||||
struct kind_macro_definition *macro_argument; /* where appropriate */
|
||||
} single_kind_command;
|
||||
|
||||
@ A few of the commands connect pairs of kinds together: for instance,
|
||||
when we write
|
||||
= (text)
|
||||
cast:RULEBOOK_TY
|
||||
=
|
||||
in the definition block for |RULE_TY|, we're saying that every rulebook
|
||||
can always be cast implicitly to a rule. There can be any number of these
|
||||
in the definition block, so we need somewhere to store details, and the
|
||||
following structure provides an entry in a linked list.
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_casting_rule {
|
||||
struct text_stream *cast_from_kind_unparsed; /* to the one which has the rule */
|
||||
struct kind_constructor *cast_from_kind; /* to the one which has the rule */
|
||||
struct kind_constructor_casting_rule *next_casting_rule;
|
||||
} kind_constructor_casting_rule;
|
||||
|
||||
@ And this is the analogous structure for giving I6 schemas to compare
|
||||
data of two different kinds:
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_comparison_schema {
|
||||
struct text_stream *comparator_unparsed;
|
||||
struct kind_constructor *comparator;
|
||||
struct text_stream *comparison_schema;
|
||||
struct kind_constructor_comparison_schema *next_comparison_schema;
|
||||
} kind_constructor_comparison_schema;
|
||||
|
||||
@ And this is the analogous structure for giving I6 schemas to compare
|
||||
data of two different kinds:
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_instance {
|
||||
struct text_stream *instance_of_this_unparsed;
|
||||
struct kind_constructor *instance_of_this;
|
||||
struct kind_constructor_instance *next_instance_rule;
|
||||
} kind_constructor_instance;
|
||||
|
||||
@ And, to cut to the chase, here is the complete table of commands:
|
||||
|
||||
=
|
||||
kind_command_definition table_of_kind_commands[] = {
|
||||
{ "can-coincide-with-property", can_coincide_with_property_KCC, BOOLEAN_KCA },
|
||||
{ "can-exchange", can_exchange_KCC, BOOLEAN_KCA },
|
||||
{ "defined-in-source-text", defined_in_source_text_KCC, BOOLEAN_KCA },
|
||||
{ "has-i6-GPR", has_i6_GPR_KCC, BOOLEAN_KCA },
|
||||
{ "indexed-grey-if-empty", indexed_grey_if_empty_KCC, BOOLEAN_KCA },
|
||||
{ "is-incompletely-defined", is_incompletely_defined_KCC, BOOLEAN_KCA },
|
||||
{ "is-template-variable", is_template_variable_KCC, BOOLEAN_KCA },
|
||||
{ "multiple-block", multiple_block_KCC, BOOLEAN_KCA },
|
||||
{ "named-values-created-with-assertions",
|
||||
named_values_created_with_assertions_KCC, BOOLEAN_KCA },
|
||||
|
||||
{ "constant-compilation-method", constant_compilation_method_KCC, CCM_KCA },
|
||||
|
||||
{ "comparison-routine", comparison_routine_KCC, TEXT_KCA },
|
||||
{ "default-value", default_value_KCC, TEXT_KCA },
|
||||
{ "description", description_KCC, TEXT_KCA },
|
||||
{ "distinguisher", distinguisher_KCC, TEXT_KCA },
|
||||
{ "documentation-reference", documentation_reference_KCC, TEXT_KCA },
|
||||
{ "explicit-i6-GPR", explicit_i6_GPR_KCC, TEXT_KCA },
|
||||
{ "i6-printing-routine", i6_printing_routine_KCC, TEXT_KCA },
|
||||
{ "i6-printing-routine-actions", i6_printing_routine_actions_KCC, TEXT_KCA },
|
||||
{ "index-default-value", index_default_value_KCC, TEXT_KCA },
|
||||
{ "index-maximum-value", index_maximum_value_KCC, TEXT_KCA },
|
||||
{ "index-minimum-value", index_minimum_value_KCC, TEXT_KCA },
|
||||
{ "loop-domain-schema", loop_domain_schema_KCC, TEXT_KCA },
|
||||
{ "recognition-only-GPR", recognition_only_GPR_KCC, TEXT_KCA },
|
||||
{ "specification-text", specification_text_KCC, TEXT_KCA },
|
||||
|
||||
{ "cast", cast_KCC, CONSTRUCTOR_KCA },
|
||||
{ "comparison-schema", comparison_schema_KCC, CONSTRUCTOR_KCA },
|
||||
{ "conforms-to", conforms_to_KCC, CONSTRUCTOR_KCA },
|
||||
|
||||
{ "modifying-adjective", modifying_adjective_KCC, VOCABULARY_KCA },
|
||||
{ "plural", plural_KCC, VOCABULARY_KCA },
|
||||
{ "singular", singular_KCC, VOCABULARY_KCA },
|
||||
|
||||
{ "constructor-arity", constructor_arity_KCC, TEXT_KCA },
|
||||
{ "group", group_KCC, NUMERIC_KCA },
|
||||
{ "heap-size-estimate", heap_size_estimate_KCC, NUMERIC_KCA },
|
||||
{ "index-priority", index_priority_KCC, NUMERIC_KCA },
|
||||
{ "small-block-size", small_block_size_KCC, NUMERIC_KCA },
|
||||
{ "template-variable-number", template_variable_number_KCC, NUMERIC_KCA },
|
||||
|
||||
{ "apply-template", apply_template_KCC, TEMPLATE_KCA },
|
||||
|
||||
{ "apply-macro", apply_macro_KCC, MACRO_KCA },
|
||||
|
||||
{ NULL, -1, NO_KCA }
|
||||
};
|
||||
|
||||
@ Where each legal command is defined with a block like so:
|
||||
|
||||
=
|
||||
typedef struct kind_command_definition {
|
||||
char *text_of_command;
|
||||
int opcode_number;
|
||||
int operand_type;
|
||||
} kind_command_definition;
|
||||
|
||||
@ Macros and templates have their definitions stored in structures thus:
|
||||
|
||||
@d MAX_KIND_MACRO_LENGTH 20 /* maximum number of commands in any one macro */
|
||||
|
||||
=
|
||||
typedef struct kind_template_definition {
|
||||
struct text_stream *template_name; /* including the asterisk, e.g., |"*PRINTING-ROUTINE"| */
|
||||
struct text_stream *template_text;
|
||||
CLASS_DEFINITION
|
||||
} kind_template_definition;
|
||||
|
||||
typedef struct kind_macro_definition {
|
||||
struct text_stream *kind_macro_name; /* including the sharp, e.g., |"#UNIT"| */
|
||||
int kind_macro_line_count;
|
||||
struct single_kind_command kind_macro_line[MAX_KIND_MACRO_LENGTH];
|
||||
CLASS_DEFINITION
|
||||
} kind_macro_definition;
|
||||
|
||||
@ And this makes a note to insert the relevant chunk of I7 source text
|
||||
later on. (We do this because kind definitions are read very early on
|
||||
in Inform's run, whereas I7 source text can only be lexed later.)
|
||||
|
||||
=
|
||||
typedef struct kind_template_obligation {
|
||||
struct kind_template_definition *remembered_template; /* I7 source to insert... */
|
||||
struct kind_constructor *remembered_constructor; /* ...concerning this kind */
|
||||
CLASS_DEFINITION
|
||||
} kind_template_obligation;
|
||||
|
||||
@h Setting up the interpreter.
|
||||
|
||||
=
|
||||
void KindCommands::start(void) {
|
||||
}
|
||||
|
||||
@h The kind command despatcher.
|
||||
And this is where textual commands are received. (They come in from the
|
||||
template interpreter.) Comments and blank lines have already been stripped out.
|
||||
|
||||
A template absorbs the raw text of its definition, and ends with |*END|;
|
||||
whereas a macro absorbs the parsed form of its commands, and continues to
|
||||
the next new heading. (Templates can't use the same end syntax because
|
||||
they often need to contain I7 phrase definitions, where lines end with
|
||||
colons.)
|
||||
|
||||
=
|
||||
kind_constructor *constructor_described = NULL;
|
||||
|
||||
void KindCommands::despatch(parse_node_tree *T, text_stream *command) {
|
||||
if (KindCommands::recording_a_kind_template()) {
|
||||
if (Str::eq_wide_string(command, L"*END")) KindCommands::end_kind_template();
|
||||
else KindCommands::record_into_kind_template(command);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Str::get_last_char(command) == ':') {
|
||||
if (KindCommands::recording_a_kind_macro()) KindCommands::end_kind_macro();
|
||||
Str::delete_last_character(command); /* remove the terminal colon */
|
||||
@<Deal with the heading at the top of a kind command block@>;
|
||||
return;
|
||||
}
|
||||
|
||||
single_kind_command stc = KindCommands::parse_kind_command(command);
|
||||
|
||||
if (KindCommands::recording_a_kind_macro()) KindCommands::record_into_kind_macro(stc);
|
||||
else if (constructor_described) KindCommands::apply_kind_command(T, stc, constructor_described);
|
||||
else internal_error("kind command describes unspecified kind");
|
||||
}
|
||||
|
||||
@<Deal with the heading at the top of a kind command block@> =
|
||||
if (Str::get_first_char(command) == '#') KindCommands::begin_kind_macro(command);
|
||||
else if (Str::get_first_char(command) == '*') KindCommands::begin_kind_template(command);
|
||||
else {
|
||||
TEMPORARY_TEXT(name)
|
||||
Str::copy(name, command);
|
||||
int should_know = FALSE;
|
||||
if (Str::get_first_char(name) == '+') { Str::delete_first_character(name); should_know = TRUE; }
|
||||
int do_know = FamiliarKinds::is_known(name);
|
||||
if ((do_know == FALSE) && (should_know == TRUE))
|
||||
internal_error("kind command describes kind with no known name");
|
||||
if ((do_know == TRUE) && (should_know == FALSE))
|
||||
internal_error("kind command describes already-known kind");
|
||||
constructor_described =
|
||||
Kinds::Constructors::new(T, Kinds::get_construct(K_value), name, NULL);
|
||||
#ifdef NEW_BASE_KINDS_CALLBACK
|
||||
if ((constructor_described != CON_KIND_VARIABLE) &&
|
||||
(constructor_described != CON_INTERMEDIATE)) {
|
||||
NEW_BASE_KINDS_CALLBACK(
|
||||
Kinds::base_construction(constructor_described), NULL, name, EMPTY_WORDING);
|
||||
}
|
||||
#endif
|
||||
DISCARD_TEXT(name)
|
||||
}
|
||||
|
||||
@h Parsing single kind commands.
|
||||
Each command is read in as text, parsed and stored into a modest structure.
|
||||
|
||||
=
|
||||
single_kind_command KindCommands::parse_kind_command(text_stream *whole_command) {
|
||||
TEMPORARY_TEXT(command)
|
||||
TEMPORARY_TEXT(argument)
|
||||
single_kind_command stc;
|
||||
|
||||
@<Parse line into command and argument, divided by a colon@>;
|
||||
|
||||
@<Initialise the STC to a blank command@>;
|
||||
@<Identify the command being used@>;
|
||||
|
||||
switch(stc.which_kind_command->operand_type) {
|
||||
case BOOLEAN_KCA: @<Parse a boolean argument for a kind command@>; break;
|
||||
case CCM_KCA: @<Parse a CCM argument for a kind command@>; break;
|
||||
case CONSTRUCTOR_KCA: @<Parse a constructor-name argument for a kind command@>; break;
|
||||
case MACRO_KCA: @<Parse a macro name argument for a kind command@>; break;
|
||||
case NUMERIC_KCA: @<Parse a numeric argument for a kind command@>; break;
|
||||
case TEMPLATE_KCA: @<Parse a template name argument for a kind command@>; break;
|
||||
case TEXT_KCA: @<Parse a textual argument for a kind command@>; break;
|
||||
case VOCABULARY_KCA: @<Parse a vocabulary argument for a kind command@>; break;
|
||||
}
|
||||
DISCARD_TEXT(command)
|
||||
DISCARD_TEXT(argument)
|
||||
return stc;
|
||||
}
|
||||
|
||||
@<Initialise the STC to a blank command@> =
|
||||
stc.which_kind_command = NULL;
|
||||
stc.boolean_argument = NOT_APPLICABLE;
|
||||
stc.numeric_argument = 0;
|
||||
stc.textual_argument = Str::new();
|
||||
stc.ccm_argument = -1;
|
||||
stc.vocabulary_argument = WordAssemblages::lit_0();
|
||||
stc.constructor_argument = Str::new();
|
||||
stc.macro_argument = NULL;
|
||||
stc.template_argument = NULL;
|
||||
|
||||
@ Spaces and tabs after the colon are skipped; so a textual argument cannot
|
||||
begin with those characters, but that doesn't matter for the things we need.
|
||||
|
||||
@<Parse line into command and argument, divided by a colon@> =
|
||||
match_results mr = Regexp::create_mr();
|
||||
if (Regexp::match(&mr, whole_command, L" *(%c+?) *: *(%c+?) *")) {
|
||||
Str::copy(command, mr.exp[0]);
|
||||
Str::copy(argument, mr.exp[1]);
|
||||
Regexp::dispose_of(&mr);
|
||||
} else {
|
||||
NeptuneFiles::error(whole_command, "kind command without argument");
|
||||
}
|
||||
|
||||
@ The following is clearly inefficient, but is not worth optimising. It makes
|
||||
about 20 string comparisons per command, and there are about 600 commands in a
|
||||
typical run of Inform, so the total cost is about 12,000 comparisons with
|
||||
quite small strings as arguments -- which is negligible for our purposes,
|
||||
so we neglect it.
|
||||
|
||||
@<Identify the command being used@> =
|
||||
for (int i=0; table_of_kind_commands[i].text_of_command; i++)
|
||||
if (Str::eq_narrow_string(command, table_of_kind_commands[i].text_of_command))
|
||||
stc.which_kind_command = &(table_of_kind_commands[i]);
|
||||
|
||||
if (stc.which_kind_command == NULL)
|
||||
NeptuneFiles::error(command, "no such kind command");
|
||||
|
||||
@<Parse a boolean argument for a kind command@> =
|
||||
if (Str::eq_wide_string(argument, L"yes")) stc.boolean_argument = TRUE;
|
||||
else if (Str::eq_wide_string(argument, L"no")) stc.boolean_argument = FALSE;
|
||||
else NeptuneFiles::error(command, "boolean kind command takes yes/no argument");
|
||||
|
||||
@<Parse a CCM argument for a kind command@> =
|
||||
if (Str::eq_wide_string(argument, L"none")) stc.ccm_argument = NONE_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"literal")) stc.ccm_argument = LITERAL_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"quantitative")) stc.ccm_argument = NAMED_CONSTANT_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"special")) stc.ccm_argument = SPECIAL_CCM;
|
||||
else NeptuneFiles::error(command,
|
||||
"kind command with unknown constant-compilation-method");
|
||||
|
||||
@<Parse a textual argument for a kind command@> =
|
||||
Str::copy(stc.textual_argument, argument);
|
||||
|
||||
@<Parse a vocabulary argument for a kind command@> =
|
||||
stc.vocabulary_argument = WordAssemblages::lit_0();
|
||||
feed_t id = Feeds::begin();
|
||||
Feeds::feed_text(argument);
|
||||
wording W = Feeds::end(id);
|
||||
if (Wordings::length(W) >= 30)
|
||||
NeptuneFiles::error(command, "too many words in kind command");
|
||||
else
|
||||
stc.vocabulary_argument = WordAssemblages::from_wording(W);
|
||||
|
||||
@<Parse a numeric argument for a kind command@> =
|
||||
stc.numeric_argument = Str::atoi(argument, 0);
|
||||
|
||||
@<Parse a constructor-name argument for a kind command@> =
|
||||
match_results mr = Regexp::create_mr();
|
||||
if (Regexp::match(&mr, argument, L"(%c*?)>>>(%c+)")) {
|
||||
Str::copy(argument, mr.exp[0]);
|
||||
Str::copy(stc.textual_argument, mr.exp[1]);
|
||||
Regexp::dispose_of(&mr);
|
||||
}
|
||||
stc.constructor_argument = Str::duplicate(argument);
|
||||
|
||||
@<Parse a template name argument for a kind command@> =
|
||||
stc.template_argument = KindCommands::parse_kind_template_name(argument);
|
||||
if (stc.template_argument == NULL)
|
||||
NeptuneFiles::error(command, "unknown template name in kind command");
|
||||
|
||||
@<Parse a macro name argument for a kind command@> =
|
||||
stc.macro_argument = KindCommands::parse_kind_macro_name(argument);
|
||||
if (stc.macro_argument == NULL)
|
||||
NeptuneFiles::error(command, "unknown template name in kind command");
|
||||
|
||||
@h Source text templates.
|
||||
These are passages of I7 source text which can be inserted into the main
|
||||
source text at the request of any kind. An example would be:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
*END
|
||||
=
|
||||
The template |*UNDERSTOOD-VARIABLE| contains only a single sentence of source
|
||||
text, and the idea is to make a new global variable associated with a given
|
||||
kind. Note that the text is not quite literal, because it can contain
|
||||
wildcards like |<kind>|, which expands to the name of the kind of value in
|
||||
question: for instance, we might get
|
||||
|
||||
>> number understood is a number which varies.
|
||||
|
||||
There are a few limitations on what template text can include. Firstly,
|
||||
nothing with angle brackets in, except where a wildcard appears. Secondly,
|
||||
each sentence must end at the end of a line, and similarly the colon for
|
||||
any rule or other definition. Thus this template would fail:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which
|
||||
varies. To judge <kind>: say "I judge [<kind> understood]."
|
||||
*END
|
||||
=
|
||||
because the first sentence ends in the middle of the second line, and the
|
||||
colon dividing the phrase header from its definition is also mid-line. The
|
||||
template must be reformatted thus to work:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
To judge <kind>:
|
||||
say "I judge [<kind> understood]."
|
||||
*END
|
||||
=
|
||||
@ So, to begin:
|
||||
|
||||
=
|
||||
kind_template_definition *KindCommands::new_kind_template(text_stream *name) {
|
||||
kind_template_definition *ttd = CREATE(kind_template_definition);
|
||||
ttd->template_name = Str::duplicate(name);
|
||||
return ttd;
|
||||
}
|
||||
|
||||
kind_template_definition *KindCommands::parse_kind_template_name(text_stream *name) {
|
||||
kind_template_definition *ttd;
|
||||
LOOP_OVER(ttd, kind_template_definition)
|
||||
if (Str::eq(name, ttd->template_name))
|
||||
return ttd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ Here is the code which records templates, reading them as one line of plain
|
||||
text at a time. (In the above example, |KindCommands::record_into_kind_template| would be
|
||||
called just once, with the single source text line.)
|
||||
|
||||
=
|
||||
kind_template_definition *current_kind_template = NULL; /* the one now being recorded */
|
||||
|
||||
int KindCommands::recording_a_kind_template(void) {
|
||||
if (current_kind_template) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void KindCommands::begin_kind_template(text_stream *name) {
|
||||
if (current_kind_template) internal_error("first stt still recording");
|
||||
if (KindCommands::parse_kind_template_name(name))
|
||||
internal_error("duplicate definition of source text template");
|
||||
current_kind_template = KindCommands::new_kind_template(name);
|
||||
current_kind_template->template_text = KindCommands::begin_recording_kind_text();
|
||||
}
|
||||
|
||||
void KindCommands::record_into_kind_template(text_stream *line) {
|
||||
KindCommands::record_kind_text(line);
|
||||
}
|
||||
|
||||
void KindCommands::end_kind_template(void) {
|
||||
if (current_kind_template == NULL) internal_error("no stt currently recording");
|
||||
KindCommands::end_recording_kind_text();
|
||||
current_kind_template = NULL;
|
||||
}
|
||||
|
||||
@ So much for recording a template. To "play back", we need to take its text
|
||||
and squeeze it into the main source text.
|
||||
|
||||
=
|
||||
void KindCommands::transcribe_kind_template(parse_node_tree *T,
|
||||
kind_template_definition *ttd, kind_constructor *con) {
|
||||
if (ttd == NULL) internal_error("tried to transcribe missing source text template");
|
||||
#ifdef CORE_MODULE
|
||||
if ((Plugins::Manage::plugged_in(parsing_plugin) == FALSE) &&
|
||||
(Str::eq(ttd->template_name, I"*UNDERSTOOD-VARIABLE")))
|
||||
return;
|
||||
#endif
|
||||
text_stream *p = ttd->template_text;
|
||||
int i = 0;
|
||||
while (Str::get_at(p, i)) {
|
||||
if ((Str::get_at(p, i) == '\n') || (Str::get_at(p, i) == ' ')) { i++; continue; }
|
||||
TEMPORARY_TEXT(template_line_buffer)
|
||||
int terminator = 0;
|
||||
@<Transcribe one line of the template into the line buffer@>;
|
||||
if (Str::len(template_line_buffer) > 0) {
|
||||
wording XW = Feeds::feed_text(template_line_buffer);
|
||||
if (terminator != 0) Sentences::make_node(T, XW, terminator);
|
||||
}
|
||||
DISCARD_TEXT(template_line_buffer)
|
||||
}
|
||||
}
|
||||
|
||||
@ Inside template text, anything in angle brackets <...> is a wildcard.
|
||||
These cannot be nested and cannot include newlines. All other material is
|
||||
copied verbatim into the line buffer.
|
||||
|
||||
The only sentence terminators we recognise are full stop and colon; in
|
||||
particular we wouldn't recognise a stop inside quoted matter. This does
|
||||
not matter, since such things never come into kind definitions.
|
||||
|
||||
@<Transcribe one line of the template into the line buffer@> =
|
||||
while ((Str::get_at(p, i) != 0) && (Str::get_at(p, i) != '\n')) {
|
||||
if (Str::get_at(p, i) == '<') {
|
||||
TEMPORARY_TEXT(template_wildcard_buffer)
|
||||
i++;
|
||||
while ((Str::get_at(p, i) != 0) && (Str::get_at(p, i) != '\n') &&
|
||||
(Str::get_at(p, i) != '>'))
|
||||
PUT_TO(template_wildcard_buffer, Str::get_at(p, i++));
|
||||
i++;
|
||||
@<Transcribe the template wildcard@>;
|
||||
DISCARD_TEXT(template_wildcard_buffer)
|
||||
} else PUT_TO(template_line_buffer, Str::get_at(p, i++));
|
||||
}
|
||||
if (Str::get_last_char(template_line_buffer) == '.') {
|
||||
Str::delete_last_character(template_line_buffer); terminator = '.';
|
||||
}
|
||||
if (Str::get_last_char(template_line_buffer) == ':') {
|
||||
Str::delete_last_character(template_line_buffer); terminator = ':';
|
||||
}
|
||||
|
||||
@ Only five wildcards are recognised:
|
||||
|
||||
@<Transcribe the template wildcard@> =
|
||||
if (Str::eq_wide_string(template_wildcard_buffer, L"kind"))
|
||||
@<Transcribe the kind's name@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"lower-case-kind"))
|
||||
@<Transcribe the kind's name in lower case@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"kind-weak-ID"))
|
||||
@<Transcribe the kind's weak ID@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"printing-routine"))
|
||||
@<Transcribe the kind's I6 printing routine@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"comparison-routine"))
|
||||
@<Transcribe the kind's I6 comparison routine@>
|
||||
else internal_error("no such source text template wildcard");
|
||||
|
||||
@<Transcribe the kind's name@> =
|
||||
KindCommands::transcribe_constructor_name(template_line_buffer, con, FALSE);
|
||||
|
||||
@<Transcribe the kind's name in lower case@> =
|
||||
KindCommands::transcribe_constructor_name(template_line_buffer, con, TRUE);
|
||||
|
||||
@<Transcribe the kind's weak ID@> =
|
||||
WRITE_TO(template_line_buffer, "%d", con->weak_kind_ID);
|
||||
|
||||
@<Transcribe the kind's I6 printing routine@> =
|
||||
WRITE_TO(template_line_buffer, "%S", con->dt_I6_identifier);
|
||||
|
||||
@<Transcribe the kind's I6 comparison routine@> =
|
||||
WRITE_TO(template_line_buffer, "%S", con->comparison_routine);
|
||||
|
||||
@ Where:
|
||||
|
||||
=
|
||||
void KindCommands::transcribe_constructor_name(OUTPUT_STREAM, kind_constructor *con,
|
||||
int lower_case) {
|
||||
wording W = EMPTY_WORDING;
|
||||
if (con->dt_tag) W = Kinds::Constructors::get_name(con, FALSE);
|
||||
if (Wordings::nonempty(W)) {
|
||||
if (Kinds::Constructors::arity(con) > 0) {
|
||||
int full_length = Wordings::length(W);
|
||||
int i, w1 = Wordings::first_wn(W);
|
||||
for (i=0; i<full_length; i++) {
|
||||
if (i > 0) PUT(' ');
|
||||
vocabulary_entry *ve = Lexer::word(w1+i);
|
||||
if (ve == STROKE_V) break;
|
||||
if ((ve == CAPITAL_K_V) || (ve == CAPITAL_L_V)) WRITE("value");
|
||||
else WRITE("%V", ve);
|
||||
}
|
||||
} else {
|
||||
if (lower_case) WRITE("%+W", W);
|
||||
else WRITE("%W", W);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@h Type macros.
|
||||
These are much simpler, and are just lists of kind commands grouped together
|
||||
under names.
|
||||
|
||||
=
|
||||
kind_macro_definition *current_kind_macro = NULL; /* the one now being recorded */
|
||||
|
||||
kind_macro_definition *KindCommands::new_kind_macro(text_stream *name) {
|
||||
kind_macro_definition *tmd = CREATE(kind_macro_definition);
|
||||
tmd->kind_macro_line_count = 0;
|
||||
tmd->kind_macro_name = Str::duplicate(name);
|
||||
return tmd;
|
||||
}
|
||||
|
||||
kind_macro_definition *KindCommands::parse_kind_macro_name(text_stream *name) {
|
||||
kind_macro_definition *tmd;
|
||||
LOOP_OVER(tmd, kind_macro_definition)
|
||||
if (Str::eq(name, tmd->kind_macro_name))
|
||||
return tmd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ And here once again is the code to record macros:
|
||||
|
||||
=
|
||||
int KindCommands::recording_a_kind_macro(void) {
|
||||
if (current_kind_macro) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void KindCommands::begin_kind_macro(text_stream *name) {
|
||||
if (KindCommands::parse_kind_macro_name(name))
|
||||
internal_error("duplicate definition of kind command macro");
|
||||
current_kind_macro = KindCommands::new_kind_macro(name);
|
||||
}
|
||||
|
||||
void KindCommands::record_into_kind_macro(single_kind_command stc) {
|
||||
if (current_kind_macro == NULL)
|
||||
internal_error("kind macro not being recorded");
|
||||
if (current_kind_macro->kind_macro_line_count >= MAX_KIND_MACRO_LENGTH)
|
||||
internal_error("kind macro contains too many lines");
|
||||
current_kind_macro->kind_macro_line[current_kind_macro->kind_macro_line_count++] = stc;
|
||||
}
|
||||
|
||||
void KindCommands::end_kind_macro(void) {
|
||||
if (current_kind_macro == NULL) internal_error("ended kind macro outside one");
|
||||
current_kind_macro = NULL;
|
||||
}
|
||||
|
||||
@ Playing back is easier, since it's just a matter of despatching the stored
|
||||
commands in sequence to the relevant kind.
|
||||
|
||||
=
|
||||
void KindCommands::play_back_kind_macro(parse_node_tree *T, kind_macro_definition *macro,
|
||||
@ =
|
||||
void KindCommands::apply(parse_node_tree *T, single_kind_command stc,
|
||||
kind_constructor *con) {
|
||||
if (macro == NULL) internal_error("no such kind macro to play back");
|
||||
LOGIF(KIND_CREATIONS, "Macro %S on %S (%d lines)\n",
|
||||
macro->kind_macro_name, con->name_in_template_code, macro->kind_macro_line_count);
|
||||
LOG_INDENT;
|
||||
for (int i=0; i<macro->kind_macro_line_count; i++)
|
||||
KindCommands::apply_kind_command(T, macro->kind_macro_line[i], con);
|
||||
LOG_OUTDENT;
|
||||
LOGIF(KIND_CREATIONS, "Macro %S ended\n", macro->kind_macro_name);
|
||||
}
|
||||
|
||||
@h The kind text archiver.
|
||||
Large chunks of the text in the template will need to exist permanently in
|
||||
memory, and we go into recording mode to accept a series of them,
|
||||
concatenated with newlines dividing them, in a text stream.
|
||||
|
||||
=
|
||||
text_stream *kind_recording = NULL;
|
||||
|
||||
@ And here is recording mode:
|
||||
|
||||
=
|
||||
text_stream *KindCommands::begin_recording_kind_text(void) {
|
||||
kind_recording = Str::new();
|
||||
return kind_recording;
|
||||
}
|
||||
|
||||
void KindCommands::record_kind_text(text_stream *line) {
|
||||
if (kind_recording == NULL) internal_error("can't record outside recording");
|
||||
WRITE_TO(kind_recording, "%S\n", line);
|
||||
}
|
||||
|
||||
void KindCommands::end_recording_kind_text(void) {
|
||||
kind_recording = NULL;
|
||||
}
|
||||
|
||||
@h Applying kind commands.
|
||||
We take a single kind command and apply it to a given kind.
|
||||
|
||||
@d apply_macro_KCC 1
|
||||
@d apply_template_KCC 2
|
||||
@d can_coincide_with_property_KCC 5
|
||||
@d can_exchange_KCC 6
|
||||
@d cast_KCC 7
|
||||
@d comparison_routine_KCC 8
|
||||
@d comparison_schema_KCC 9
|
||||
@d constant_compilation_method_KCC 10
|
||||
@d constructor_arity_KCC 11
|
||||
@d default_value_KCC 12
|
||||
@d defined_in_source_text_KCC 13
|
||||
@d description_KCC 14
|
||||
@d distinguisher_KCC 15
|
||||
@d documentation_reference_KCC 16
|
||||
@d explicit_i6_GPR_KCC 17
|
||||
@d group_KCC 18
|
||||
@d has_i6_GPR_KCC 19
|
||||
@d heap_size_estimate_KCC 20
|
||||
@d i6_printing_routine_actions_KCC 21
|
||||
@d i6_printing_routine_KCC 22
|
||||
@d index_default_value_KCC 23
|
||||
@d index_maximum_value_KCC 24
|
||||
@d index_minimum_value_KCC 25
|
||||
@d indexed_grey_if_empty_KCC 26
|
||||
@d index_priority_KCC 27
|
||||
@d conforms_to_KCC 28
|
||||
@d is_incompletely_defined_KCC 29
|
||||
@d is_template_variable_KCC 30
|
||||
@d loop_domain_schema_KCC 31
|
||||
@d modifying_adjective_KCC 32
|
||||
@d multiple_block_KCC 33
|
||||
@d named_values_created_with_assertions_KCC 34
|
||||
@d plural_KCC 35
|
||||
@d recognition_only_GPR_KCC 36
|
||||
@d singular_KCC 37
|
||||
@d specification_text_KCC 38
|
||||
@d small_block_size_KCC 39
|
||||
@d template_variable_number_KCC 40
|
||||
|
||||
=
|
||||
void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command stc,
|
||||
kind_constructor *con) {
|
||||
if (stc.which_kind_command == NULL) internal_error("null STC command");
|
||||
if (stc.completed) return;
|
||||
LOGIF(KIND_CREATIONS, "apply: %s (%d/%d/%S/%S) to %d/%S\n",
|
||||
stc.which_kind_command->text_of_command,
|
||||
stc.boolean_argument, stc.numeric_argument,
|
||||
|
@ -712,16 +20,19 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
@<A few kind commands contribute to linked lists in the constructor structure@>;
|
||||
@<And the rest fill in fields in the constructor structure in miscellaneous other ways@>;
|
||||
|
||||
internal_error("unimplemented kind command");
|
||||
TEMPORARY_TEXT(cmd)
|
||||
WRITE_TO(cmd, "%s", stc.which_kind_command->text_of_command);
|
||||
NeptuneFiles::error(cmd, I"unimplemented kind command", stc.origin);
|
||||
DISCARD_TEXT(cmd)
|
||||
}
|
||||
|
||||
@<Apply kind macros or transcribe kind templates on request@> =
|
||||
switch (tcc) {
|
||||
case apply_template_KCC:
|
||||
KindCommands::transcribe_kind_template(T, stc.template_argument, con);
|
||||
StarTemplates::transcribe(T, stc.template_argument, con, stc.origin);
|
||||
return;
|
||||
case apply_macro_KCC:
|
||||
KindCommands::play_back_kind_macro(T, stc.macro_argument, con);
|
||||
NeptuneMacros::play_back(T, stc.macro_argument, con, stc.origin);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -737,11 +48,11 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
SET_BOOLEAN_FIELD(can_coincide_with_property)
|
||||
SET_BOOLEAN_FIELD(can_exchange)
|
||||
SET_BOOLEAN_FIELD(defined_in_source_text)
|
||||
SET_BOOLEAN_FIELD(has_i6_GPR)
|
||||
SET_BOOLEAN_FIELD(has_GPR)
|
||||
SET_BOOLEAN_FIELD(indexed_grey_if_empty)
|
||||
SET_BOOLEAN_FIELD(is_incompletely_defined)
|
||||
SET_BOOLEAN_FIELD(multiple_block)
|
||||
SET_BOOLEAN_FIELD(named_values_created_with_assertions)
|
||||
SET_BOOLEAN_FIELD(created_with_assertions)
|
||||
|
||||
SET_INTEGER_FIELD(group)
|
||||
SET_INTEGER_FIELD(heap_size_estimate)
|
||||
|
@ -753,7 +64,7 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
SET_TEXTUAL_FIELD(default_value)
|
||||
SET_TEXTUAL_FIELD(distinguisher)
|
||||
SET_TEXTUAL_FIELD(documentation_reference)
|
||||
SET_TEXTUAL_FIELD(explicit_i6_GPR)
|
||||
SET_TEXTUAL_FIELD(explicit_GPR_identifier)
|
||||
SET_TEXTUAL_FIELD(index_default_value)
|
||||
SET_TEXTUAL_FIELD(index_maximum_value)
|
||||
SET_TEXTUAL_FIELD(index_minimum_value)
|
||||
|
@ -802,16 +113,19 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
con->constructor_description = Str::duplicate(stc.textual_argument);
|
||||
return;
|
||||
case comparison_routine_KCC:
|
||||
if (Str::len(stc.textual_argument) > 31) internal_error("overlong I6 identifier");
|
||||
if (Str::len(stc.textual_argument) > 31)
|
||||
NeptuneFiles::error(stc.textual_argument, I"overlong identifier", stc.origin);
|
||||
else con->comparison_routine = Str::duplicate(stc.textual_argument);
|
||||
return;
|
||||
case i6_printing_routine_KCC:
|
||||
if (Str::len(stc.textual_argument) > 31) internal_error("overlong I6 identifier");
|
||||
else con->dt_I6_identifier = Str::duplicate(stc.textual_argument);
|
||||
if (Str::len(stc.textual_argument) > 31)
|
||||
NeptuneFiles::error(stc.textual_argument, I"overlong identifier", stc.origin);
|
||||
else con->print_identifier = Str::duplicate(stc.textual_argument);
|
||||
return;
|
||||
case i6_printing_routine_actions_KCC:
|
||||
if (Str::len(stc.textual_argument) > 31) internal_error("overlong I6 identifier");
|
||||
else con->name_of_printing_rule_ACTIONS = Str::duplicate(stc.textual_argument);
|
||||
if (Str::len(stc.textual_argument) > 31)
|
||||
NeptuneFiles::error(stc.textual_argument, I"overlong identifier", stc.origin);
|
||||
else con->ACTIONS_identifier = Str::duplicate(stc.textual_argument);
|
||||
return;
|
||||
case singular_KCC: case plural_KCC: {
|
||||
vocabulary_entry **array; int length;
|
||||
|
@ -855,7 +169,8 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
return;
|
||||
}
|
||||
case modifying_adjective_KCC:
|
||||
internal_error("the modifying-adjective syntax has been withdrawn");
|
||||
NeptuneFiles::error(NULL,
|
||||
I"the modifying-adjective syntax has been withdrawn", stc.origin);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -877,19 +192,8 @@ void KindCommands::apply_kind_command(parse_node_tree *T, single_kind_command st
|
|||
else if (Str::eq_wide_string(wd, L"contravariant")) con->variance[c] = CONTRAVARIANT;
|
||||
else if (Str::eq_wide_string(wd, L"optional")) con->tupling[c] = ALLOW_NOTHING_TUPLING;
|
||||
else if (Str::eq_wide_string(wd, L"list")) con->tupling[c] = ARBITRARY_TUPLING;
|
||||
else {
|
||||
LOG("Word: <%S>\n", wd);
|
||||
internal_error("illegal constructor-arity keyword");
|
||||
}
|
||||
else NeptuneFiles::error(wd, I"illegal constructor-arity keyword", stc.origin);
|
||||
}
|
||||
DISCARD_TEXT(wd)
|
||||
}
|
||||
con->constructor_arity = c+1;
|
||||
|
||||
@h Completing a batch.
|
||||
At one time it was useful to do some mopping-up work after a round of kind
|
||||
commands, so the following hook was devised; but at present it's not needed.
|
||||
|
||||
=
|
||||
void KindCommands::batch_done(void) {
|
||||
}
|
||||
|
|
|
@ -3,27 +3,20 @@
|
|||
The mechanism by which Inform records the characteristics of different
|
||||
kinds.
|
||||
|
||||
@ Constructors are divided into four:
|
||||
@ Constructors are divided into four groups:
|
||||
|
||||
@d KIND_VARIABLE_GRP 1 /* just |CON_KIND_VARIABLE| on its own */
|
||||
@d KIND_OF_KIND_GRP 2 /* an indefinite base constructor such as "arithmetic value" */
|
||||
@d BASE_CONSTRUCTOR_GRP 3 /* a definite one such as "number" */
|
||||
@d PROPER_CONSTRUCTOR_GRP 4 /* with positive arity, such as "list of K" */
|
||||
@d KIND_OF_KIND_GRP 2 /* such as |arithmetic value| */
|
||||
@d BASE_CONSTRUCTOR_GRP 3 /* such as |number| */
|
||||
@d PROPER_CONSTRUCTOR_GRP 4 /* with positive arity, such as "list of ..." */
|
||||
|
||||
@ Inform provides much more extensive facilities for kinds than most
|
||||
programming languages do for their types. As far as possible, we want to
|
||||
write this code in a generalised way, rather than writing hacky routines
|
||||
which each apply to a fixed, named kind. This won't always be possible, it's
|
||||
true, but we can try. The only way to achieve this is to store an enormous
|
||||
rag-bag of properties for every kind constructor, showing exactly how it
|
||||
behaves.
|
||||
@ Besides all the properties of kinds used in this module, Inform also needs
|
||||
to store further metadata in order to be able to make the extensive run-time
|
||||
code needed to support all these kinds in actual programs. All of this means
|
||||
that a //kind_constructor// object is a great big rag-bag of properties, some
|
||||
set by commands in Neptune files, others set by calls from Inform.
|
||||
|
||||
All of which is by way of apology for the enormous size of the |kind_constructor|
|
||||
structure. It looks impossibly large to fill out, and this is why we have the
|
||||
kind interpreter (see next section) to give the I6 template the ability to
|
||||
forge new kind constructors.
|
||||
|
||||
@d LOWEST_INDEX_PRIORITY 100
|
||||
So, deep breath:
|
||||
|
||||
@d MAX_KIND_CONSTRUCTION_ARITY 2
|
||||
|
||||
|
@ -33,7 +26,7 @@ typedef struct kind_constructor {
|
|||
int group; /* one of the four values above */
|
||||
|
||||
/* A: how this came into being */
|
||||
int defined_in_source_text; /* rather than by I6 template files, i.e., by being built-in */
|
||||
int defined_in_source_text; /* rather than by Neptune files, i.e., by being built-in */
|
||||
int is_incompletely_defined; /* newly defined and ambiguous as yet */
|
||||
struct parse_node *where_defined_in_source_text; /* if so */
|
||||
struct kind *stored_as; /* currently unused: if this is a typedef for some construction */
|
||||
|
@ -51,7 +44,7 @@ typedef struct kind_constructor {
|
|||
|
||||
/* D: how constant values of this kind are expressed */
|
||||
struct literal_pattern *ways_to_write_literals; /* list of ways to write this */
|
||||
int named_values_created_with_assertions; /* such as "Train Arrival is a scene." */
|
||||
int created_with_assertions; /* such as "Train Arrival is a scene." */
|
||||
struct table *named_values_created_with_table; /* alternatively... */
|
||||
int next_free_value; /* to make distinguishable instances of this kind */
|
||||
int constant_compilation_method; /* one of the |*_CCM| values */
|
||||
|
@ -71,8 +64,8 @@ typedef struct kind_constructor {
|
|||
int dimensional_form_fixed; /* whether they are derived */
|
||||
|
||||
/* H: representing this kind at run-time */
|
||||
int weak_kind_ID; /* as used at run-time by the I6 template */
|
||||
struct text_stream *name_in_template_code; /* an I6 identifier */
|
||||
int weak_kind_ID; /* as used at run-time by Inter code */
|
||||
struct text_stream *name_in_template_code; /* an Inter identifier */
|
||||
int class_number; /* for classes of object */
|
||||
#ifdef CORE_MODULE
|
||||
struct inter_name *con_iname;
|
||||
|
@ -84,9 +77,9 @@ typedef struct kind_constructor {
|
|||
int multiple_block; /* TRUE for flexible-size values stored on the heap */
|
||||
int heap_size_estimate; /* typical number of bytes used */
|
||||
int can_exchange; /* with external files and therefore other story files */
|
||||
struct text_stream *distinguisher; /* I6 routine to see if values distinguishable */
|
||||
struct text_stream *distinguisher; /* Inter routine to see if values distinguishable */
|
||||
struct kind_constructor_comparison_schema *first_comparison_schema; /* list of these */
|
||||
struct text_stream *loop_domain_schema; /* how to compile an I6 loop over the instances */
|
||||
struct text_stream *loop_domain_schema; /* how to compile a loop over the instances */
|
||||
|
||||
/* J: printing and parsing values at run-time */
|
||||
#ifdef BYTECODE_MODULE
|
||||
|
@ -100,12 +93,12 @@ typedef struct kind_constructor {
|
|||
struct inter_name *ranger_iname;
|
||||
struct inter_name *trace_iname;
|
||||
#endif
|
||||
struct text_stream *dt_I6_identifier; /* an I6 identifier used for compiling printing rules */
|
||||
struct text_stream *name_of_printing_rule_ACTIONS; /* ditto but for ACTIONS testing command */
|
||||
struct text_stream *print_identifier; /* an Inter identifier used for compiling printing rules */
|
||||
struct text_stream *ACTIONS_identifier; /* ditto but for ACTIONS testing command */
|
||||
struct grammar_verb *understand_as_values; /* used when parsing such values */
|
||||
int has_i6_GPR; /* a general parsing routine exists in the I6 code for this */
|
||||
int I6_GPR_needed; /* and is actually required */
|
||||
struct text_stream *explicit_i6_GPR; /* routine name, when not compiled automatically */
|
||||
int has_GPR; /* a general parsing routine exists in the Inter code for this */
|
||||
int needs_GPR; /* and is actually required */
|
||||
struct text_stream *explicit_GPR_identifier; /* routine name, when not compiled automatically */
|
||||
struct text_stream *recognition_only_GPR; /* for recognising an explicit value as preposition */
|
||||
|
||||
/* K: indexing and documentation */
|
||||
|
@ -122,6 +115,37 @@ typedef struct kind_constructor {
|
|||
CLASS_DEFINITION
|
||||
} kind_constructor;
|
||||
|
||||
@ A few of the settings connect pairs of kinds together, so structures like
|
||||
the following are also needed.
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_casting_rule {
|
||||
struct text_stream *cast_from_kind_unparsed; /* to the one which has the rule */
|
||||
struct kind_constructor *cast_from_kind; /* to the one which has the rule */
|
||||
struct kind_constructor_casting_rule *next_casting_rule;
|
||||
} kind_constructor_casting_rule;
|
||||
|
||||
@ And this is the analogous structure for giving Inter schemas to compare
|
||||
data of two different kinds:
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_comparison_schema {
|
||||
struct text_stream *comparator_unparsed;
|
||||
struct kind_constructor *comparator;
|
||||
struct text_stream *comparison_schema;
|
||||
struct kind_constructor_comparison_schema *next_comparison_schema;
|
||||
} kind_constructor_comparison_schema;
|
||||
|
||||
@ And this is the analogous structure for giving Inter schemas to compare
|
||||
data of two different kinds:
|
||||
|
||||
=
|
||||
typedef struct kind_constructor_instance {
|
||||
struct text_stream *instance_of_this_unparsed;
|
||||
struct kind_constructor *instance_of_this;
|
||||
struct kind_constructor_instance *next_instance_rule;
|
||||
} kind_constructor_instance;
|
||||
|
||||
@ The "tupling" of an argument is the extent to which an argument can be
|
||||
allowed to hold a variable-length list of kinds, rather than a single one.
|
||||
There aren't actually many possibilities.
|
||||
|
@ -145,19 +169,11 @@ int next_free_data_type_ID = 2; /* i.e., leaving room for |UNKNOWN_TY| to be 1 a
|
|||
kind *latest_base_kind_of_value = NULL;
|
||||
|
||||
@h Creation.
|
||||
Constructors come from two sources. Built-in ones like "number" or
|
||||
"list of K" mainly come from the commands given in the "Load-Core.i6t"
|
||||
template file, which consists almost entirely of commands for the kind
|
||||
interpreter, which sets up most of the above. (Similar files for other
|
||||
language plugins add the remainder.) Thus a great deal can be changed about
|
||||
the interplay of kinds without altering the compiler itself.
|
||||
|
||||
New kinds created by the source text, by sentences like "Air pressure is a
|
||||
kind of value", are always base constructors (i.e., they have arity 0); at
|
||||
present there's no way to create new kinds of kinds, or new constructors, in
|
||||
Inform source text. (So an extension wanting to make new constructors, say
|
||||
to add new "collection classes" to Inform, will have to get its hands
|
||||
dirty with Inform 6 insertions and use of the kind interpreter.)
|
||||
Constructors come from two sources. Built-in ones like |number| or
|
||||
|list of K| come from commands in //Neptune Files//, while source-created
|
||||
ones ("Air pressure is a kind of value") result in calls here from
|
||||
//Kinds::new_base// -- which, as the name suggests, can only make
|
||||
base kinds, not proper constructors.
|
||||
|
||||
Here |super| will be the super-constructor, the one which this will construct
|
||||
subkinds of. In practice this will be |NULL| when |CON_VALUE| is created, and
|
||||
|
@ -198,8 +214,9 @@ kind_constructor *Kinds::Constructors::new(parse_node_tree *T, kind_constructor
|
|||
|
||||
@ If our new constructor is wholly new, and isn't a subkind of something else,
|
||||
we need to initialise the entire data structure; but note that, having done so,
|
||||
we ask the kind interpreter to load it up with any defaults set in the
|
||||
I6 template files.
|
||||
we apply any defaults set in Neptune files.
|
||||
|
||||
@d LOWEST_INDEX_PRIORITY 100
|
||||
|
||||
@<Fill in a new constructor@> =
|
||||
con->dt_tag = NULL;
|
||||
|
@ -227,7 +244,7 @@ I6 template files.
|
|||
|
||||
/* D: how constant values of this kind are expressed */
|
||||
con->ways_to_write_literals = NULL;
|
||||
con->named_values_created_with_assertions = FALSE;
|
||||
con->created_with_assertions = FALSE;
|
||||
con->named_values_created_with_table = NULL;
|
||||
con->next_free_value = 1;
|
||||
con->constant_compilation_method = NONE_CCM;
|
||||
|
@ -269,8 +286,8 @@ I6 template files.
|
|||
con->loop_domain_schema = NULL;
|
||||
|
||||
/* J: printing and parsing values at run-time */
|
||||
con->dt_I6_identifier = Str::new();
|
||||
con->name_of_printing_rule_ACTIONS = Str::new();
|
||||
con->print_identifier = Str::new();
|
||||
con->ACTIONS_identifier = Str::new();
|
||||
#ifdef BYTECODE_MODULE
|
||||
con->kind_GPR_iname = NULL;
|
||||
con->instance_GPR_iname = NULL;
|
||||
|
@ -289,9 +306,9 @@ I6 template files.
|
|||
#endif
|
||||
|
||||
con->understand_as_values = NULL;
|
||||
con->has_i6_GPR = FALSE;
|
||||
con->I6_GPR_needed = FALSE;
|
||||
con->explicit_i6_GPR = NULL;
|
||||
con->has_GPR = FALSE;
|
||||
con->needs_GPR = FALSE;
|
||||
con->explicit_GPR_identifier = NULL;
|
||||
con->recognition_only_GPR = NULL;
|
||||
|
||||
/* K: indexing and documentation */
|
||||
|
@ -305,11 +322,11 @@ I6 template files.
|
|||
con->indexed_grey_if_empty = FALSE;
|
||||
con->documentation_reference = NULL;
|
||||
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(I"#DEFAULTS"), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(I"#DEFAULTS"), con, NULL);
|
||||
if (Str::len(initialisation_macro) > 0)
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(initialisation_macro), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(initialisation_macro), con, NULL);
|
||||
|
||||
@ However, if we create our constructor as a subkind, like so:
|
||||
|
||||
|
@ -363,15 +380,15 @@ noun *Kinds::Constructors::get_noun(kind_constructor *con) {
|
|||
return con->dt_tag;
|
||||
}
|
||||
|
||||
@h Names in the I6 template.
|
||||
@h Inter identifiers.
|
||||
An identifier like |WHATEVER_TY|, then, begins life in a definition inside an
|
||||
I6 template file; becomes attached to a constructor here; and finally winds up
|
||||
back in I6 code, because we define it as the constant for the weak kind ID
|
||||
Neptune file; becomes attached to a constructor here; and finally winds up
|
||||
back in Inter code, because we define it as the constant for the weak kind ID
|
||||
of the kind which the constructor makes:
|
||||
|
||||
=
|
||||
#ifdef CORE_MODULE
|
||||
void Kinds::Constructors::compile_I6_constants(void) {
|
||||
void Kinds::Constructors::emit_constants(void) {
|
||||
kind_constructor *con;
|
||||
LOOP_OVER(con, kind_constructor) {
|
||||
text_stream *tn = Kinds::Constructors::name_in_template_code(con);
|
||||
|
@ -452,8 +469,8 @@ require running macros in the kind interpreter:
|
|||
=
|
||||
int Kinds::Constructors::convert_to_unit(parse_node_tree *T, kind_constructor *con) {
|
||||
if (con->is_incompletely_defined == TRUE) {
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(I"#UNIT"), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(I"#UNIT"), con, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
if (Kinds::Constructors::is_arithmetic(con)) return TRUE; /* i.e., if it succeeded */
|
||||
|
@ -462,11 +479,11 @@ int Kinds::Constructors::convert_to_unit(parse_node_tree *T, kind_constructor *c
|
|||
|
||||
int Kinds::Constructors::convert_to_enumeration(parse_node_tree *T, kind_constructor *con) {
|
||||
if (con->is_incompletely_defined == TRUE) {
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(I"#ENUMERATION"), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(I"#ENUMERATION"), con, NULL);
|
||||
if (con->linguistic)
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(I"#LINGUISTIC"), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(I"#LINGUISTIC"), con, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
if (Kinds::Constructors::is_enumeration(con)) return TRUE; /* i.e., if it succeeded */
|
||||
|
@ -477,8 +494,8 @@ int Kinds::Constructors::convert_to_enumeration(parse_node_tree *T, kind_constru
|
|||
|
||||
=
|
||||
void Kinds::Constructors::convert_to_real(parse_node_tree *T, kind_constructor *con) {
|
||||
KindCommands::play_back_kind_macro(T,
|
||||
KindCommands::parse_kind_macro_name(I"#REAL"), con);
|
||||
NeptuneMacros::play_back(T,
|
||||
NeptuneMacros::parse_name(I"#REAL"), con, NULL);
|
||||
}
|
||||
|
||||
@ A few base kinds are marked as "linguistic", which simply enables us to fence
|
||||
|
|
75
services/kinds-module/Chapter 4/Macros.w
Normal file
75
services/kinds-module/Chapter 4/Macros.w
Normal file
|
@ -0,0 +1,75 @@
|
|||
[NeptuneMacros::] Macros.
|
||||
|
||||
Neptune supports named macros, though they are only lists of kind commands.
|
||||
|
||||
@
|
||||
|
||||
@d MAX_KIND_MACRO_LENGTH 20 /* maximum number of commands in any one macro */
|
||||
|
||||
=
|
||||
typedef struct kind_macro_definition {
|
||||
struct text_stream *kind_macro_name; /* including the sharp, e.g., |"#UNIT"| */
|
||||
int kind_macro_line_count;
|
||||
struct single_kind_command kind_macro_line[MAX_KIND_MACRO_LENGTH];
|
||||
CLASS_DEFINITION
|
||||
} kind_macro_definition;
|
||||
|
||||
kind_macro_definition *current_km = NULL; /* the one now being recorded */
|
||||
|
||||
kind_macro_definition *NeptuneMacros::new(text_stream *name) {
|
||||
kind_macro_definition *tmd = CREATE(kind_macro_definition);
|
||||
tmd->kind_macro_line_count = 0;
|
||||
tmd->kind_macro_name = Str::duplicate(name);
|
||||
return tmd;
|
||||
}
|
||||
|
||||
kind_macro_definition *NeptuneMacros::parse_name(text_stream *name) {
|
||||
kind_macro_definition *tmd;
|
||||
LOOP_OVER(tmd, kind_macro_definition)
|
||||
if (Str::eq(name, tmd->kind_macro_name))
|
||||
return tmd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int NeptuneMacros::recording(void) {
|
||||
if (current_km) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void NeptuneMacros::begin(text_stream *name, text_file_position *tfp) {
|
||||
if (NeptuneMacros::parse_name(name))
|
||||
NeptuneFiles::error(name, I"duplicate definition of kind command macro", tfp);
|
||||
else
|
||||
current_km = NeptuneMacros::new(name);
|
||||
}
|
||||
|
||||
void NeptuneMacros::record_into_macro(single_kind_command stc, text_file_position *tfp) {
|
||||
if (current_km == NULL)
|
||||
NeptuneFiles::error(NULL, I"kind macro not being recorded", tfp);
|
||||
else if (current_km->kind_macro_line_count >= MAX_KIND_MACRO_LENGTH)
|
||||
NeptuneFiles::error(current_km->kind_macro_name,
|
||||
I"kind macro contains too many lines", tfp);
|
||||
else current_km->kind_macro_line[current_km->kind_macro_line_count++] = stc;
|
||||
}
|
||||
|
||||
void NeptuneMacros::end(text_file_position *tfp) {
|
||||
if (current_km == NULL) NeptuneFiles::error(NULL,
|
||||
I"ended kind macro outside one", tfp);
|
||||
current_km = NULL;
|
||||
}
|
||||
|
||||
@ Playing back is easier, since it's just a matter of despatching the stored
|
||||
commands in sequence to the relevant kind.
|
||||
|
||||
=
|
||||
void NeptuneMacros::play_back(parse_node_tree *T, kind_macro_definition *macro,
|
||||
kind_constructor *con, text_file_position *tfp) {
|
||||
if (macro == NULL) NeptuneFiles::error(NULL, I"no such kind macro to play back", tfp);
|
||||
LOGIF(KIND_CREATIONS, "Macro %S on %S (%d lines)\n",
|
||||
macro->kind_macro_name, con->name_in_template_code, macro->kind_macro_line_count);
|
||||
LOG_INDENT;
|
||||
for (int i=0; i<macro->kind_macro_line_count; i++)
|
||||
KindCommands::apply(T, macro->kind_macro_line[i], con);
|
||||
LOG_OUTDENT;
|
||||
LOGIF(KIND_CREATIONS, "Macro %S ended\n", macro->kind_macro_name);
|
||||
}
|
|
@ -16,9 +16,20 @@ void NeptuneFiles::load(parse_node_tree *T, filename *F) {
|
|||
|
||||
void NeptuneFiles::load_kinds_helper(text_stream *text, text_file_position *tfp, void *state) {
|
||||
parse_node_tree *T = (parse_node_tree *) state;
|
||||
if ((Str::get_first_char(text) == '!') ||
|
||||
(Str::get_first_char(text) == 0)) return; /* skip blanks and comments */
|
||||
KindCommands::despatch(T, text);
|
||||
NeptuneFiles::read_command(T, text, tfp);
|
||||
}
|
||||
|
||||
void NeptuneFiles::read_command(parse_node_tree *T, text_stream *command,
|
||||
text_file_position *tfp) {
|
||||
if ((Str::get_first_char(command) == '!') ||
|
||||
(Str::get_first_char(command) == 0)) return; /* skip blanks and comments */
|
||||
|
||||
single_kind_command stc = NeptuneSyntax::parse_command(T, command, tfp);
|
||||
if (stc.completed) return;
|
||||
|
||||
if (NeptuneMacros::recording()) NeptuneMacros::record_into_macro(stc, tfp);
|
||||
else if (stc.defined_for) KindCommands::apply(T, stc, stc.defined_for);
|
||||
else NeptuneFiles::error(command, I"kind command describes unspecified kind", tfp);
|
||||
}
|
||||
|
||||
@ Neptune files are in the strange position in being not quite for end users --
|
||||
|
@ -30,14 +41,21 @@ meant to give future Inform hackers -- users who like to burrow into
|
|||
internals -- scope for play.
|
||||
|
||||
The Neptune files supplied with Inform's standard distribution are correct,
|
||||
so errors can only result from mistakes by such hackers. We strike a sort of
|
||||
middle position: when we fine errors, we won't feel obliged to produce
|
||||
elegant problem messages, and will instead throw internal errors or (in some
|
||||
cases) generate incorrect Inter code leading to internal errors later on.
|
||||
But we won't actually crash if we can help it.
|
||||
so errors can only result from mistakes by hackers. Until 2020 these simply
|
||||
threw internal errors; we now issue errors up to the user in such a way that
|
||||
the Inform GUI can at least display them, if not very elegantly.
|
||||
|
||||
=
|
||||
void NeptuneFiles::error(text_stream *command, char *error) {
|
||||
LOG("Kind command error found at: %S\n", command);
|
||||
internal_error(error);
|
||||
void NeptuneFiles::error(text_stream *command, text_stream *error,
|
||||
text_file_position *tfp) {
|
||||
TEMPORARY_TEXT(E)
|
||||
if (tfp)
|
||||
WRITE_TO(E,
|
||||
"error in Neptune file '%f', line %d ('%S'): %S",
|
||||
tfp->text_file_filename, tfp->line_count, command, error);
|
||||
else
|
||||
WRITE_TO(E,
|
||||
"error in Neptune command execution: %S", error);
|
||||
KindsModule::problem_handler(NeptuneError_KINDERROR, NULL, E, NULL, NULL);
|
||||
DISCARD_TEXT(E)
|
||||
}
|
||||
|
|
330
services/kinds-module/Chapter 4/Neptune Syntax.w
Normal file
330
services/kinds-module/Chapter 4/Neptune Syntax.w
Normal file
|
@ -0,0 +1,330 @@
|
|||
[NeptuneSyntax::] Neptune Syntax.
|
||||
|
||||
To parse individual commands from Neptune files.
|
||||
|
||||
@h Specification of the Neptune language.
|
||||
Everyone loves a mini-language, so here is one. At the top level:
|
||||
|
||||
(a) Lines consisting of white space or whose first non-white space character is
|
||||
|!| are ignored as comments.
|
||||
|
||||
(b) A line ending with a colon |:| opens a new block. The text before the colon
|
||||
is the title of the block, except that the first character indicates its type:
|
||||
(-1) An asterisk means that the block is a "star template": for instance,
|
||||
|*PRINTING-ROUTINE:| says the block defines a template called |PRINTING-ROUTINE|.
|
||||
A template consists of Inform 7 source text which extends as far as the next
|
||||
|*END| line.
|
||||
(-2) A sharp sign |#| means that the block is a macro definition. For
|
||||
instance, |#UNIT:| says the block defines a template called |UNIT|. A macro
|
||||
is just a sequence of lines holding kind commands which continues to
|
||||
the beginning of the next block, or the end of the file.
|
||||
(-3) And otherwise the block is a kind definition, but the optional opening
|
||||
character |+| marks the kind as one which Inform requires the existence of.
|
||||
Thus |+NUMBER_TY:|, since Inform will crash if the template doesn't set this
|
||||
kind up, but |BOOJUMS_TY:| would validly declare a new kind called
|
||||
|BOOJUMS_TY| which isn't special to any of Inform's internals. The |+| signs
|
||||
are there as a help for hackers looking at the I6 template and wondering what
|
||||
they can safely monkey with.
|
||||
|
||||
(c) That just leaves the lines within blocks. Each of these is a usage of one
|
||||
of the commands, given in the form |operation: operand|, i.e., divided by a
|
||||
colon and some optional spacing.
|
||||
|
||||
@h The command set.
|
||||
Each different operation is defined with a block like so:
|
||||
|
||||
=
|
||||
typedef struct kind_command_definition {
|
||||
char *text_of_command;
|
||||
int opcode_number; /* one of the |*_KCC| values below */
|
||||
int operand_type; /* one of the |*_KCA| values below */
|
||||
} kind_command_definition;
|
||||
|
||||
@ The operands have different types, and the possibilities are given here:
|
||||
|
||||
@e NO_KCA from 0 /* there's no operand */
|
||||
@e BOOLEAN_KCA /* must be |yes| or |no| */
|
||||
@e CCM_KCA /* a constant compilation method */
|
||||
@e TEXT_KCA /* any text (no quotation marks or other delimiters are used) */
|
||||
@e VOCABULARY_KCA /* any single word */
|
||||
@e NUMERIC_KCA /* any decimal number */
|
||||
@e CONSTRUCTOR_KCA /* any valid kind number, such as "number" */
|
||||
@e TEMPLATE_KCA /* the name of a template whose definition is given in the file */
|
||||
@e MACRO_KCA /* the name of a macro whose definition is given in the file */
|
||||
|
||||
@ And, to cut to the chase, here is the complete table of commands:
|
||||
|
||||
@e apply_macro_KCC from 1
|
||||
@e apply_template_KCC
|
||||
@e can_coincide_with_property_KCC
|
||||
@e can_exchange_KCC
|
||||
@e cast_KCC
|
||||
@e comparison_routine_KCC
|
||||
@e comparison_schema_KCC
|
||||
@e constant_compilation_method_KCC
|
||||
@e constructor_arity_KCC
|
||||
@e default_value_KCC
|
||||
@e defined_in_source_text_KCC
|
||||
@e description_KCC
|
||||
@e distinguisher_KCC
|
||||
@e documentation_reference_KCC
|
||||
@e explicit_GPR_identifier_KCC
|
||||
@e group_KCC
|
||||
@e has_GPR_KCC
|
||||
@e heap_size_estimate_KCC
|
||||
@e i6_printing_routine_actions_KCC
|
||||
@e i6_printing_routine_KCC
|
||||
@e index_default_value_KCC
|
||||
@e index_maximum_value_KCC
|
||||
@e index_minimum_value_KCC
|
||||
@e indexed_grey_if_empty_KCC
|
||||
@e index_priority_KCC
|
||||
@e conforms_to_KCC
|
||||
@e is_incompletely_defined_KCC
|
||||
@e is_template_variable_KCC
|
||||
@e loop_domain_schema_KCC
|
||||
@e modifying_adjective_KCC
|
||||
@e multiple_block_KCC
|
||||
@e created_with_assertions_KCC
|
||||
@e plural_KCC
|
||||
@e recognition_only_GPR_KCC
|
||||
@e singular_KCC
|
||||
@e specification_text_KCC
|
||||
@e small_block_size_KCC
|
||||
@e template_variable_number_KCC
|
||||
|
||||
=
|
||||
kind_command_definition table_of_kind_commands[] = {
|
||||
{ "can-coincide-with-property", can_coincide_with_property_KCC, BOOLEAN_KCA },
|
||||
{ "can-exchange", can_exchange_KCC, BOOLEAN_KCA },
|
||||
{ "defined-in-source-text", defined_in_source_text_KCC, BOOLEAN_KCA },
|
||||
{ "has-i6-GPR", has_GPR_KCC, BOOLEAN_KCA },
|
||||
{ "indexed-grey-if-empty", indexed_grey_if_empty_KCC, BOOLEAN_KCA },
|
||||
{ "is-incompletely-defined", is_incompletely_defined_KCC, BOOLEAN_KCA },
|
||||
{ "is-template-variable", is_template_variable_KCC, BOOLEAN_KCA },
|
||||
{ "multiple-block", multiple_block_KCC, BOOLEAN_KCA },
|
||||
{ "created-with-assertions", created_with_assertions_KCC, BOOLEAN_KCA },
|
||||
|
||||
{ "constant-compilation-method", constant_compilation_method_KCC, CCM_KCA },
|
||||
|
||||
{ "comparison-routine", comparison_routine_KCC, TEXT_KCA },
|
||||
{ "default-value", default_value_KCC, TEXT_KCA },
|
||||
{ "description", description_KCC, TEXT_KCA },
|
||||
{ "distinguisher", distinguisher_KCC, TEXT_KCA },
|
||||
{ "documentation-reference", documentation_reference_KCC, TEXT_KCA },
|
||||
{ "explicit-i6-GPR", explicit_GPR_identifier_KCC, TEXT_KCA },
|
||||
{ "i6-printing-routine", i6_printing_routine_KCC, TEXT_KCA },
|
||||
{ "i6-printing-routine-actions", i6_printing_routine_actions_KCC, TEXT_KCA },
|
||||
{ "index-default-value", index_default_value_KCC, TEXT_KCA },
|
||||
{ "index-maximum-value", index_maximum_value_KCC, TEXT_KCA },
|
||||
{ "index-minimum-value", index_minimum_value_KCC, TEXT_KCA },
|
||||
{ "loop-domain-schema", loop_domain_schema_KCC, TEXT_KCA },
|
||||
{ "recognition-only-GPR", recognition_only_GPR_KCC, TEXT_KCA },
|
||||
{ "specification-text", specification_text_KCC, TEXT_KCA },
|
||||
|
||||
{ "cast", cast_KCC, CONSTRUCTOR_KCA },
|
||||
{ "comparison-schema", comparison_schema_KCC, CONSTRUCTOR_KCA },
|
||||
{ "conforms-to", conforms_to_KCC, CONSTRUCTOR_KCA },
|
||||
|
||||
{ "modifying-adjective", modifying_adjective_KCC, VOCABULARY_KCA },
|
||||
{ "plural", plural_KCC, VOCABULARY_KCA },
|
||||
{ "singular", singular_KCC, VOCABULARY_KCA },
|
||||
|
||||
{ "constructor-arity", constructor_arity_KCC, TEXT_KCA },
|
||||
{ "group", group_KCC, NUMERIC_KCA },
|
||||
{ "heap-size-estimate", heap_size_estimate_KCC, NUMERIC_KCA },
|
||||
{ "index-priority", index_priority_KCC, NUMERIC_KCA },
|
||||
{ "small-block-size", small_block_size_KCC, NUMERIC_KCA },
|
||||
{ "template-variable-number", template_variable_number_KCC, NUMERIC_KCA },
|
||||
|
||||
{ "apply-template", apply_template_KCC, TEMPLATE_KCA },
|
||||
|
||||
{ "apply-macro", apply_macro_KCC, MACRO_KCA },
|
||||
|
||||
{ NULL, -1, NO_KCA }
|
||||
};
|
||||
|
||||
@ When processing a command, we parse it into one of the following structures:
|
||||
|
||||
=
|
||||
typedef struct single_kind_command {
|
||||
struct kind_command_definition *which_kind_command;
|
||||
int boolean_argument; /* where appropriate */
|
||||
int numeric_argument; /* where appropriate */
|
||||
struct text_stream *textual_argument; /* where appropriate */
|
||||
int ccm_argument; /* where appropriate */
|
||||
struct word_assemblage vocabulary_argument; /* where appropriate */
|
||||
struct text_stream *constructor_argument; /* where appropriate */
|
||||
struct kind_template_definition *template_argument; /* where appropriate */
|
||||
struct kind_macro_definition *macro_argument; /* where appropriate */
|
||||
struct text_file_position *origin;
|
||||
struct kind_constructor *defined_for;
|
||||
int completed;
|
||||
} single_kind_command;
|
||||
|
||||
@h Parsing single kind commands.
|
||||
Each command is read in as text, parsed and stored into a modest structure.
|
||||
|
||||
=
|
||||
kind_constructor *constructor_described = NULL;
|
||||
|
||||
single_kind_command NeptuneSyntax::parse_command(parse_node_tree *T,
|
||||
text_stream *whole_command, text_file_position *tfp) {
|
||||
single_kind_command stc;
|
||||
@<Initialise the STC to a blank command@>;
|
||||
|
||||
Str::trim_white_space(whole_command);
|
||||
if (StarTemplates::recording()) {
|
||||
if (Str::eq(whole_command, I"*END")) StarTemplates::end(whole_command, tfp);
|
||||
else StarTemplates::record_line(whole_command, tfp);
|
||||
stc.completed = TRUE;
|
||||
} else if (Str::get_last_char(whole_command) == ':') {
|
||||
if (NeptuneMacros::recording()) NeptuneMacros::end(tfp);
|
||||
Str::delete_last_character(whole_command); /* remove the terminal colon */
|
||||
if (Str::get_first_char(whole_command) == '#') NeptuneMacros::begin(whole_command, tfp);
|
||||
else if (Str::get_first_char(whole_command) == '*') StarTemplates::begin(whole_command, tfp);
|
||||
else @<Create a new constructor@>;
|
||||
stc.completed = TRUE;
|
||||
} else {
|
||||
TEMPORARY_TEXT(command)
|
||||
TEMPORARY_TEXT(argument)
|
||||
|
||||
@<Parse line into command and argument, divided by a colon@>;
|
||||
|
||||
@<Identify the command being used@>;
|
||||
|
||||
switch(stc.which_kind_command->operand_type) {
|
||||
case BOOLEAN_KCA: @<Parse a boolean argument for a kind command@>; break;
|
||||
case CCM_KCA: @<Parse a CCM argument for a kind command@>; break;
|
||||
case CONSTRUCTOR_KCA: @<Parse a constructor-name argument for a kind command@>; break;
|
||||
case MACRO_KCA: @<Parse a macro name argument for a kind command@>; break;
|
||||
case NUMERIC_KCA: @<Parse a numeric argument for a kind command@>; break;
|
||||
case TEMPLATE_KCA: @<Parse a template name argument for a kind command@>; break;
|
||||
case TEXT_KCA: @<Parse a textual argument for a kind command@>; break;
|
||||
case VOCABULARY_KCA: @<Parse a vocabulary argument for a kind command@>; break;
|
||||
}
|
||||
DISCARD_TEXT(command)
|
||||
DISCARD_TEXT(argument)
|
||||
}
|
||||
return stc;
|
||||
}
|
||||
|
||||
@<Initialise the STC to a blank command@> =
|
||||
stc.which_kind_command = NULL;
|
||||
stc.boolean_argument = NOT_APPLICABLE;
|
||||
stc.numeric_argument = 0;
|
||||
stc.textual_argument = Str::new();
|
||||
stc.ccm_argument = -1;
|
||||
stc.vocabulary_argument = WordAssemblages::lit_0();
|
||||
stc.constructor_argument = Str::new();
|
||||
stc.macro_argument = NULL;
|
||||
stc.template_argument = NULL;
|
||||
stc.completed = FALSE;
|
||||
stc.origin = tfp;
|
||||
stc.defined_for = constructor_described;
|
||||
|
||||
@<Create a new constructor@> =
|
||||
TEMPORARY_TEXT(name)
|
||||
Str::copy(name, whole_command);
|
||||
int should_know = FALSE;
|
||||
if (Str::get_first_char(name) == '+') { Str::delete_first_character(name); should_know = TRUE; }
|
||||
int do_know = FamiliarKinds::is_known(name);
|
||||
if ((do_know == FALSE) && (should_know == TRUE))
|
||||
NeptuneFiles::error(whole_command, I"kind command describes kind with no known name", tfp);
|
||||
if ((do_know == TRUE) && (should_know == FALSE))
|
||||
NeptuneFiles::error(whole_command, I"kind command describes already-known kind", tfp);
|
||||
constructor_described =
|
||||
Kinds::Constructors::new(T, Kinds::get_construct(K_value), name, NULL);
|
||||
#ifdef NEW_BASE_KINDS_CALLBACK
|
||||
if ((constructor_described != CON_KIND_VARIABLE) &&
|
||||
(constructor_described != CON_INTERMEDIATE)) {
|
||||
NEW_BASE_KINDS_CALLBACK(
|
||||
Kinds::base_construction(constructor_described), NULL, name, EMPTY_WORDING);
|
||||
}
|
||||
#endif
|
||||
DISCARD_TEXT(name)
|
||||
|
||||
@ Spaces and tabs after the colon are skipped; so a textual argument cannot
|
||||
begin with those characters, but that doesn't matter for the things we need.
|
||||
|
||||
@<Parse line into command and argument, divided by a colon@> =
|
||||
match_results mr = Regexp::create_mr();
|
||||
if (Regexp::match(&mr, whole_command, L" *(%c+?) *: *(%c+?) *")) {
|
||||
Str::copy(command, mr.exp[0]);
|
||||
Str::copy(argument, mr.exp[1]);
|
||||
Regexp::dispose_of(&mr);
|
||||
} else {
|
||||
NeptuneFiles::error(whole_command, I"kind command without argument", tfp);
|
||||
}
|
||||
|
||||
@ The following is clearly inefficient, but is not worth optimising. It makes
|
||||
about 20 string comparisons per command, and there are about 600 commands in a
|
||||
typical run of Inform, so the total cost is about 12,000 comparisons with
|
||||
quite small strings as arguments -- which is negligible for our purposes,
|
||||
so we neglect it.
|
||||
|
||||
@<Identify the command being used@> =
|
||||
for (int i=0; table_of_kind_commands[i].text_of_command; i++)
|
||||
if (Str::eq_narrow_string(command, table_of_kind_commands[i].text_of_command))
|
||||
stc.which_kind_command = &(table_of_kind_commands[i]);
|
||||
|
||||
if (stc.which_kind_command == NULL) {
|
||||
NeptuneFiles::error(command, I"no such kind command", tfp);
|
||||
stc.completed = TRUE; return stc;
|
||||
}
|
||||
|
||||
@<Parse a boolean argument for a kind command@> =
|
||||
if (Str::eq_wide_string(argument, L"yes")) stc.boolean_argument = TRUE;
|
||||
else if (Str::eq_wide_string(argument, L"no")) stc.boolean_argument = FALSE;
|
||||
else NeptuneFiles::error(command, I"boolean kind command takes yes/no argument", tfp);
|
||||
|
||||
@<Parse a CCM argument for a kind command@> =
|
||||
if (Str::eq_wide_string(argument, L"none")) stc.ccm_argument = NONE_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"literal")) stc.ccm_argument = LITERAL_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"quantitative")) stc.ccm_argument = NAMED_CONSTANT_CCM;
|
||||
else if (Str::eq_wide_string(argument, L"special")) stc.ccm_argument = SPECIAL_CCM;
|
||||
else {
|
||||
NeptuneFiles::error(command,
|
||||
I"kind command with unknown constant-compilation-method", tfp);
|
||||
stc.completed = TRUE; return stc;
|
||||
}
|
||||
|
||||
@<Parse a textual argument for a kind command@> =
|
||||
Str::copy(stc.textual_argument, argument);
|
||||
|
||||
@<Parse a vocabulary argument for a kind command@> =
|
||||
stc.vocabulary_argument = WordAssemblages::lit_0();
|
||||
feed_t id = Feeds::begin();
|
||||
Feeds::feed_text(argument);
|
||||
wording W = Feeds::end(id);
|
||||
if (Wordings::length(W) >= 30) {
|
||||
NeptuneFiles::error(command, I"too many words in kind command", tfp);
|
||||
stc.completed = TRUE; return stc;
|
||||
} else
|
||||
stc.vocabulary_argument = WordAssemblages::from_wording(W);
|
||||
|
||||
@<Parse a numeric argument for a kind command@> =
|
||||
stc.numeric_argument = Str::atoi(argument, 0);
|
||||
|
||||
@<Parse a constructor-name argument for a kind command@> =
|
||||
match_results mr = Regexp::create_mr();
|
||||
if (Regexp::match(&mr, argument, L"(%c*?)>>>(%c+)")) {
|
||||
Str::copy(argument, mr.exp[0]);
|
||||
Str::copy(stc.textual_argument, mr.exp[1]);
|
||||
Regexp::dispose_of(&mr);
|
||||
}
|
||||
stc.constructor_argument = Str::duplicate(argument);
|
||||
|
||||
@<Parse a template name argument for a kind command@> =
|
||||
stc.template_argument = StarTemplates::parse_name(argument);
|
||||
if (stc.template_argument == NULL) {
|
||||
NeptuneFiles::error(command, I"unknown template name in kind command", tfp);
|
||||
stc.completed = TRUE; return stc;
|
||||
}
|
||||
|
||||
@<Parse a macro name argument for a kind command@> =
|
||||
stc.macro_argument = NeptuneMacros::parse_name(argument);
|
||||
if (stc.macro_argument == NULL) {
|
||||
NeptuneFiles::error(command, I"unknown template name in kind command", tfp);
|
||||
stc.completed = TRUE; return stc;
|
||||
}
|
235
services/kinds-module/Chapter 4/Star Templates.w
Normal file
235
services/kinds-module/Chapter 4/Star Templates.w
Normal file
|
@ -0,0 +1,235 @@
|
|||
[StarTemplates::] Star Templates.
|
||||
|
||||
Allowing Neptune files to generate additional source text.
|
||||
|
||||
@ These are passages of I7 source text which can be inserted into the main
|
||||
source text at the request of any kind. An example would be:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
*END
|
||||
=
|
||||
The template |*UNDERSTOOD-VARIABLE| contains only a single sentence of source
|
||||
text, and the idea is to make a new global variable associated with a given
|
||||
kind. Note that the text is not quite literal, because it can contain
|
||||
wildcards like |<kind>|, which expands to the name of the kind of value in
|
||||
question: for instance, we might get
|
||||
|
||||
>> number understood is a number which varies.
|
||||
|
||||
There are a few limitations on what template text can include. Firstly,
|
||||
nothing with angle brackets in, except where a wildcard appears. Secondly,
|
||||
each sentence must end at the end of a line, and similarly the colon for
|
||||
any rule or other definition. Thus this template would fail:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which
|
||||
varies. To judge <kind>: say "I judge [<kind> understood]."
|
||||
*END
|
||||
=
|
||||
because the first sentence ends in the middle of the second line, and the
|
||||
colon dividing the phrase header from its definition is also mid-line. The
|
||||
template must be reformatted thus to work:
|
||||
= (text)
|
||||
*UNDERSTOOD-VARIABLE:
|
||||
<kind> understood is a <kind> which varies.
|
||||
To judge <kind>:
|
||||
say "I judge [<kind> understood]."
|
||||
*END
|
||||
=
|
||||
@ So, to begin:
|
||||
|
||||
=
|
||||
typedef struct kind_template_definition {
|
||||
struct text_stream *template_name; /* including the asterisk, e.g., |"*PRINTING-ROUTINE"| */
|
||||
struct text_stream *template_text;
|
||||
CLASS_DEFINITION
|
||||
} kind_template_definition;
|
||||
|
||||
kind_template_definition *StarTemplates::new(text_stream *name) {
|
||||
kind_template_definition *ttd = CREATE(kind_template_definition);
|
||||
ttd->template_name = Str::duplicate(name);
|
||||
return ttd;
|
||||
}
|
||||
|
||||
kind_template_definition *StarTemplates::parse_name(text_stream *name) {
|
||||
kind_template_definition *ttd;
|
||||
LOOP_OVER(ttd, kind_template_definition)
|
||||
if (Str::eq(name, ttd->template_name))
|
||||
return ttd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ Here is the code which records templates, reading them as one line of plain
|
||||
text at a time. (In the above example, |StarTemplates::record_line| would be
|
||||
called just once, with the single source text line.)
|
||||
|
||||
=
|
||||
kind_template_definition *current_kind_template = NULL; /* the one now being recorded */
|
||||
|
||||
int StarTemplates::recording(void) {
|
||||
if (current_kind_template) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void StarTemplates::begin(text_stream *name, text_file_position *tfp) {
|
||||
if (current_kind_template) NeptuneFiles::error(name, I"first stt still recording", tfp);
|
||||
if (StarTemplates::parse_name(name))
|
||||
NeptuneFiles::error(name, I"duplicate definition of source text template", tfp);
|
||||
current_kind_template = StarTemplates::new(name);
|
||||
current_kind_template->template_text = StarTemplates::open_spool();
|
||||
}
|
||||
|
||||
void StarTemplates::record_line(text_stream *line, text_file_position *tfp) {
|
||||
StarTemplates::record_to_spool(line, tfp);
|
||||
}
|
||||
|
||||
void StarTemplates::end(text_stream *command, text_file_position *tfp) {
|
||||
if (current_kind_template == NULL)
|
||||
NeptuneFiles::error(command, I"no stt currently recording", tfp);
|
||||
else
|
||||
StarTemplates::close_spool();
|
||||
current_kind_template = NULL;
|
||||
}
|
||||
|
||||
@ So much for recording a template. To "play back", we need to take its text
|
||||
and squeeze it into the main source text.
|
||||
|
||||
=
|
||||
void StarTemplates::transcribe(parse_node_tree *T,
|
||||
kind_template_definition *ttd, kind_constructor *con, text_file_position *tfp) {
|
||||
if (ttd == NULL) {
|
||||
NeptuneFiles::error(NULL, I"tried to transcribe missing source text template", tfp);
|
||||
return;
|
||||
}
|
||||
#ifdef CORE_MODULE
|
||||
if ((Plugins::Manage::plugged_in(parsing_plugin) == FALSE) &&
|
||||
(Str::eq(ttd->template_name, I"*UNDERSTOOD-VARIABLE")))
|
||||
return;
|
||||
#endif
|
||||
text_stream *p = ttd->template_text;
|
||||
int i = 0;
|
||||
while (Str::get_at(p, i)) {
|
||||
if ((Str::get_at(p, i) == '\n') || (Str::get_at(p, i) == ' ')) { i++; continue; }
|
||||
TEMPORARY_TEXT(template_line_buffer)
|
||||
int terminator = 0;
|
||||
@<Transcribe one line of the template into the line buffer@>;
|
||||
if (Str::len(template_line_buffer) > 0) {
|
||||
wording XW = Feeds::feed_text(template_line_buffer);
|
||||
if (terminator != 0) Sentences::make_node(T, XW, terminator);
|
||||
}
|
||||
DISCARD_TEXT(template_line_buffer)
|
||||
}
|
||||
}
|
||||
|
||||
@ Inside template text, anything in angle brackets <...> is a wildcard.
|
||||
These cannot be nested and cannot include newlines. All other material is
|
||||
copied verbatim into the line buffer.
|
||||
|
||||
The only sentence terminators we recognise are full stop and colon; in
|
||||
particular we wouldn't recognise a stop inside quoted matter. This does
|
||||
not matter, since such things never come into kind definitions.
|
||||
|
||||
@<Transcribe one line of the template into the line buffer@> =
|
||||
while ((Str::get_at(p, i) != 0) && (Str::get_at(p, i) != '\n')) {
|
||||
if (Str::get_at(p, i) == '<') {
|
||||
TEMPORARY_TEXT(template_wildcard_buffer)
|
||||
i++;
|
||||
while ((Str::get_at(p, i) != 0) && (Str::get_at(p, i) != '\n') &&
|
||||
(Str::get_at(p, i) != '>'))
|
||||
PUT_TO(template_wildcard_buffer, Str::get_at(p, i++));
|
||||
i++;
|
||||
@<Transcribe the template wildcard@>;
|
||||
DISCARD_TEXT(template_wildcard_buffer)
|
||||
} else PUT_TO(template_line_buffer, Str::get_at(p, i++));
|
||||
}
|
||||
if (Str::get_last_char(template_line_buffer) == '.') {
|
||||
Str::delete_last_character(template_line_buffer); terminator = '.';
|
||||
}
|
||||
if (Str::get_last_char(template_line_buffer) == ':') {
|
||||
Str::delete_last_character(template_line_buffer); terminator = ':';
|
||||
}
|
||||
|
||||
@ Only five wildcards are recognised:
|
||||
|
||||
@<Transcribe the template wildcard@> =
|
||||
if (Str::eq_wide_string(template_wildcard_buffer, L"kind"))
|
||||
@<Transcribe the kind's name@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"lower-case-kind"))
|
||||
@<Transcribe the kind's name in lower case@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"kind-weak-ID"))
|
||||
@<Transcribe the kind's weak ID@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"printing-routine"))
|
||||
@<Transcribe the kind's I6 printing routine@>
|
||||
else if (Str::eq_wide_string(template_wildcard_buffer, L"comparison-routine"))
|
||||
@<Transcribe the kind's I6 comparison routine@>
|
||||
else
|
||||
NeptuneFiles::error(template_wildcard_buffer,
|
||||
I"no such source text template wildcard", tfp);
|
||||
|
||||
@<Transcribe the kind's name@> =
|
||||
StarTemplates::transcribe_constructor_name(template_line_buffer, con, FALSE);
|
||||
|
||||
@<Transcribe the kind's name in lower case@> =
|
||||
StarTemplates::transcribe_constructor_name(template_line_buffer, con, TRUE);
|
||||
|
||||
@<Transcribe the kind's weak ID@> =
|
||||
WRITE_TO(template_line_buffer, "%d", con->weak_kind_ID);
|
||||
|
||||
@<Transcribe the kind's I6 printing routine@> =
|
||||
WRITE_TO(template_line_buffer, "%S", con->print_identifier);
|
||||
|
||||
@<Transcribe the kind's I6 comparison routine@> =
|
||||
WRITE_TO(template_line_buffer, "%S", con->comparison_routine);
|
||||
|
||||
@ Where:
|
||||
|
||||
=
|
||||
void StarTemplates::transcribe_constructor_name(OUTPUT_STREAM, kind_constructor *con,
|
||||
int lower_case) {
|
||||
wording W = EMPTY_WORDING;
|
||||
if (con->dt_tag) W = Kinds::Constructors::get_name(con, FALSE);
|
||||
if (Wordings::nonempty(W)) {
|
||||
if (Kinds::Constructors::arity(con) > 0) {
|
||||
int full_length = Wordings::length(W);
|
||||
int i, w1 = Wordings::first_wn(W);
|
||||
for (i=0; i<full_length; i++) {
|
||||
if (i > 0) PUT(' ');
|
||||
vocabulary_entry *ve = Lexer::word(w1+i);
|
||||
if (ve == STROKE_V) break;
|
||||
if ((ve == CAPITAL_K_V) || (ve == CAPITAL_L_V)) WRITE("value");
|
||||
else WRITE("%V", ve);
|
||||
}
|
||||
} else {
|
||||
if (lower_case) WRITE("%+W", W);
|
||||
else WRITE("%W", W);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@h Spooling text.
|
||||
Large chunks of the text in the template will need to exist permanently in
|
||||
memory, and we go into recording mode to accept a series of them,
|
||||
concatenated with newlines dividing them, in a text stream.
|
||||
|
||||
=
|
||||
text_stream *kind_recording = NULL;
|
||||
|
||||
@ And here is recording mode:
|
||||
|
||||
=
|
||||
text_stream *StarTemplates::open_spool(void) {
|
||||
kind_recording = Str::new();
|
||||
return kind_recording;
|
||||
}
|
||||
|
||||
void StarTemplates::record_to_spool(text_stream *line, text_file_position *tfp) {
|
||||
if (kind_recording == NULL)
|
||||
NeptuneFiles::error(line, I"can't record outside recording", tfp);
|
||||
else
|
||||
WRITE_TO(kind_recording, "%S\n", line);
|
||||
}
|
||||
|
||||
void StarTemplates::close_spool(void) {
|
||||
kind_recording = NULL;
|
||||
}
|
|
@ -25,5 +25,8 @@ Chapter 3: Arithmetic
|
|||
|
||||
Chapter 4: Constructors
|
||||
Neptune Files
|
||||
Macros
|
||||
Neptune Syntax
|
||||
Star Templates
|
||||
Kind Commands
|
||||
Kind Constructors
|
||||
|
|
|
@ -66,7 +66,7 @@ See //Kinds::make_subkind//.
|
|||
|
||||
(*) |NEW_BASE_KINDS_CALLBACK| is called when a new base kind (properly
|
||||
speaking, a new arity-0 kind constructor) is made. See //Kinds::new_base//
|
||||
and //KindCommands::despatch// -- there are two ways this can happen.
|
||||
and //NeptuneFiles::read_command// -- there are two ways this can happen.
|
||||
|
||||
(*) |NOTIFY_NATURAL_LANGUAGE_KINDS_CALLBACK| is called when the kind "natural
|
||||
language" is created (if it is): see //FamiliarKinds::notice_new_kind//.
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue