mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 10:04:21 +03:00
669 lines
81 KiB
HTML
669 lines
81 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>1/trn</title>
|
|
<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="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
</ul>
|
|
<h2>Inform7 Modules</h2>
|
|
<ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../problems-module/index.html">problems</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="../kinds-module/index.html">kinds</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="../inter-module/index.html">inter</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '1/pck' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Packaging</b></li></ul><p class="purpose">To manage requests to build Inter packages, and then to generate inames within them; and to create modules and submodules.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Package requests</a></li><li><a href="#SP10">§10. Bubbles</a></li><li><a href="#SP11">§11. Outside the packages</a></li><li><a href="#SP12">§12. Entry and exit</a></li><li><a href="#SP13">§13. Incarnation</a></li><li><a href="#SP14">§14. Compilation modules</a></li><li><a href="#SP15">§15. Modules</a></li><li><a href="#SP16">§16. Submodules</a></li><li><a href="#SP19">§19. Functions</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Package requests. </b>In the same way that inames are created as shadows of eventual inter symbols,
|
|
and omly converted into the real thing on demand, "package requests" are
|
|
shadowy packages. The process of turning them into real inter packages is
|
|
called "incarnation".
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_PRCS_AT_ONCE</span><span class="plain"> 11</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">for_tree</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">eventual_name</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">eventual_type</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">actual_package</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">parent_request</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">write_position</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">iname_generators</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inter_name_generator</span></code></span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">package_request</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure package_request is accessed in 1/hl and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">) {</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_name</span><span class="plain"> = </span><span class="identifier">name</span><span class="plain">;</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_type</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">;</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain"> = </span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::at_start_of_this_repository</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>iname_generators</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::request is used in <a href="#SP15">§15</a>, <a href="#SP18">§18</a>, <a href="#SP19">§19</a>, <a href="#SP20">§20</a>, 1/bs (<a href="1-bs.html#SP2">§2</a>), 1/hl (<a href="1-hl.html#SP4">§4</a>, <a href="1-hl.html#SP5">§5</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>In the debugging log, package requests are printed in a form looking a
|
|
little like URLs, except that they run in the reverse order, innermost first
|
|
and outermost last: to make this more visually clear, backslashes rather
|
|
than forward slashes are used as dividers.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::log</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vR</span><span class="plain">) {</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = (</span><span class="reserved">package_request</span><span class="plain"> *) </span><span class="identifier">vR</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<null-package>"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">++ > 0) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain">)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain">));</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"'%n'"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_name</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::log is used in 1/bm (<a href="1-bm.html#SP4_5">§4.5</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>The following allows a sequence of different inames to be generated inside a
|
|
package: for example, <code class="display"><span class="extract">Packaging::make_iname_within(R, I"acorn")</span></code> produces a
|
|
sequence of inames <code class="display"><span class="extract">acorn1</span></code>, <code class="display"><span class="extract">acorn2</span></code>, ..., as it's called over and over again.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::make_iname_within</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">what_for</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no request"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>iname_generators</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>iname_generators</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inter_name_generator</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">inter_name_generator</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inter_name_generator</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>iname_generators</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">what_for</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">>name_stem</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">InterNames::generated_in</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, -1, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">gen</span><span class="plain"> = </span><span class="functiontext">InterNames::multiple_use_generator</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">what_for</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">inter_name_generator</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>iname_generators</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">InterNames::generated_in</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, -1, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::make_iname_within is used in 1/hl (<a href="1-hl.html#SP5">§5</a>), 3/pi (<a href="3-pi.html#SP3">§3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>At any given time, emission of Inter is occurring to a particular position
|
|
(in some incarnated package) and in the context of a given enclosure. This
|
|
is summarised by the following state:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">packaging_state</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">saved_IRS</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">saved_enclosure</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">packaging_state</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure packaging_state is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>It is not legal to write to the following state, which exists only to
|
|
initialise variables to neutral contents (and thus to avoid warnings
|
|
generated because clang is not able to prove that they will not be used
|
|
in an uninitialised state — though in fact they will not).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::stateless</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">PS</span><span class="plain">;</span>
|
|
<span class="identifier">PS</span><span class="element">.saved_IRS</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">PS</span><span class="element">.saved_enclosure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">PS</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::stateless is used in 1/bs (<a href="1-bs.html#SP2">§2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>We will store the current state at all times in the building site:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_IRS</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_enclosure</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::at is used in <a href="#SP10">§10</a>, <a href="#SP11">§11</a>, <a href="#SP13">§13</a>, 3/pi (<a href="3-pi.html#SP2">§2</a>, <a href="3-pi.html#SP3">§3</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::enclosure is used in <a href="#SP12">§12</a>, <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>States are intentionally very lightweight, and in particular they contain
|
|
pointers to the IBM structures rather than containing a copy thereof. But
|
|
those pointers have to point somewhere, and this is where: to a stack of
|
|
IBM structures.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain"> >= </span><span class="constant">MAX_PACKAGING_ENTRY_DEPTH</span><span class="plain">)</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"packaging entry too deep"</span><span class="plain">);</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_stack</span><span class="plain">[</span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain">] = </span><span class="identifier">IBM</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> &(</span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_stack</span><span class="plain">[</span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain">++]);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::pop_IRS</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain"> <= 0) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"package stack underflow"</span><span class="plain">);</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain">--;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::push_IRS is used in <a href="#SP9">§9</a>, <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="endnote">The function Packaging::pop_IRS is used in <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>The current state has the following invariant: the IBM part always points to
|
|
a validly initialised <code class="display"><span class="extract">inter_bookmark</span></code>, and the enclosure part is always
|
|
either <code class="display"><span class="extract">NULL</span></code> or a package request which has an enclosing package type. (In
|
|
fact, it is null only fleetingly: as soon as the <code class="display"><span class="extract">main</span></code> package is created,
|
|
very early on, the enclosure is always an enclosing package.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::initialise_state</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::at_start_of_this_repository</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_enclosure</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain">) {</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_IRS</span><span class="plain"> = </span><span class="identifier">to</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">PR</span><span class="plain">) && (</span><span class="identifier">PR</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">PR</span><span class="plain">-</span><span class="element">>eventual_type</span><span class="plain">, </span><span class="identifier">ENCLOSING_IANN</span><span class="plain">) != 1))</span>
|
|
<span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">PR</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">;</span>
|
|
<span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state.saved_enclosure</span><span class="plain"> = </span><span class="identifier">PR</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::initialise_state is used in 1/bs (<a href="1-bs.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::set_state is used in <a href="#SP12">§12</a>, <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Bubbles. </b>Inter code is stored in memory as a singly-linked list. This is fast and
|
|
compact, but can make it awkward to insert material other than at the end,
|
|
particularly if one insertion leads to another close by, midway in the
|
|
process — which is exactly what can happen when incarnating a nested set
|
|
of packages.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We avoid all such difficulties by placing "bubbles" at positions in the
|
|
linked list where we will later need to return and place new material.
|
|
A bubble is simply a pair of nops (no operations); any later inserted
|
|
material will be placed between them.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="functiontext">Produce::nop</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="functiontext">Produce::nop</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="functiontext">Packaging::bubble_at</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">) {</span>
|
|
<span class="functiontext">Produce::nop_at</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
|
|
<span class="functiontext">Produce::nop_at</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::bubble is used in <a href="#SP11">§11</a>, <a href="#SP12">§12</a>, <a href="#SP13">§13</a>, 1/bs (<a href="1-bs.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::bubble_at appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Outside the packages. </b>The Inter specification calls for just a handful of resources to be placed
|
|
at the top level, outside even the <code class="display"><span class="extract">main</span></code> package. Using bubbles, we leave
|
|
room to insert those resources, then incarnate <code class="display"><span class="extract">main</span></code> and enter it.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::outside_all_packages</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
|
|
<span class="functiontext">Produce::version</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, 1);</span>
|
|
|
|
<span class="functiontext">Produce::comment</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Package types:"</span><span class="plain">);</span>
|
|
<span class="functiontext">Site::set_package_types</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext">Produce::comment</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Pragmas:"</span><span class="plain">);</span>
|
|
<span class="functiontext">Site::set_pragmas</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext">Produce::comment</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Primitives:"</span><span class="plain">);</span>
|
|
<span class="functiontext">Primitives::emit</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_plain"</span><span class="plain">); </span> <span class="comment">To ensure this is the first emitted ptype</span>
|
|
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_code"</span><span class="plain">); </span> <span class="comment">And this the second</span>
|
|
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_linkage"</span><span class="plain">); </span> <span class="comment">And this the third</span>
|
|
|
|
<span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="functiontext">Site::main_request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)); </span> <span class="comment">Which we never exit</span>
|
|
<span class="functiontext">Site::set_holdings</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::outside_all_packages appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Entry and exit. </b>Each PR contains a "write position". This is where emitted Inter code will go;
|
|
and it means that not all of the code inside a package needs to be written
|
|
at the same time. We can come and go as we please, adding code to packages
|
|
all over the hierarchy, simply by switching to the write position in the
|
|
package we wsnt to extend next.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">That switching is called "entering" a package. Every entry must be followed
|
|
by a matching exit, which restores the write position to where it was before
|
|
the entry. (The one exception is that the entry into <code class="display"><span class="extract">main</span></code>, made above,
|
|
is never followed by an exit.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="functiontext">Packaging::enter</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Entering $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.current_state</span><span class="plain">;</span>
|
|
<span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">, &(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain">), </span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">));</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">bubble</span><span class="plain"> = </span><span class="functiontext">Packaging::push_IRS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">, </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">));</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">, </span><span class="identifier">bubble</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"[%d] Current enclosure is $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain">, </span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">));</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">save</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain">) {</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">save</span><span class="element">.saved_IRS</span><span class="plain">, </span><span class="identifier">save</span><span class="element">.saved_enclosure</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::pop_IRS</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"[%d] Back to $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="element">.packaging_entry_sp</span><span class="plain">, </span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::enter_home_of is used in 3/pi (<a href="3-pi.html#SP2">§2</a>, <a href="3-pi.html#SP3">§3</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::enter is used in <a href="#SP11">§11</a>, 1/bs (<a href="1-bs.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::exit is used in 1/bs (<a href="1-bs.html#SP2">§2</a>), 3/pi (<a href="3-pi.html#SP2">§2</a>, <a href="3-pi.html#SP3">§3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Incarnation. </b>The subtlety here is that if a package is incarnated, its parent must be
|
|
incarnated first, and we need to make sure that their bubbles do not lie
|
|
inside each other: if they did, material compiled to the parent and to the
|
|
child would end up interleaved, in a way which violates the Inter
|
|
specification.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't incarnate null request"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Request to make incarnate $X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>for_tree</span><span class="plain">;</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">); </span> <span class="comment">This will not change</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">) {</span>
|
|
<span class="functiontext">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">);</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">save_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>parent_request</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain">), </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">package_bubble</span><span class="plain"> = </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &</span><span class="identifier">package_bubble</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain"> = </span><span class="functiontext">Produce::package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_name</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_type</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain"> = </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">save_IRS</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">package_bubble</span><span class="plain"> = </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="identifier">package_bubble</span><span class="plain"> = </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">save_IRS</span><span class="plain"> = </span><span class="functiontext">Packaging::at</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &</span><span class="identifier">package_bubble</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain"> = </span><span class="functiontext">Produce::package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_name</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>eventual_type</span><span class="plain">);</span>
|
|
<span class="identifier">R</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain"> = </span><span class="functiontext">Packaging::bubble</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">save_IRS</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PACKAGING</span><span class="plain">, </span><span class="string">"Made incarnate $X bookmark $5\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, &(</span><span class="identifier">R</span><span class="plain">-</span><span class="element">>write_position</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">-</span><span class="element">>actual_package</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::incarnate is used in <a href="#SP12">§12</a>, 1/bs (<a href="1-bs.html#SP2">§2</a>), 1/tv (<a href="1-tv.html#SP1">§1</a>), 1/in (<a href="1-in.html#SP7">§7</a>), 2/eis (<a href="2-eis.html#SP2_1">§2.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Compilation modules. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">compilation_module</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_package</span><span class="plain"> *</span><span class="identifier">inter_presence</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">hanging_from</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">compilation_module</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">compilation_module</span><span class="plain"> *</span><span class="functiontext">Packaging::new_cm</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">compilation_module</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::new_cm appears nowhere else.</p>
|
|
|
|
<p class="endnote">The structure compilation_module is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Modules. </b>With the code above, then, we can get the Inter hierarchy of packages set up
|
|
as far as creating <code class="display"><span class="extract">main</span></code>. After that the Hierarchy code takes over, but it
|
|
calls the routines below to assist. It will want to create a number of "modules"
|
|
and, within them, "submodules".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Modules are identified by name: <code class="display"><span class="extract">generic</span></code>, <code class="display"><span class="extract">Standard_Rules</span></code>, and so on. The
|
|
following creates modules on demand.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_package</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">the_package</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">submodules</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">submodule_request</span></code></span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">module_package</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">module_package</span><span class="plain"> *</span><span class="functiontext">Packaging::get_module</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Dictionaries::find</span><span class="plain">(</span><span class="functiontext">Site::modules_dictionary</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">module_package</span><span class="plain"> *) </span><span class="identifier">Dictionaries::read_value</span><span class="plain">(</span><span class="functiontext">Site::modules_dictionary</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">module_package</span><span class="plain"> *</span><span class="identifier">new_module</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module_package</span><span class="plain">);</span>
|
|
<span class="identifier">new_module</span><span class="plain">-</span><span class="element">>the_package</span><span class="plain"> =</span>
|
|
<span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">,</span>
|
|
<span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="functiontext">Site::main_request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)),</span>
|
|
<span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_module"</span><span class="plain">));</span>
|
|
<span class="identifier">new_module</span><span class="plain">-</span><span class="element">>submodules</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">submodule_request</span><span class="plain">);</span>
|
|
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="functiontext">Site::modules_dictionary</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">);</span>
|
|
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="functiontext">Site::modules_dictionary</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">new_module</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_module</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::get_module is used in <a href="#SP17">§17</a>, 1/bs (<a href="1-bs.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The structure module_package is accessed in 1/bs and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Submodules. </b>Submodules have names such as <code class="display"><span class="extract">properties</span></code>, and the idea is that the same submodule
|
|
(or rather, submodules with the same name) can be found in multiple modules. The
|
|
different sorts of submodule are identified by <code class="display"><span class="extract">submodule_identity</span></code> pointers, though
|
|
as it turns out, this is presently just a wrapper for a name.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">submodule_identity</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">submodule_name</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">submodule_identity</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="functiontext">Packaging::register_submodule</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
|
<span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">sid</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">sid</span><span class="plain">-</span><span class="element">>submodule_name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sid</span><span class="plain">;</span>
|
|
<span class="identifier">sid</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">submodule_identity</span><span class="plain">);</span>
|
|
<span class="identifier">sid</span><span class="plain">-</span><span class="element">>submodule_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sid</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::register_submodule appears nowhere else.</p>
|
|
|
|
<p class="endnote">The structure submodule_identity is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>Once the Hierarchy code has registered a submodule, it can request an existing
|
|
module to have this submodule. It should call one of the following four functions:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::request_submodule</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">compilation_module</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::generic_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::new_submodule_inner</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Modules::inter_presence</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::local_submodule</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::request_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Modules::find</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::generic_submodule</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::new_submodule_inner</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::get_module</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"generic"</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::synoptic_submodule</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::new_submodule_inner</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::get_module</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"synoptic"</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::template_submodule</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Packaging::new_submodule_inner</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Packaging::get_module</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"template"</span><span class="plain">), </span><span class="identifier">sid</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::request_submodule is used in 1/hl (<a href="1-hl.html#SP5">§5</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::local_submodule appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function Packaging::generic_submodule is used in 1/hl (<a href="1-hl.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::synoptic_submodule is used in 1/hl (<a href="1-hl.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::template_submodule appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b>Those in turn all make use of this back-end function:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">submodule_request</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">which_submodule</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">where_found</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">submodule_request</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="functiontext">Packaging::new_submodule_inner</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">module_package</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">submodule_identity</span><span class="plain"> *</span><span class="identifier">sid</span><span class="plain">) {</span>
|
|
<span class="reserved">submodule_request</span><span class="plain"> *</span><span class="identifier">sr</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">, </span><span class="reserved">submodule_request</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-</span><span class="element">>submodules</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sid</span><span class="plain"> == </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>which_submodule</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>where_found</span><span class="plain">;</span>
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">sid</span><span class="plain">-</span><span class="element">>submodule_name</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-</span><span class="element">>the_package</span><span class="plain">);</span>
|
|
<span class="identifier">sr</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">submodule_request</span><span class="plain">);</span>
|
|
<span class="identifier">sr</span><span class="plain">-</span><span class="element">>which_submodule</span><span class="plain"> = </span><span class="identifier">sid</span><span class="plain">;</span>
|
|
<span class="identifier">sr</span><span class="plain">-</span><span class="element">>where_found</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_submodule"</span><span class="plain">));</span>
|
|
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">, </span><span class="reserved">submodule_request</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-</span><span class="element">>submodules</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>where_found</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::new_submodule_inner is used in <a href="#SP17">§17</a>.</p>
|
|
|
|
<p class="endnote">The structure submodule_request is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Functions. </b>Inter code has a standard layout for functions: an outer, enclosing, package of type
|
|
<code class="display"><span class="extract">_function</span></code>, inside which is an iname <code class="display"><span class="extract">call</span></code> for the actual code to call. All such
|
|
functions are produced by the following routines:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::function</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">temp_iname</span><span class="plain">) {</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::function</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">temp_iname</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%n"</span><span class="plain">, </span><span class="identifier">temp_iname</span><span class="plain">);</span>
|
|
<span class="functiontext">Produce::change_translation</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::function_text</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">translation</span><span class="plain">) {</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::function</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">translation</span><span class="plain">)</span>
|
|
<span class="functiontext">Produce::change_translation</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">translation</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Packaging::housed_in_function</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iname</span><span class="plain"> == </span><span class="identifier">NULL</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="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">InterNames::location</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</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="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-</span><span class="element">>eventual_type</span><span class="plain"> == </span><span class="functiontext">PackageTypes::function</span><span class="plain">(</span><span class="identifier">I</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="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 Packaging::function is used in 1/hl (<a href="1-hl.html#SP3">§3</a>, <a href="1-hl.html#SP3_1">§3.1</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::function_text is used in 1/hl (<a href="1-hl.html#SP3">§3</a>).</p>
|
|
|
|
<p class="endnote">The function Packaging::housed_in_function is used in 3/pi (<a href="3-pi.html#SP3">§3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b>Datum is very similar.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Packaging::datum_text</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">function_iname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">translation</span><span class="plain">) {</span>
|
|
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Packaging::request</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">function_iname</span><span class="plain">, </span><span class="functiontext">PackageTypes::get</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_data"</span><span class="plain">));</span>
|
|
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">InterNames::explicitly_named</span><span class="plain">(</span><span class="identifier">translation</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Packaging::datum_text is used in 1/hl (<a href="1-hl.html#SP3">§3</a>).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="1-trn.html">Back to 'Translation'</a></li><li><a href="1-pt.html">Continue with 'Package Types'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|