bhick
This commit is contained in:
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Sphinx build info version 1
|
||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||
config: c908097bffb8af037d3087e1a2a33716
|
||||
config: 5e2d340d1e45c11873a642aae3004db1
|
||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||
|
||||
+53
-11
@@ -147,6 +147,29 @@ Core Transition Rules
|
||||
& m
|
||||
}
|
||||
|
||||
#. Again, building on the previous rules, this rule makes the machine consider
|
||||
unapplied supercombinators to be in WHNF
|
||||
|
||||
.. math::
|
||||
\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a_0 : \ldots : a_n : \nillist
|
||||
& \langle i, s \rangle : d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a_0 : \mathtt{NGlobal} \; k \; c
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ i
|
||||
& a_n : s
|
||||
& d
|
||||
& h
|
||||
& m \\
|
||||
\SetCell[c=2]{c}
|
||||
\text{when $n < k$}
|
||||
}
|
||||
|
||||
#. If an application is on top of the stack, :code:`Unwind` continues unwinding
|
||||
|
||||
.. math::
|
||||
@@ -340,28 +363,47 @@ Core Transition Rules
|
||||
& m
|
||||
}
|
||||
|
||||
#. Consider unapplied functions to be in WHNF
|
||||
#. Pack a constructor if there are sufficient arguments
|
||||
|
||||
.. math::
|
||||
\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a_0 : \ldots : a_n : \nillist
|
||||
& \langle i, s \rangle : d
|
||||
{ \mathtt{Pack} \; t \; n : i
|
||||
& a_1 : \ldots : a_n : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a_0 : \mathtt{NGlobal} \; k \; c
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ i
|
||||
& a_n : s
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
& m \\
|
||||
\SetCell[c=2]{c}
|
||||
\text{when $n < k$}
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; [a_1,\ldots,a_n]
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
|
||||
#. Evaluate a case
|
||||
|
||||
.. math::
|
||||
\gmrule
|
||||
{ \mathtt{CaseJump} \begin{bmatrix} t \to c \end{bmatrix} : i
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; v
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ c \concat i
|
||||
& d
|
||||
& h
|
||||
& m
|
||||
}
|
||||
|
||||
|
||||
|
||||
***************
|
||||
Extension Rules
|
||||
***************
|
||||
|
||||
Vendored
+1
-1
@@ -42,7 +42,7 @@ heap nodes for supercombinators hold uninstantiated expressions, i.e. raw ASTs
|
||||
straight from the parser. When a supercombinator is found on the stack during
|
||||
evaluation, the template expression is instantiated (compiled) on the spot.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/20219b0570be52c3f596972c4cd5461a162cccf9.svg" alt="\transrule
|
||||
<p><img src="../_images/math/80185f417c32abbbd850f4429d27d4111dd55ce6.svg" alt="\transrule
|
||||
{ a_0 : a_1 : \ldots : a_n : s
|
||||
& d
|
||||
& h
|
||||
|
||||
+11
-11
@@ -130,10 +130,10 @@ select few keywords, (with a minor exception; TODO: elaborate) being <code class
|
||||
<code class="code docutils literal notranslate"><span class="pre">do</span></code> (followed by expressions), and <code class="code docutils literal notranslate"><span class="pre">of</span></code> (followed by alternatives)
|
||||
(TODO: all of these terms need linked glossary entries). In order to manage the
|
||||
cascade of layout contexts, our lexer will record a stack for which each element
|
||||
is either <img class="math" src="../_images/math/66eb37710389b629d7ffa626fb55276426bef938.svg" alt="\varnothing" style="vertical-align: -2px"/>, denoting an explicit layout written with braces
|
||||
and semicolons, or a <img class="math" src="../_images/math/d04fe0dc2dd02e9d27dfd46e93827894feb96d1f.svg" alt="\langle n \rangle" style="vertical-align: -5px"/>, denoting an implicitly laid-out
|
||||
is either <img class="math" src="../_images/math/6faf6a045e27fb9580834eb16635f0b1b12383f7.svg" alt="\varnothing" style="vertical-align: -2px"/>, denoting an explicit layout written with braces
|
||||
and semicolons, or a <img class="math" src="../_images/math/e5dd0a588910147c24912f9e7af7b4d0341033f0.svg" alt="\langle n \rangle" style="vertical-align: -5px"/>, denoting an implicitly laid-out
|
||||
layout where the start of each item belonging to the layout is indented
|
||||
<img class="math" src="../_images/math/4713e4c065d6aabec3acece28c5ecc882faa119a.svg" alt="n" style="vertical-align: 0px"/> columns.</p>
|
||||
<img class="math" src="../_images/math/dd0f75121d1d307be1181c273815e8532abda5ff.svg" alt="n" style="vertical-align: 0px"/> columns.</p>
|
||||
<div class="highlight-haskell notranslate"><div class="highlight"><pre><span></span><span class="c1">-- layout stack: []</span>
|
||||
<span class="kr">module</span><span class="w"> </span><span class="nn">M</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="c1">-- layout stack: [∅]</span>
|
||||
|
||||
@@ -154,9 +154,9 @@ implicitly inserted by the compiler. With the presented ideas in mind, we may
|
||||
begin to introduce a small set of informal rules describing the lexer’s handling
|
||||
of layouts, the first being:</p>
|
||||
<ol class="arabic simple">
|
||||
<li><p>If a layout keyword is followed by the token ‘{’, push <img class="math" src="../_images/math/66eb37710389b629d7ffa626fb55276426bef938.svg" alt="\varnothing" style="vertical-align: -2px"/>
|
||||
onto the layout context stack. Otherwise, push <img class="math" src="../_images/math/d04fe0dc2dd02e9d27dfd46e93827894feb96d1f.svg" alt="\langle n \rangle" style="vertical-align: -5px"/> onto
|
||||
the layout context stack where <img class="math" src="../_images/math/4713e4c065d6aabec3acece28c5ecc882faa119a.svg" alt="n" style="vertical-align: 0px"/> is the indentation of the token
|
||||
<li><p>If a layout keyword is followed by the token ‘{’, push <img class="math" src="../_images/math/6faf6a045e27fb9580834eb16635f0b1b12383f7.svg" alt="\varnothing" style="vertical-align: -2px"/>
|
||||
onto the layout context stack. Otherwise, push <img class="math" src="../_images/math/e5dd0a588910147c24912f9e7af7b4d0341033f0.svg" alt="\langle n \rangle" style="vertical-align: -5px"/> onto
|
||||
the layout context stack where <img class="math" src="../_images/math/dd0f75121d1d307be1181c273815e8532abda5ff.svg" alt="n" style="vertical-align: 0px"/> is the indentation of the token
|
||||
following the layout keyword. Additionally, the lexer is to insert a virtual
|
||||
opening brace after the token representing the layout keyword.</p></li>
|
||||
</ol>
|
||||
@@ -179,10 +179,10 @@ numeric value – is referred to as <em>offside</em> by myself internally and th
|
||||
Haskell report describing layouts. We informally formalise this rule as follows:</p>
|
||||
<ol class="arabic simple" start="2">
|
||||
<li><p>When the first token on a line is preceeded only by whitespace, if the
|
||||
token’s first grapheme resides on a column number <img class="math" src="../_images/math/422ce4de46a354723a0f5b33995d885c86bb0e70.svg" alt="m" style="vertical-align: 0px"/> equal to the
|
||||
indentation level of the enclosing context – i.e. the <img class="math" src="../_images/math/c067c4215cbfc6897d6e5eaf14ded0dc221b972c.svg" alt="\langle n
|
||||
token’s first grapheme resides on a column number <img class="math" src="../_images/math/3fe28d6b2db64823422b040f22663ee146752df9.svg" alt="m" style="vertical-align: 0px"/> equal to the
|
||||
indentation level of the enclosing context – i.e. the <img class="math" src="../_images/math/e867fb287fff102859aafc9f9cdf2bdef24793c1.svg" alt="\langle n
|
||||
\rangle" style="vertical-align: -5px"/> on top of the layout stack. Should no such context exist on the
|
||||
stack, assume <img class="math" src="../_images/math/3fa33eeafbc80a0bcf2766e8f56e9cb2b6148e79.svg" alt="m > n" style="vertical-align: -1px"/>.</p></li>
|
||||
stack, assume <img class="math" src="../_images/math/7752bffe36066cce1a71cee99ba78f9a8de27750.svg" alt="m > n" style="vertical-align: -1px"/>.</p></li>
|
||||
</ol>
|
||||
<p>We have an idea of how to begin layouts, delimit the enclosed items, and last
|
||||
we’ll need to end layouts. This is where the distinction between virtual and
|
||||
@@ -192,7 +192,7 @@ This will be elaborated on in the next section. For now, we will be content with
|
||||
naïvely inserting a virtual closing brace when a token is indented right of the
|
||||
layout.</p>
|
||||
<ol class="arabic simple" start="3">
|
||||
<li><p>Under the same conditions as rule 2., when <img class="math" src="../_images/math/d696439e8724d5b54e9b4b344b9c99d0facc8b7c.svg" alt="m < n" style="vertical-align: -1px"/> the lexer shall
|
||||
<li><p>Under the same conditions as rule 2., when <img class="math" src="../_images/math/621c205d829260a0ef518dbf23fd02478575f1d5.svg" alt="m < n" style="vertical-align: -1px"/> the lexer shall
|
||||
insert a virtual closing brace and pop the layout stack.</p></li>
|
||||
</ol>
|
||||
<p>This rule covers some cases including the top-level, however, consider
|
||||
@@ -271,7 +271,7 @@ system, see <a class="reference external" href="https://www.haskell.org/onlinere
|
||||
</ul>
|
||||
<p class="caption" role="heading"><span class="caption-text">References</span></p>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/gm-state-transition-rules.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/gm-state-transitions.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/ti-state-transitions.html">Template Instantiator State Transition Rules</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
Vendored
+3
-3
@@ -13,7 +13,7 @@
|
||||
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<link rel="index" title="Index" href="../genindex.html" />
|
||||
<link rel="search" title="Search" href="../search.html" />
|
||||
<link rel="next" title="G-Machine State Transition Rules" href="../references/gm-state-transition-rules.html" />
|
||||
<link rel="next" title="G-Machine State Transition Rules" href="../references/gm-state-transitions.html" />
|
||||
<link rel="prev" title="Lexing, Parsing, and Layouts" href="layout-lexing.html" />
|
||||
|
||||
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
||||
@@ -66,7 +66,7 @@ machine.</p>
|
||||
</ul>
|
||||
<p class="caption" role="heading"><span class="caption-text">References</span></p>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/gm-state-transition-rules.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/gm-state-transitions.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="../references/ti-state-transitions.html">Template Instantiator State Transition Rules</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -75,7 +75,7 @@ machine.</p>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="layout-lexing.html" title="previous chapter">Lexing, Parsing, and Layouts</a></li>
|
||||
<li>Next: <a href="../references/gm-state-transition-rules.html" title="next chapter">G-Machine State Transition Rules</a></li>
|
||||
<li>Next: <a href="../references/gm-state-transitions.html" title="next chapter">G-Machine State Transition Rules</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
Vendored
+1
-1
@@ -76,7 +76,7 @@ code using alignment and newlines.</p>
|
||||
</ul>
|
||||
<p class="caption" role="heading"><span class="caption-text">References</span></p>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="references/gm-state-transition-rules.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="references/gm-state-transitions.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="references/ti-state-transitions.html">Template Instantiator State Transition Rules</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
+71
-33
@@ -38,7 +38,7 @@
|
||||
<ol class="arabic">
|
||||
<li><p>Lookup a global by name and push its value onto the stack</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/18d81e1fc22e6feb876a993fe30fd9e8336f5bf6.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/60f03d9ff8b2e1f335d16830ee203156e6d3a0e0.svg" alt="\gmrule
|
||||
{ \mathtt{PushGlobal} \; f : i
|
||||
& s
|
||||
& d
|
||||
@@ -58,7 +58,7 @@
|
||||
<li><p>Allocate an int node on the heap, and push the address of the newly created
|
||||
node onto the stack</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/ed6af2733291dcf5001173a8dbaf8f59c817212a.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/0fabf97e10f5c112eb5642765c57eee467a61a24.svg" alt="\gmrule
|
||||
{ \mathtt{PushInt} \; n : i
|
||||
& s
|
||||
& d
|
||||
@@ -79,7 +79,7 @@ node onto the stack</p>
|
||||
the address directly below it. The address of the application node is pushed
|
||||
onto the stack.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/607985174357bbbea2e2b47ab0694b2d21a71b35.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/9d2842813d1c6c9703d6ebe1e7eeaf0d7ae121a6.svg" alt="\gmrule
|
||||
{ \mathtt{MkAp} : i
|
||||
& f : x : s
|
||||
& d
|
||||
@@ -98,7 +98,7 @@ onto the stack.</p>
|
||||
</div></li>
|
||||
<li><p>Push a function’s argument onto the stack</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/643dd082a2b49d9ebdb87533aac62fdd342f4fd5.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/172a9e6498882cf2bfd038cf83d83f03e4c0313f.svg" alt="\gmrule
|
||||
{ \mathtt{Push} \; n : i
|
||||
& a_0 : \ldots : a_n : s
|
||||
& d
|
||||
@@ -114,7 +114,7 @@ onto the stack.</p>
|
||||
</div></li>
|
||||
<li><p>Tidy up the stack after instantiating a supercombinator</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/f02d55fb6c249a7da5a9df6b7e5c96ab6be7672b.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/4924a6c6d457db21cd5e02efdc8efd2af4210a19.svg" alt="\gmrule
|
||||
{ \mathtt{Slide} \; n : i
|
||||
& a_0 : \ldots : a_n : s
|
||||
& d
|
||||
@@ -133,7 +133,7 @@ top of the stack, <code class="code docutils literal notranslate"><span class="p
|
||||
where the dump is <strong>not</strong> empty, the instruction queue and stack is restored
|
||||
from the top.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/2417422cdf63ed202b16462208f8a62630f99679.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/efc4a40c79bae27675f22ac6011dde9806c845b9.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a : s
|
||||
& \langle i', s' \rangle : d
|
||||
@@ -153,7 +153,7 @@ from the top.</p>
|
||||
<li><p>Bulding on the previous rule, in the case where the dump <strong>is</strong> empty, leave
|
||||
the machine in a halt state (i.e. with an empty instruction queue).</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/60f4e38bb9ff4a7bcb201e82cb956a3ccf064632.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/fd11e2b1ffa20589ec72bb3f1ba70c82573f3f84.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a : s
|
||||
& \nillist
|
||||
@@ -170,9 +170,31 @@ the machine in a halt state (i.e. with an empty instruction queue).</p>
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>Again, building on the previous rules, this rule makes the machine consider
|
||||
unapplied supercombinators to be in WHNF</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/36a64918095793044bc603da838873e5db145350.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a_0 : \ldots : a_n : \nillist
|
||||
& \langle i, s \rangle : d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a_0 : \mathtt{NGlobal} \; k \; c
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ i
|
||||
& a_n : s
|
||||
& d
|
||||
& h
|
||||
& m \\
|
||||
\SetCell[c=2]{c}
|
||||
\text{when $n < k$}
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>If an application is on top of the stack, <code class="code docutils literal notranslate"><span class="pre">Unwind</span></code> continues unwinding</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/b04167eaade600ab592e2a4441ffc27f5268cccf.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/428dd88b1a0f02d8880a57efc2aff1aff732e58b.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a : s
|
||||
& d
|
||||
@@ -191,9 +213,9 @@ the machine in a halt state (i.e. with an empty instruction queue).</p>
|
||||
</div></li>
|
||||
<li><p>When a supercombinator is on top of the stack (and the correct number of
|
||||
arguments have been provided), <code class="code docutils literal notranslate"><span class="pre">Unwind</span></code> sets up the stack and jumps to
|
||||
the supercombinator’s code (<img class="math" src="../_images/math/90592e982322fa08f1b8ae0e6bcdaca11fc8de59.svg" alt="\beta" style="vertical-align: -4px"/>-reduction)</p>
|
||||
the supercombinator’s code (<img class="math" src="../_images/math/4e04b3f70eef23aff9592405c5b32293f5f8f3d0.svg" alt="\beta" style="vertical-align: -4px"/>-reduction)</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/2dc5e48f0f26f08073e6e1cdd70ff876c6ec2434.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/022f085a854e1a5039b4ce9ff514ae19e6e5731d.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a_0 : \ldots : a_n : s
|
||||
& d
|
||||
@@ -215,7 +237,7 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
</div></li>
|
||||
<li><p>Pop the stack, and update the nth node to point to the popped address</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/e299a147e6e958303111e813e82a3507ded25437.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/1e7730846a205754c25caa9bc83215d4c9a2fd0f.svg" alt="\gmrule
|
||||
{ \mathtt{Update} \; n : i
|
||||
& e : f : a_1 : \ldots : a_n : s
|
||||
& d
|
||||
@@ -239,7 +261,7 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
</div></li>
|
||||
<li><p>Pop the stack.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/aec9099fc8c459eb433947bd6c9cc0f96fe38f98.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/a8350470d1099f2c9d25787f232cd6d48128e2b9.svg" alt="\gmrule
|
||||
{ \mathtt{Pop} \; n : i
|
||||
& a_1 : \ldots : a_n : s
|
||||
& d
|
||||
@@ -255,7 +277,7 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
</div></li>
|
||||
<li><p>Follow indirections while unwinding</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/7648bfc0796ff33966fbc002c446b2242d296fd9.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/7b51ed63c4f01626ae64caca9b8aa37ef8c04e3e.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a : s
|
||||
& d
|
||||
@@ -274,7 +296,7 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
</div></li>
|
||||
<li><p>Allocate uninitialised heap space</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/5380d8227d0a06608b108a26b4a618972b4b7e28.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/59c33027716f0d0c66a4cabdbb821415f2b561d5.svg" alt="\gmrule
|
||||
{ \mathtt{Alloc} \; n : i
|
||||
& s
|
||||
& d
|
||||
@@ -295,7 +317,7 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
</div></li>
|
||||
<li><p>Evaluate the top of the stack to WHNF</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/ce745b5797483cfcb6ff4816364d91d3d5b6e6c4.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/99ee76fb86a35795feb0b604d9fa8f46e6bcbbc8.svg" alt="\gmrule
|
||||
{ \mathtt{Eval} : i
|
||||
& a : s
|
||||
& d
|
||||
@@ -309,9 +331,9 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>Reduce a primitive binary operator <img class="math" src="../_images/math/43434266ad5b9f36d523d70ff88db5c4e9366b03.svg" alt="*" style="vertical-align: 0px"/>.</p>
|
||||
<li><p>Reduce a primitive binary operator <img class="math" src="../_images/math/a5e51bd4f30d980b8599ff18ffd339c6d844d9e8.svg" alt="*" style="vertical-align: 0px"/>.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/176a0e2360b1e342041d8129c3a264321ae806ce.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/6618a79153ccc671049ed4fb1f9cbf31b272d53c.svg" alt="\gmrule
|
||||
{ * : i
|
||||
& a_1 : a_2 : s
|
||||
& d
|
||||
@@ -332,9 +354,9 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>Reduce a primitive unary operator <img class="math" src="../_images/math/604a42b94739b04fa9559a97c3703816bf57aa5c.svg" alt="\neg" style="vertical-align: 0px"/>.</p>
|
||||
<li><p>Reduce a primitive unary operator <img class="math" src="../_images/math/2d33478fc695c01e3ba58758bbdc809235dc6a3e.svg" alt="\neg" style="vertical-align: 0px"/>.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/6de99ea1d6d13dbeedcdfcf7e3807cdd4f2e8594.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/fd61456b36d2327ea4950605d2e282d6a362685c.svg" alt="\gmrule
|
||||
{ \neg : i
|
||||
& a : s
|
||||
& d
|
||||
@@ -354,25 +376,41 @@ the supercombinator’s code (<img class="math" src="../_images/math/90592e98232
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>Consider unapplied functions to be in WHNF</p>
|
||||
<li><p>Pack a constructor if there are sufficient arguments</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/702f28367db2bbf757f819d55f238962369384ad.svg" alt="\gmrule
|
||||
{ \mathtt{Unwind} : \nillist
|
||||
& a_0 : \ldots : a_n : \nillist
|
||||
& \langle i, s \rangle : d
|
||||
<p><img src="../_images/math/ceba2ed1f0be639cb0841ed19d1980c77657c74b.svg" alt="\gmrule
|
||||
{ \mathtt{Pack} \; t \; n : i
|
||||
& a_1 : \ldots : a_n : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a_0 : \mathtt{NGlobal} \; k \; c
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ i
|
||||
& a_n : s
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
& m \\
|
||||
\SetCell[c=2]{c}
|
||||
\text{when $n < k$}
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; [a_1,\ldots,a_n]
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
<li><p>Evaluate a case</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/23e5e14aff97d56bdcb7e5847a5610baaa4b3040.svg" alt="\gmrule
|
||||
{ \mathtt{CaseJump} \begin{bmatrix} t \to c \end{bmatrix} : i
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; v
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ c \concat i
|
||||
& d
|
||||
& h
|
||||
& m
|
||||
}"/></p>
|
||||
</div></li>
|
||||
</ol>
|
||||
@@ -388,7 +426,7 @@ this by modifying Core Rule 2 to update the global environment with the new
|
||||
node’s address. Consider how this rule might impact garbage collection
|
||||
(remember that the environment is intended for <em>globals</em>).</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/0fc7c9df5cc4f923f6953e615c1f28a6531c0b68.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/e8e88c3770a0c3cf4169abbee703c4a6bcffc0f5.svg" alt="\gmrule
|
||||
{ \mathtt{PushInt} \; n : i
|
||||
& s
|
||||
& d
|
||||
@@ -414,7 +452,7 @@ node’s address. Consider how this rule might impact garbage collection
|
||||
<li><p>In order for the previous rule to be effective, we are also required to take
|
||||
action when a number already exists in the environment:</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/d56941a661a880391bd898f16e5dcf9c0b8a7e59.svg" alt="\gmrule
|
||||
<p><img src="../_images/math/321b47cc7986e581fdc26fb6b63195c1cf5409a2.svg" alt="\gmrule
|
||||
{ \mathtt{PushInt} \; n : i
|
||||
& s
|
||||
& d
|
||||
|
||||
+22
-22
@@ -13,7 +13,7 @@
|
||||
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<link rel="index" title="Index" href="../genindex.html" />
|
||||
<link rel="search" title="Search" href="../search.html" />
|
||||
<link rel="prev" title="G-Machine State Transition Rules" href="gm-state-transition-rules.html" />
|
||||
<link rel="prev" title="G-Machine State Transition Rules" href="gm-state-transitions.html" />
|
||||
|
||||
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<p>Evaluation is complete when a single <code class="code docutils literal notranslate"><span class="pre">NNum</span></code> remains on the stack and the
|
||||
dump is empty.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/90d7e53e2606d1ffdcc0d85fcc0be2db9b919797.svg" alt="\transrule
|
||||
<p><img src="../_images/math/96cf11c4b33f0179fcb72d62060f25fc6fa8b550.svg" alt="\transrule
|
||||
{ a : \nillist
|
||||
& \nillist
|
||||
& h
|
||||
@@ -48,7 +48,7 @@ dump is empty.</p>
|
||||
}"/></p>
|
||||
</div><p>Dereference an indirection passed as an argument to a function.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/2e21d478eedaa358bccb9aa3c57a5b290e671863.svg" alt="\transrule
|
||||
<p><img src="../_images/math/ecdbb83ab452d27fcd79c1567929508177d87f1f.svg" alt="\transrule
|
||||
{a : s & d & h
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NAp} \; a_1 \; a_2 \\
|
||||
@@ -57,16 +57,16 @@ dump is empty.</p>
|
||||
{a : s & d & h[a : \mathtt{NAp} \; a_1 \; a_3] & g}"/></p>
|
||||
</div><p>Dereference an indirection on top of the stack.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/d30cef88d057bcc5920fca7d63d0682f802d9006.svg" alt="\transrule
|
||||
<p><img src="../_images/math/f51999c7c2b53f5ff66f0d4f339a64b99dccbbc0.svg" alt="\transrule
|
||||
{p : s & d & h
|
||||
\begin{bmatrix}
|
||||
p : \mathtt{NInd} \; a
|
||||
\end{bmatrix} & g}
|
||||
{a : s & d & h & g}"/></p>
|
||||
</div><p>Perform a unary operation <img class="math" src="../_images/math/6bdb1b0b4006f5b62d10449cd280f311f4cf12f8.svg" alt="o(n)" style="vertical-align: -5px"/> with internal <code class="code docutils literal notranslate"><span class="pre">Prim</span></code> constructor
|
||||
</div><p>Perform a unary operation <img class="math" src="../_images/math/11e676863b0ccfe854bc89167c23a5bd514bf5f9.svg" alt="o(n)" style="vertical-align: -5px"/> with internal <code class="code docutils literal notranslate"><span class="pre">Prim</span></code> constructor
|
||||
<code class="code docutils literal notranslate"><span class="pre">O</span></code> on an argument in normal form.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/e4dc66520823a07e0df31b43dda92f9b2ea9e792.svg" alt="\transrule
|
||||
<p><img src="../_images/math/c2ff2f8e287ecf001479d047291f611c49ae7bde.svg" alt="\transrule
|
||||
{ f : a : s
|
||||
& d
|
||||
& h
|
||||
@@ -88,7 +88,7 @@ dump is empty.</p>
|
||||
</div><p>Evaluate the argument of a unary operation with internal <code class="code docutils literal notranslate"><span class="pre">Prim</span></code>
|
||||
constructor <code class="code docutils literal notranslate"><span class="pre">O</span></code>.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/620e45afe56ccc0dae7d9566d244b13bb6cb0631.svg" alt="\transrule
|
||||
<p><img src="../_images/math/226b15d1faaf510988b3ca3cb75ddd6c120c53ea.svg" alt="\transrule
|
||||
{ f : a : \nillist
|
||||
& d
|
||||
& h
|
||||
@@ -105,7 +105,7 @@ constructor <code class="code docutils literal notranslate"><span class="pre">O<
|
||||
}"/></p>
|
||||
</div><p>Restore the stack when a sub-computation has completed.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/4d427448f9b8b54db19e316c805033a7abfe11d2.svg" alt="\transrule
|
||||
<p><img src="../_images/math/1c0e1003d2e9980d635c8e79475e53226b5e7264.svg" alt="\transrule
|
||||
{ a : \nillist
|
||||
& s : d
|
||||
& h
|
||||
@@ -119,9 +119,9 @@ constructor <code class="code docutils literal notranslate"><span class="pre">O<
|
||||
& h
|
||||
& g
|
||||
}"/></p>
|
||||
</div><p>Reduce a supercombinator and update the root with the <img class="math" src="../_images/math/90592e982322fa08f1b8ae0e6bcdaca11fc8de59.svg" alt="\beta" style="vertical-align: -4px"/>-reduced form</p>
|
||||
</div><p>Reduce a supercombinator and update the root with the <img class="math" src="../_images/math/4e04b3f70eef23aff9592405c5b32293f5f8f3d0.svg" alt="\beta" style="vertical-align: -4px"/>-reduced form</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/20219b0570be52c3f596972c4cd5461a162cccf9.svg" alt="\transrule
|
||||
<p><img src="../_images/math/80185f417c32abbbd850f4429d27d4111dd55ce6.svg" alt="\transrule
|
||||
{ a_0 : a_1 : \ldots : a_n : s
|
||||
& d
|
||||
& h
|
||||
@@ -138,10 +138,10 @@ constructor <code class="code docutils literal notranslate"><span class="pre">O<
|
||||
& \SetCell[c=3]{c}
|
||||
\text{where } h' = \mathtt{instantiateU} \; e \; a_n \; h \; g
|
||||
}"/></p>
|
||||
</div><p>Perform a binary operation <img class="math" src="../_images/math/c9ac657e040edf18bbbf248d15d73ab640a93f2d.svg" alt="o(x,y)" style="vertical-align: -5px"/> associated with internal <code class="code docutils literal notranslate"><span class="pre">Prim</span></code>
|
||||
</div><p>Perform a binary operation <img class="math" src="../_images/math/70ba514f09b40f948e1a3673347f656c7dc33f27.svg" alt="o(x,y)" style="vertical-align: -5px"/> associated with internal <code class="code docutils literal notranslate"><span class="pre">Prim</span></code>
|
||||
constructor <code class="code docutils literal notranslate"><span class="pre">O</span></code> on two <code class="code docutils literal notranslate"><span class="pre">NNum</span></code> s both in normal form.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/7c31cda93cce15a6bef0ecb07b4221f15d15cc9f.svg" alt="\transrule
|
||||
<p><img src="../_images/math/703648dab56048f07869054b5257b846f55a4dec.svg" alt="\transrule
|
||||
{ f : a_1 : a_2 : s
|
||||
& d
|
||||
& h
|
||||
@@ -163,7 +163,7 @@ constructor <code class="code docutils literal notranslate"><span class="pre">O<
|
||||
</div><p>In a conditional primitive, perform the reduction if the condition has been
|
||||
evaluated as True (<code class="code docutils literal notranslate"><span class="pre">NData</span> <span class="pre">1</span> <span class="pre">[]</span></code>).</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/1543958253280895e6abea369c0f9abf4898649c.svg" alt="\transrule
|
||||
<p><img src="../_images/math/d9911cffb6ee41316d3f017754491dab76c920a9.svg" alt="\transrule
|
||||
{ f : a_1 : a_2 : a_3 : s
|
||||
& d
|
||||
& h
|
||||
@@ -184,7 +184,7 @@ evaluated as True (<code class="code docutils literal notranslate"><span class="
|
||||
</div><p>In a conditional primitive, perform the reduction if the condition has been
|
||||
evaluated as False (<code class="code docutils literal notranslate"><span class="pre">NData</span> <span class="pre">0</span> <span class="pre">[]</span></code>).</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/6d95eec30809d2f72c4d645e69ee6ba5fd3f0767.svg" alt="\transrule
|
||||
<p><img src="../_images/math/11e48d7396763a8f0e16cba061b46966844e3191.svg" alt="\transrule
|
||||
{ f : a_1 : a_2 : a_3 : s
|
||||
& d
|
||||
& h
|
||||
@@ -204,7 +204,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
}"/></p>
|
||||
</div><p>In a conditional primitive, evaluate the condition.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/625a1ccce064b171eb9d5ec015e07d234ef26c74.svg" alt="\transrule
|
||||
<p><img src="../_images/math/4480a4e8409efd17a2bb57789e584bba66af268c.svg" alt="\transrule
|
||||
{ f : a_1 : \nillist
|
||||
& d
|
||||
& h
|
||||
@@ -221,7 +221,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
}"/></p>
|
||||
</div><p>Construct <code class="code docutils literal notranslate"><span class="pre">NData</span></code> out of a constructor and its arguments</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/b0285722e6eed4a0fa69945efe4dfe0fbe124582.svg" alt="\transrule
|
||||
<p><img src="../_images/math/8d27e16980b44cbe4694fb91353c71239780608d.svg" alt="\transrule
|
||||
{ c : a_1 : \ldots : a_n : \nillist
|
||||
& d
|
||||
& h
|
||||
@@ -245,7 +245,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
<h2>Pairs<a class="headerlink" href="#pairs" title="Link to this heading">¶</a></h2>
|
||||
<p>Evaluate the first argument if necessary</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/478aeca314882e29dc3a52d64624061fb36948f0.svg" alt="\transrule
|
||||
<p><img src="../_images/math/292cba3e41608acd2957a5e9aa29ab8f2cbc346d.svg" alt="\transrule
|
||||
{ c : a_1 : a_2 : \nillist
|
||||
& d
|
||||
& h
|
||||
@@ -264,7 +264,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
}"/></p>
|
||||
</div><p>Perform the reduction if the first argument is in normal form</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/c5937687478d980ab66b85de909dcb73d4bc9b13.svg" alt="\transrule
|
||||
<p><img src="../_images/math/34c5ba211557474d30a91f5ea6cf5692b3b88610.svg" alt="\transrule
|
||||
{ c : a_1 : a_2 : s
|
||||
& d
|
||||
& h
|
||||
@@ -290,7 +290,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
<h2>Lists<a class="headerlink" href="#lists" title="Link to this heading">¶</a></h2>
|
||||
<p>Evaluate the scrutinee</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/5bd3cd582dce130ac602d5d805972076e5bc0f56.svg" alt="\transrule
|
||||
<p><img src="../_images/math/f653751fa1b1ef5e1eb9a12fbb4df556a501606f.svg" alt="\transrule
|
||||
{ c : a_1 : a_2 : a_3 : \nillist
|
||||
& d
|
||||
& h
|
||||
@@ -307,7 +307,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
}"/></p>
|
||||
</div><p>If the scrutinee is <code class="code docutils literal notranslate"><span class="pre">Nil</span></code>, perform the appropriate reduction.</p>
|
||||
<div class="math">
|
||||
<p><img src="../_images/math/a6502e03af9f1e3d8a7dce9053c7125364a0cae5.svg" alt="\transrule
|
||||
<p><img src="../_images/math/fd3674c541392d348d835034f858018e7a614a41.svg" alt="\transrule
|
||||
{ c : a_1 : a_2 : a_3 : s
|
||||
& d
|
||||
& h
|
||||
@@ -360,7 +360,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
</ul>
|
||||
<p class="caption" role="heading"><span class="caption-text">References</span></p>
|
||||
<ul class="current">
|
||||
<li class="toctree-l1"><a class="reference internal" href="gm-state-transition-rules.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="gm-state-transitions.html">G-Machine State Transition Rules</a></li>
|
||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Template Instantiator State Transition Rules</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -368,7 +368,7 @@ evaluated as False (<code class="code docutils literal notranslate"><span class=
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="gm-state-transition-rules.html" title="previous chapter">G-Machine State Transition Rules</a></li>
|
||||
<li>Previous: <a href="gm-state-transitions.html" title="previous chapter">G-Machine State Transition Rules</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -50,6 +50,8 @@ imgmath_latex_preamble = r'''
|
||||
\end{tblr} }
|
||||
|
||||
\newcommand{\nillist}{[\,]}
|
||||
|
||||
\newcommand{\concat}{+\kern-1.3ex+\kern0.8ex}
|
||||
'''
|
||||
|
||||
imgmath_image_format = 'svg'
|
||||
|
||||
@@ -363,6 +363,47 @@ Core Transition Rules
|
||||
& m
|
||||
}
|
||||
|
||||
#. Pack a constructor if there are sufficient arguments
|
||||
|
||||
.. math::
|
||||
\gmrule
|
||||
{ \mathtt{Pack} \; t \; n : i
|
||||
& a_1 : \ldots : a_n : s
|
||||
& d
|
||||
& h
|
||||
& m
|
||||
}
|
||||
{ i
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; [a_1,\ldots,a_n]
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
|
||||
#. Evaluate a case
|
||||
|
||||
.. math::
|
||||
\gmrule
|
||||
{ \mathtt{CaseJump} \begin{bmatrix} t \to c \end{bmatrix} : i
|
||||
& a : s
|
||||
& d
|
||||
& h
|
||||
\begin{bmatrix}
|
||||
a : \mathtt{NConstr} \; t \; v
|
||||
\end{bmatrix}
|
||||
& m
|
||||
}
|
||||
{ c \concat i
|
||||
& d
|
||||
& h
|
||||
& m
|
||||
}
|
||||
|
||||
|
||||
|
||||
***************
|
||||
Extension Rules
|
||||
***************
|
||||
|
||||
Reference in New Issue
Block a user