Type inference of Joy expressions.

More remains to be done but it seems to work.
This commit is contained in:
Simon Forman
2018-06-29 13:19:12 -07:00
parent 6ca59847ab
commit 4406a6620b
25 changed files with 1867 additions and 4593 deletions
@@ -35,8 +35,10 @@
<li><a href="joy/library.html">joy.library</a></li>
<li><a href="joy/parser.html">joy.parser</a></li>
<li><a href="joy/utils/generated_library.html">joy.utils.generated_library</a></li>
<li><a href="joy/utils/polytypes.html">joy.utils.polytypes</a></li>
<li><a href="joy/utils/pretty_print.html">joy.utils.pretty_print</a></li>
<li><a href="joy/utils/stack.html">joy.utils.stack</a></li>
<li><a href="joy/utils/types.html">joy.utils.types</a></li>
</ul>
</div>
@@ -127,7 +127,6 @@
<span class="s1">of == swap at</span>
<span class="s1">product == 1 swap [*] step</span>
<span class="s1">flatten == [] swap [concat] step</span>
<span class="s1">unit == [] cons</span>
<span class="s1">quoted == [unit] dip</span>
<span class="s1">unquoted == [i] dip</span>
<span class="s1">enstacken == stack [clear] dip</span>
@@ -153,13 +152,17 @@
<span class="s1">anamorphism == [pop []] swap [dip swons] genrec</span>
<span class="s1">range == [0 &lt;=] [1 - dup] anamorphism</span>
<span class="s1">while == swap [nullary] cons dup dipd concat loop</span>
<span class="s1">dudipd == dup dipd</span>
<span class="s1">dupdipd == dup dipd</span>
<span class="s1">primrec == [i] genrec</span>
<span class="s1">step_zero == 0 roll&gt; step</span>
<span class="s1">codireco == cons dip rest cons</span>
<span class="s1">make_generator == [codireco] ccons</span>
<span class="s1">ccons == cons cons</span>
<span class="s1">&#39;&#39;&#39;</span>
<span class="c1"># ifte == [nullary not] dipd branch</span>
<span class="c1"># ifte == [nullary] dipd swap branch</span>
<span class="c1">##ccons == cons cons</span>
<span class="c1">##unit == [] cons</span>
<span class="c1">##second == rest first</span>
<span class="c1">##third == rest rest first</span>
<span class="c1">##swons == swap cons</span>
@@ -605,12 +608,12 @@
<span class="c1">## return second, (tos, stack)</span>
<div class="viewcode-block" id="swaack"><a class="viewcode-back" href="../../library.html#joy.library.swaack">[docs]</a><span class="nd">@inscribe</span>
<span class="nd">@SimpleFunctionWrapper</span>
<span class="k">def</span> <span class="nf">swaack</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;swap stack&#39;&#39;&#39;</span>
<span class="n">old_stack</span><span class="p">,</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
<span class="k">return</span> <span class="n">stack</span><span class="p">,</span> <span class="n">old_stack</span></div>
<span class="c1">##@inscribe</span>
<span class="c1">##@SimpleFunctionWrapper</span>
<span class="c1">##def swaack(stack):</span>
<span class="c1">## &#39;&#39;&#39;swap stack&#39;&#39;&#39;</span>
<span class="c1">## old_stack, stack = stack</span>
<span class="c1">## return stack, old_stack</span>
<span class="c1">##@inscribe</span>
@@ -189,7 +189,7 @@
<span class="c1"># RuntimeError: maximum recursion depth exceeded</span>
<span class="c1"># on quotes longer than sys.getrecursionlimit().</span>
<span class="c1">## return (quote[0], concat(quote[1], expression)) if quote else expression</span>
<span class="k">return</span> <span class="p">(</span><span class="n">quote</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">concat</span><span class="p">(</span><span class="n">quote</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">expression</span><span class="p">))</span> <span class="k">if</span> <span class="n">quote</span> <span class="k">else</span> <span class="n">expression</span></div>
<span class="c1"># Original implementation.</span>
@@ -198,13 +198,13 @@
<span class="c1"># In-lining is slightly faster (and won&#39;t break the</span>
<span class="c1"># recursion limit on long quotes.)</span>
<span class="n">temp</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">quote</span><span class="p">:</span>
<span class="n">item</span><span class="p">,</span> <span class="n">quote</span> <span class="o">=</span> <span class="n">quote</span>
<span class="n">temp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">temp</span><span class="p">):</span>
<span class="n">expression</span> <span class="o">=</span> <span class="n">item</span><span class="p">,</span> <span class="n">expression</span>
<span class="k">return</span> <span class="n">expression</span></div>
<span class="c1">## temp = []</span>
<span class="c1">## while quote:</span>
<span class="c1">## item, quote = quote</span>
<span class="c1">## temp.append(item)</span>
<span class="c1">## for item in reversed(temp):</span>
<span class="c1">## expression = item, expression</span>
<span class="c1">## return expression</span>