mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
160 lines
13 KiB
HTML
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">★</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">§1. Initial stock</a></li><li><a href="#SP2">§2. Subsequent creations</a></li><li><a href="#SP4">§4. Second stock</a></li><li><a href="#SP5">§5. Typechecking</a></li><li><a href="#SP6">§6. Assertion</a></li><li><a href="#SP7">§7. Compilation</a></li><li><a href="#SP8">§8. Problem message text</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§45</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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">>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">§4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§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">(&(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">>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">(&(</span><span class="identifier">bp</span><span class="plain">-</span><span class="element">>reversal</span><span class="plain">-</span><span class="element">>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">§6</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§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">§46</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§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>
|
|
|