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

160 lines
13 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>19/tod</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '19/lr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#19">Chapter 19: Table Data</a></li><li><b>Listed-In Relations</b></li></ul><p class="purpose">To define the binary predicates corresponding to table columns, and which determine whether a given value is listed in that column.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Initial stock</a></li><li><a href="#SP2">&#167;2. Subsequent creations</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP6">&#167;6. Assertion</a></li><li><a href="#SP7">&#167;7. Compilation</a></li><li><a href="#SP8">&#167;8. Problem message text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Initial stock. </b>There is none, since no tables or columns exist when Inform starts up.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_create_initial_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_create_initial_stock is used in 6/bp (<a href="6-bp.html#SP45">&#167;45</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Subsequent creations. </b>When a column called, say, "pledged delegate count" appears in one or more
tables in the source text, Inform creates a <code class="display"><span class="extract">table_column</span></code> structure to
represent the common identity of all table columns with this name. (They
are required all to share the same kind of value in their entries.) For
each different table column, a BP is created to represent the meaning
of "X is a pledged delegate count listed in T". Arguably there should just
be one super-powerful predicate <code class="display"><span class="extract">listed-in(X, C, T)</span></code>, but that would need
to be a ternary predicate, not binary, and Inform doesn't at present support
those. So we make a one-parameter family of <code class="display"><span class="extract">listed-in-C(X, T)</span></code> binary
predicates instead.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Tables::Relations::make_listed_in_predicate</span><span class="plain">(</span><span class="reserved">table_column</span><span class="plain"> *</span><span class="identifier">tc</span><span class="plain">) {</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="constant">LISTED_IN_KBP</span><span class="plain">,</span>
<span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_table</span><span class="plain">)),</span>
<span class="identifier">I</span><span class="string">"listed_in"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lists-in"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="functiontext">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"(ct_1=ExistsTableRowCorr(ct_0=*2,%d,*1))"</span><span class="plain">,</span>
<span class="functiontext">Tables::Columns::get_id</span><span class="plain">(</span><span class="identifier">tc</span><span class="plain">)),</span>
<span class="identifier">WordAssemblages::lit_0</span><span class="plain">());</span>
<span class="identifier">bp</span><span class="plain">-</span><span class="element">&gt;a_listed_in_predicate</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::make_listed_in_predicate is used in 19/tc (<a href="19-tc.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Once again there is a timing constraint. Tables are created quite early
on in Inform's run, but the entries in the columns aren't parsed until much
later. Since the kind of value stored in a column is often determined only
by looking at those values, it follows that we can't specify what goes into
the left-hand term at the time when the column is created. So we fill this
in later, instead:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tables::Relations::supply_kind_for_listed_in_tc</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="functiontext">BinaryPredicates::set_term_domain</span><span class="plain">(&amp;(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">&gt;term_details</span><span class="plain">[0]), </span><span class="identifier">K</span><span class="plain">);</span>
<span class="functiontext">BinaryPredicates::set_term_domain</span><span class="plain">(&amp;(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">&gt;reversal</span><span class="plain">-</span><span class="element">&gt;term_details</span><span class="plain">[1]), </span><span class="identifier">K</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::supply_kind_for_listed_in_tc is used in 19/tc (<a href="19-tc.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Second stock. </b>By this time, they all exist.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_create_second_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_create_second_stock is used in 6/bp (<a href="6-bp.html#SP46">&#167;46</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Typechecking. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_typecheck</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="identifier">kind</span><span class="plain"> **</span><span class="identifier">kinds_of_terms</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> **</span><span class="identifier">kinds_required</span><span class="plain">, </span><span class="reserved">tc_problem_kit</span><span class="plain"> *</span><span class="identifier">tck</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">DECLINE_TO_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_typecheck is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Assertion. </b>These relations cannot be asserted.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_assert</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec0</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs1</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec1</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_assert is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Compilation. </b>Note the side-effect here: we ensure that the <code class="display"><span class="extract">ct</span></code> local variables will be
present in the current stack frame, since we're going to need them to hold
the table reference for any successful lookup.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_compile</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">, </span><span class="reserved">annotated_i6_schema</span><span class="plain"> *</span><span class="identifier">asch</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain"> == </span><span class="constant">TEST_ATOM_TASK</span><span class="plain">) </span><span class="functiontext">LocalVariables::add_table_lookup</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_compile is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Problem message text. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tables::Relations::REL_describe_for_problems</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"the listed in relation"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Tables::Relations::REL_describe_for_problems is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="19-tod.html">Back to 'Tables of Definitions'</a></li><li><i>(This section ends Chapter 19: Table Data.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>