mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 10:04:21 +03:00
589 lines
88 KiB
HTML
589 lines
88 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Packaging</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="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../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="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="index.html"><span class="selectedlink">building</span></a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Packaging' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inter 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="1-pck.html#SP1">§1. Package requests</a></li><li><a href="1-pck.html#SP10">§10. Bubbles</a></li><li><a href="1-pck.html#SP11">§11. Outside the packages</a></li><li><a href="1-pck.html#SP12">§12. Entry and exit</a></li><li><a href="1-pck.html#SP13">§13. Incarnation</a></li><li><a href="1-pck.html#SP14">§14. Compilation modules</a></li><li><a href="1-pck.html#SP15">§15. Modules</a></li><li><a href="1-pck.html#SP16">§16. Submodules</a></li><li><a href="1-pck.html#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"> </span><span class="constant">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<button class="popup" onclick="togglePopup('usagePopup85')">...<span class="popuptext" id="usagePopup85">Usage of <b>Packaging::request</b>:<br><a href="1-pck.html#SP15">§15</a>, <a href="1-pck.html#SP18">§18</a>, <a href="1-pck.html#SP19">§19</a>, <a href="1-pck.html#SP20">§20</a>, Building Site - <a href="1-bs.html#SP2">§2</a><br>Hierarchy Locations - <a href="1-hl.html#SP4">§4</a>, <a href="1-hl.html#SP5">§5</a></span></button></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"><a href="1-in.html#SP7">InterNames::location</a></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="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<button class="popup" onclick="togglePopup('usagePopup86')">...<span class="popuptext" id="usagePopup86">Usage of <b>Packaging::log</b>:<br>Building Module - <a href="1-bm.html#SP4_5">§4.5</a></span></button></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"> = </span><span class="constant">0</span><span class="plain">;</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">++ > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">LOG</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="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<button class="popup" onclick="togglePopup('usagePopup87')">...<span class="popuptext" id="usagePopup87">Usage of <b>Packaging::make_iname_within</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP5">§5</a><br>Producing Inter - <a href="3-prd.html#SP3">§3</a></span></button></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"><a href="1-in.html#SP6">InterNames::generated_in</a></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"><a href="1-in.html#SP1">InterNames::multiple_use_generator</a></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"><a href="1-in.html#SP6">InterNames::generated_in</a></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="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<button class="popup" onclick="togglePopup('usagePopup88')">...<span class="popuptext" id="usagePopup88">Usage of <b>Packaging::stateless</b>:<br>Building Site - <a href="1-bs.html#SP2">§2</a></span></button></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="plain">.</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="plain">.</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="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<button class="popup" onclick="togglePopup('usagePopup89')">...<span class="popuptext" id="usagePopup89">Usage of <b>Packaging::at</b>:<br><a href="1-pck.html#SP10">§10</a>, <a href="1-pck.html#SP11">§11</a>, <a href="1-pck.html#SP13">§13</a>, Producing Inter - <a href="3-prd.html#SP2">§2</a>, <a href="3-prd.html#SP3">§3</a></span></button></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="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">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<button class="popup" onclick="togglePopup('usagePopup90')">...<span class="popuptext" id="usagePopup90">Usage of <b>Packaging::enclosure</b>:<br><a href="1-pck.html#SP12">§12</a>, <a href="1-pck.html#SP13">§13</a></span></button></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="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">saved_enclosure</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></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<button class="popup" onclick="togglePopup('usagePopup91')">...<span class="popuptext" id="usagePopup91">Usage of <b>Packaging::push_IRS</b>:<br><a href="1-pck.html#SP9">§9</a>, <a href="1-pck.html#SP12">§12</a></span></button></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="plain">.</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="plain">.</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="plain">.</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="plain">.</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="plain">.</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<button class="popup" onclick="togglePopup('usagePopup92')">...<span class="popuptext" id="usagePopup92">Usage of <b>Packaging::pop_IRS</b>:<br><a href="1-pck.html#SP12">§12</a></span></button></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="plain">.</span><span class="element">packaging_entry_sp</span><span class="plain"> <= </span><span class="constant">0</span><span class="plain">) </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="plain">.</span><span class="element">packaging_entry_sp</span><span class="plain">--;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></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<button class="popup" onclick="togglePopup('usagePopup93')">...<span class="popuptext" id="usagePopup93">Usage of <b>Packaging::initialise_state</b>:<br>Building Site - <a href="1-bs.html#SP2">§2</a></span></button></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="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">saved_IRS</span><span class="plain"> = </span><span class="functiontext"><a href="1-pck.html#SP8">Packaging::push_IRS</a></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="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">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<button class="popup" onclick="togglePopup('usagePopup94')">...<span class="popuptext" id="usagePopup94">Usage of <b>Packaging::set_state</b>:<br><a href="1-pck.html#SP12">§12</a>, <a href="1-pck.html#SP13">§13</a></span></button></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="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">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">) != </span><span class="constant">1</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="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="plain">.</span><span class="element">current_state</span><span class="plain">.</span><span class="element">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="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<button class="popup" onclick="togglePopup('usagePopup95')">...<span class="popuptext" id="usagePopup95">Usage of <b>Packaging::bubble</b>:<br><a href="1-pck.html#SP11">§11</a>, <a href="1-pck.html#SP12">§12</a>, <a href="1-pck.html#SP13">§13</a>, Building Site - <a href="1-bs.html#SP2">§2</a></span></button></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"><a href="3-prd.html#SP2">Produce::nop</a></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"><a href="1-pck.html#SP7">Packaging::at</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
<span class="functiontext"><a href="3-prd.html#SP2">Produce::nop</a></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<button class="popup" onclick="togglePopup('usagePopup96')">...<span class="popuptext" id="usagePopup96">Usage of <b>Packaging::bubble_at</b>:<br>none</span></button></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"><a href="3-prd.html#SP2">Produce::nop_at</a></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"><a href="3-prd.html#SP2">Produce::nop_at</a></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="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<button class="popup" onclick="togglePopup('usagePopup97')">...<span class="popuptext" id="usagePopup97">Usage of <b>Packaging::outside_all_packages</b>:<br>none</span></button></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"><a href="3-prd.html#SP2">Produce::version</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
|
|
<span class="functiontext"><a href="3-prd.html#SP2">Produce::comment</a></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"><a href="1-bs.html#SP2">Site::set_package_types</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP10">Packaging::bubble</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext"><a href="3-prd.html#SP2">Produce::comment</a></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"><a href="1-bs.html#SP2">Site::set_pragmas</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP10">Packaging::bubble</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext"><a href="3-prd.html#SP2">Produce::comment</a></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"><a href="1-ip.html#SP1">Primitives::emit</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP7">Packaging::at</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
|
|
|
|
<span class="functiontext"><a href="1-pt.html#SP1">PackageTypes::get</a></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"><a href="1-pt.html#SP1">PackageTypes::get</a></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"><a href="1-pt.html#SP1">PackageTypes::get</a></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"><a href="1-pck.html#SP12">Packaging::enter</a></span><span class="plain">(</span><span class="functiontext"><a href="1-bs.html#SP2">Site::main_request</a></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"><a href="1-bs.html#SP2">Site::set_holdings</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP10">Packaging::bubble</a></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="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<button class="popup" onclick="togglePopup('usagePopup98')">...<span class="popuptext" id="usagePopup98">Usage of <b>Packaging::enter_home_of</b>:<br>Producing Inter - <a href="3-prd.html#SP2">§2</a>, <a href="3-prd.html#SP3">§3</a></span></button></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"><a href="1-pck.html#SP12">Packaging::enter</a></span><span class="plain">(</span><span class="functiontext"><a href="1-in.html#SP7">InterNames::location</a></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<button class="popup" onclick="togglePopup('usagePopup99')">...<span class="popuptext" id="usagePopup99">Usage of <b>Packaging::enter</b>:<br><a href="1-pck.html#SP11">§11</a>, Building Site - <a href="1-bs.html#SP2">§2</a></span></button></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\n"</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="plain">.</span><span class="element">current_state</span><span class="plain">;</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP13">Packaging::incarnate</a></span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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"><a href="1-pck.html#SP7">Packaging::enclosure</a></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"><a href="1-pck.html#SP8">Packaging::push_IRS</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></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"><a href="1-pck.html#SP9">Packaging::set_state</a></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\n"</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="plain">.</span><span class="element">packaging_entry_sp</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP7">Packaging::enclosure</a></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<button class="popup" onclick="togglePopup('usagePopup100')">...<span class="popuptext" id="usagePopup100">Usage of <b>Packaging::exit</b>:<br>Building Site - <a href="1-bs.html#SP2">§2</a><br>Producing Inter - <a href="3-prd.html#SP2">§2</a>, <a href="3-prd.html#SP3">§3</a></span></button></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"><a href="1-pck.html#SP9">Packaging::set_state</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">save</span><span class="plain">.</span><span class="element">saved_IRS</span><span class="plain">, </span><span class="identifier">save</span><span class="plain">.</span><span class="element">saved_enclosure</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP8">Packaging::pop_IRS</a></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\n"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-></span><span class="identifier">site</span><span class="plain">.</span><span class="element">packaging_entry_sp</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP7">Packaging::enclosure</a></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="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<button class="popup" onclick="togglePopup('usagePopup101')">...<span class="popuptext" id="usagePopup101">Usage of <b>Packaging::incarnate</b>:<br><a href="1-pck.html#SP12">§12</a>, Building Site - <a href="1-bs.html#SP2">§2</a><br>The Veneer - <a href="1-tv.html#SP1">§1</a><br>Inter Namespace - <a href="1-in.html#SP7">§7</a><br>Emitting Inter Schemas - <a href="2-eis.html#SP2_1">§2.1</a></span></button></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\n"</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"><a href="1-pck.html#SP7">Packaging::enclosure</a></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"><a href="1-pck.html#SP13">Packaging::incarnate</a></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"><a href="1-pck.html#SP7">Packaging::at</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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"><a href="3-prd.html#SP2">Produce::package</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></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"><a href="1-pck.html#SP7">Packaging::at</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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"><a href="3-prd.html#SP2">Produce::package</a></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"><a href="1-pck.html#SP10">Packaging::bubble</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="1-pck.html#SP9">Packaging::set_state</a></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\n"</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="identifier">actual_package</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></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<button class="popup" onclick="togglePopup('usagePopup102')">...<span class="popuptext" id="usagePopup102">Usage of <b>Packaging::new_cm</b>:<br>none</span></button></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 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<button class="popup" onclick="togglePopup('usagePopup103')">...<span class="popuptext" id="usagePopup103">Usage of <b>Packaging::get_module</b>:<br><a href="1-pck.html#SP17">§17</a>, Building Site - <a href="1-bs.html#SP2">§2</a></span></button></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"><a href="1-bs.html#SP2">Site::modules_dictionary</a></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"><a href="1-bs.html#SP2">Site::modules_dictionary</a></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"><a href="1-pck.html#SP2">Packaging::request</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">,</span>
|
|
<span class="functiontext"><a href="1-in.html#SP5">InterNames::explicitly_named</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="functiontext"><a href="1-bs.html#SP2">Site::main_request</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)),</span>
|
|
<span class="functiontext"><a href="1-pt.html#SP1">PackageTypes::get</a></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"><a href="1-bs.html#SP2">Site::modules_dictionary</a></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"><a href="1-bs.html#SP2">Site::modules_dictionary</a></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 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<button class="popup" onclick="togglePopup('usagePopup104')">...<span class="popuptext" id="usagePopup104">Usage of <b>Packaging::register_submodule</b>:<br>none</span></button></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 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<button class="popup" onclick="togglePopup('usagePopup105')">...<span class="popuptext" id="usagePopup105">Usage of <b>Packaging::request_submodule</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP5">§5</a></span></button></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"><a href="1-pck.html#SP17">Packaging::generic_submodule</a></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"><a href="1-pck.html#SP18">Packaging::new_submodule_inner</a></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<button class="popup" onclick="togglePopup('usagePopup106')">...<span class="popuptext" id="usagePopup106">Usage of <b>Packaging::local_submodule</b>:<br>none</span></button></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"><a href="1-pck.html#SP17">Packaging::request_submodule</a></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<button class="popup" onclick="togglePopup('usagePopup107')">...<span class="popuptext" id="usagePopup107">Usage of <b>Packaging::generic_submodule</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP2">§2</a></span></button></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"><a href="1-pck.html#SP18">Packaging::new_submodule_inner</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP15">Packaging::get_module</a></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<button class="popup" onclick="togglePopup('usagePopup108')">...<span class="popuptext" id="usagePopup108">Usage of <b>Packaging::synoptic_submodule</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP2">§2</a></span></button></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"><a href="1-pck.html#SP18">Packaging::new_submodule_inner</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP15">Packaging::get_module</a></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<button class="popup" onclick="togglePopup('usagePopup109')">...<span class="popuptext" id="usagePopup109">Usage of <b>Packaging::template_submodule</b>:<br>none</span></button></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"><a href="1-pck.html#SP18">Packaging::new_submodule_inner</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext"><a href="1-pck.html#SP15">Packaging::get_module</a></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="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<button class="popup" onclick="togglePopup('usagePopup110')">...<span class="popuptext" id="usagePopup110">Usage of <b>Packaging::new_submodule_inner</b>:<br><a href="1-pck.html#SP17">§17</a></span></button></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="identifier">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"><a href="1-in.html#SP5">InterNames::explicitly_named</a></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"><a href="1-pck.html#SP2">Packaging::request</a></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"><a href="1-pt.html#SP1">PackageTypes::get</a></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="identifier">where_found</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></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<button class="popup" onclick="togglePopup('usagePopup111')">...<span class="popuptext" id="usagePopup111">Usage of <b>Packaging::function</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP3">§3</a>, <a href="1-hl.html#SP3_1">§3.1</a></span></button></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"><a href="1-pck.html#SP2">Packaging::request</a></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"><a href="1-pt.html#SP2">PackageTypes::function</a></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"><a href="1-in.html#SP5">InterNames::explicitly_named</a></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"><a href="3-prd.html#SP2">Produce::change_translation</a></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<button class="popup" onclick="togglePopup('usagePopup112')">...<span class="popuptext" id="usagePopup112">Usage of <b>Packaging::function_text</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP3">§3</a></span></button></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"><a href="1-pck.html#SP2">Packaging::request</a></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"><a href="1-pt.html#SP2">PackageTypes::function</a></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"><a href="1-in.html#SP5">InterNames::explicitly_named</a></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"><a href="3-prd.html#SP2">Produce::change_translation</a></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<button class="popup" onclick="togglePopup('usagePopup113')">...<span class="popuptext" id="usagePopup113">Usage of <b>Packaging::housed_in_function</b>:<br>Producing Inter - <a href="3-prd.html#SP3">§3</a></span></button></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"><a href="1-in.html#SP7">InterNames::location</a></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"><a href="1-pt.html#SP2">PackageTypes::function</a></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="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<button class="popup" onclick="togglePopup('usagePopup114')">...<span class="popuptext" id="usagePopup114">Usage of <b>Packaging::datum_text</b>:<br>Hierarchy Locations - <a href="1-hl.html#SP3">§3</a></span></button></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"><a href="1-pck.html#SP2">Packaging::request</a></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"><a href="1-pt.html#SP1">PackageTypes::get</a></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"><a href="1-in.html#SP5">InterNames::explicitly_named</a></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>
|
|
|
|
<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-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|