@@ -6,7 +6,7 @@
< head >
< meta http-equiv = "X-UA-Compatible" content = "IE=Edge" / >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
< title > Type Inference — Thun 0.2.0 documentation< / title >
< title > The Blissful Elegance of Typing Joy — Thun 0.2.0 documentation< / title >
< link rel = "stylesheet" href = "../_static/alabaster.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/pygments.css" type = "text/css" / >
< script type = "text/javascript" src = "../_static/documentation_options.js" > < / script >
@@ -32,8 +32,8 @@
< div class = "bodywrapper" >
< div class = "body" role = "main" >
< div class = "section" id = "type-inference " >
< h1 > Type Inference < a class = "headerlink" href = "#type-inference " title = "Permalink to this headline" > ¶< / a > < / h1 >
< div class = "section" id = "the-blissful-elegance-of-typing-joy " >
< h1 > The Blissful Elegance of Typing Joy < a class = "headerlink" href = "#the-blissful-elegance-of-typing-joy " title = "Permalink to this headline" > ¶< / a > < / h1 >
< p > This notebook presents a simple type inferencer for Joy code. It can
infer the stack effect of most Joy expressions. It’ s built largely by
means of existing ideas and research. (A great overview of the existing
@@ -410,6 +410,8 @@ integers or tuples of type descriptors:</p>
< span class = "n" > s< / span > < span class = "p" > [< / span > < span class = "n" > u< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > v< / span >
< span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > v< / span > < span class = "p" > ,< / span > < span class = "nb" > int< / span > < span class = "p" > ):< / span >
< span class = "n" > s< / span > < span class = "p" > [< / span > < span class = "n" > v< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > u< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span >
< span class = "k" > return< / span > < span class = "n" > s< / span >
< / pre > < / div >
@@ -566,6 +568,9 @@ work:</p>
< span class = "nb" > print< / span > < span class = "n" > e< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > Cannot< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "mi" > 2< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "p" > (< / span > < span class = "mi" > 1001< / span > < span class = "p" > ,< / span > < span class = "mi" > 1002< / span > < span class = "p" > )< / span > < span class = "o" > .< / span >
< / pre > < / div >
< / div >
< div class = "section" id = "unify-version-2" >
< h4 > < code class = "docutils literal notranslate" > < span class = "pre" > unify()< / span > < / code > version 2< a class = "headerlink" href = "#unify-version-2" title = "Permalink to this headline" > ¶< / a > < / h4 >
< p > The problem is that the < code class = "docutils literal notranslate" > < span class = "pre" > unify()< / span > < / code > function as written doesn’ t handle
@@ -594,6 +599,8 @@ deal with this recursively:</p>
< span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "n" > c< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "p" > )< / span >
< span class = "k" > if< / span > < span class = "n" > s< / span > < span class = "o" > !=< / span > < span class = "kc" > False< / span > < span class = "p" > :< / span >
< span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > b< / span > < span class = "p" > ,< / span > < span class = "n" > d< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span >
< span class = "k" > return< / span > < span class = "n" > s< / span >
< / pre > < / div >
@@ -1337,8 +1344,8 @@ such. Note that this is <em>not</em> a <code class="docutils literal notranslate
< / div >
< p > (Eventually I should come back around to this becuase it’ s not tooo
difficult to exend this code to be able to compile e.g.
< code class = "docutils literal notranslate" > < span class = "pre" > n3 < / span > < span class = "pre" > =< / span > < span class = "pre" > mul(n1,< / span > < span class = "pre" > n2 )< / span > < / code > for < code class = "docutils literal notranslate" > < span class = "pre" > mul< / span > < / code > and insert it in the right place with
the right variable names . It requires a little more support from the
< code class = "docutils literal notranslate" > < span class = "pre" > n2 < / span > < span class = "pre" > =< / span > < span class = "pre" > mul(n1,< / span > < span class = "pre" > n1 )< / span > < / code > for < code class = "docutils literal notranslate" > < span class = "pre" > mul< / span > < / code > with the right variable names and
insert it in the right place . It requires a little more support from the
library functions, in that we need to know to call < code class = "docutils literal notranslate" > < span class = "pre" > mul()< / span > < / code > the Python
function for < code class = "docutils literal notranslate" > < span class = "pre" > mul< / span > < / code > the Joy function, but since < em > most< / em > of the math
functions (at least) are already wrappers it should be straightforward.)< / p >
@@ -2065,7 +2072,7 @@ disappears:</p>
< h2 > Part VII: Typing Combinators< a class = "headerlink" href = "#part-vii-typing-combinators" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > In order to compute the stack effect of combinators you kinda have to
have the quoted programs they expect available. In the most general
case, the < code class = "docutils literal notranslate" > < span class = "pre" > i< / span > < / code > combinator, you can’ t say anything about it’ s stack
case, the < code class = "docutils literal notranslate" > < span class = "pre" > i< / span > < / code > combinator, you can’ t say anything about its stack
effect other than it expects one quote:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > i< / span > < span class = "p" > (< / span > < span class = "o" > ...< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "o" > ...< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > )< / span >
< / pre > < / div >
@@ -2088,14 +2095,21 @@ effect other than it expects one quote:</p>
< / div >
< p > Without any information about the contents of the quote we can’ t say
much about the result.< / p >
< p > I think there’ s a way forward. If we convert our list of terms we are
composing into a stack structure we can use it as a < em > Joy expression < / em > ,
< div class = "section" id = "hybrid-inferencer-interpreter" >
< h3 > Hybrid Inferencer/Interpreter < a class = "headerlink" href = "#hybrid-inferencer-interpreter" title = "Permalink to this headline" > ¶ < / a > < / h3 >
< p > I think there’ s a way forward. If we convert our list (of terms we are
composing) into a stack structure we can use it as a < em > Joy expression< / em > ,
then we can treat the < em > output half< / em > of a function’ s stack effect comment
as a Joy interpreter stack, and just execute combinators directly. We
can hybridize the compostition function with an interpreter to evaluate
combinators, compose non-combinator functions, and put type variables on
the stack. For combinators like < code class = "docutils literal notranslate" > < span class = "pre" > branch< / span > < / code > that can have more than one
stack effect we have to “split universes” again and return both.< / p >
< div class = "section" id = "joy-types-for-functions" >
< h4 > Joy Types for Functions< a class = "headerlink" href = "#joy-types-for-functions" title = "Permalink to this headline" > ¶< / a > < / h4 >
< p > We need a type variable for Joy functions that can go in our expressions
and be used by the hybrid inferencer/interpreter. They have to store a
name and a list of stack effects.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > class< / span > < span class = "nc" > FunctionJoyType< / span > < span class = "p" > (< / span > < span class = "n" > AnyJoyType< / span > < span class = "p" > ):< / span >
< span class = "k" > def< / span > < span class = "nf" > __init__< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > name< / span > < span class = "p" > ,< / span > < span class = "n" > sec< / span > < span class = "p" > ,< / span > < span class = "n" > number< / span > < span class = "p" > ):< / span >
@@ -2109,159 +2123,198 @@ stack effect we have to “split universes” again and return both.</p>
< span class = "k" > def< / span > < span class = "nf" > __repr__< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ):< / span >
< span class = "k" > return< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > name< / span >
< span class = "k" > class< / span > < span class = "nc" > SymbolJoyType< / span > < span class = "p" > (< / span > < span class = "n" > FunctionJoyType< / span > < span class = "p" > ):< / span > < span class = "n" > prefix< / span > < span class = "o" > =< / span > < span class = "s1" > ' F' < / span >
< span class = "k" > class< / span > < span class = "nc" > CombinatorJoyType< / span > < span class = "p" > (< / span > < span class = "n" > FunctionJoyType< / span > < span class = "p" > ):< / span > < span class = "n" > prefix< / span > < span class = "o" > =< / span > < span class = "s1" > ' C' < / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > def < / span > < span class = "nf" > flatten < / span > < span class = "p" > ( < / span > < span class = "n" > g < / span > < span class = "p" > ): < / span >
< span class = "k" > return < / span > < span class = "nb" > list < / span > < span class = "p" > ( < / span > < span class = "n" > chain < / span > < span class = "o" > . < / span > < span class = "n" > from_iterable < / span > < span class = "p" > ( < / span > < span class = "n" > g < / span > < span class = "p" > )) < / span >
< / div >
< div class = "section" id = "specialized-for-simple-functions-and-combinators" >
< h4 > Specialized for Simple Functions and Combinators< a class = "headerlink" href = "#specialized-for-simple-functions-and-combinators" title = "Permalink to this headline" > ¶< / a > < / h4 >
< p > For non-combinator functions the stack effects list contains stack
effect comments (represented by pairs of cons-lists as described above.)< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > class< / span > < span class = "nc" > SymbolJoyType< / span > < span class = "p" > (< / span > < span class = "n" > FunctionJoyType< / span > < span class = "p" > ):< / span >
< span class = "n" > prefix< / span > < span class = "o" > =< / span > < span class = "s1" > ' F' < / span >
< / pre > < / div >
< / div >
< p > For combinators the list contains Python functions.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > class< / span > < span class = "nc" > CombinatorJoyType< / span > < span class = "p" > (< / span > < span class = "n" > FunctionJoyType< / span > < span class = "p" > ):< / span >
< span class = "n" > prefix< / span > < span class = "o" > =< / span > < span class = "s1" > ' C' < / span >
< span class = "k" > def< / span > < span class = "nf" > __init__< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > name< / span > < span class = "p" > ,< / span > < span class = "n" > sec< / span > < span class = "p" > ,< / span > < span class = "n" > number< / span > < span class = "p" > ,< / span > < span class = "n" > expect< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ):< / span >
< span class = "nb" > super< / span > < span class = "p" > (< / span > < span class = "n" > CombinatorJoyType< / span > < span class = "p" > ,< / span > < span class = "bp" > self< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "fm" > __init__< / span > < span class = "p" > (< / span > < span class = "n" > name< / span > < span class = "p" > ,< / span > < span class = "n" > sec< / span > < span class = "p" > ,< / span > < span class = "n" > number< / span > < span class = "p" > )< / span >
< span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > expect< / span > < span class = "o" > =< / span > < span class = "n" > expect< / span >
< span class = "k" > def< / span > < span class = "nf" > enter_guard< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > f< / span > < span class = "p" > ):< / span >
< span class = "k" > if< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > expect< / span > < span class = "ow" > is< / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "n" > f< / span >
< span class = "n" > g< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > expect< / span > < span class = "p" > ,< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > expect< / span >
< span class = "n" > new_f< / span > < span class = "o" > =< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > compose< / span > < span class = "p" > (< / span > < span class = "n" > f< / span > < span class = "p" > ,< / span > < span class = "n" > g< / span > < span class = "p" > ,< / span > < span class = "p" > ()))< / span >
< span class = "k" > assert< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > new_f< / span > < span class = "p" > )< / span > < span class = "o" > ==< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "nb" > repr< / span > < span class = "p" > (< / span > < span class = "n" > new_f< / span > < span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > new_f< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< p > For simple combinators that have only one effect (like < code class = "docutils literal notranslate" > < span class = "pre" > dip< / span > < / code > ) you only
need one function and it can be the combinator itself.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > import< / span > < span class = "nn" > joy.library< / span >
< span class = "n" > dip< / span > < span class = "o" > =< / span > < span class = "n" > CombinatorJoyType< / span > < span class = "p" > (< / span > < span class = "s1" > ' dip' < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > dip< / span > < span class = "p" > ],< / span > < span class = "mi" > 23< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< p > For combinators that can have more than one effect (like < code class = "docutils literal notranslate" > < span class = "pre" > branch< / span > < / code > ) you
have to write functions that each implement the action of one of the
effects.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > def< / span > < span class = "nf" > branch_true< / span > < span class = "p" > (< / span > < span class = "n" > stack< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > dictionary< / span > < span class = "p" > ):< / span >
< span class = "p" > (< / span > < span class = "n" > then< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > else_< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > flag< / span > < span class = "p" > ,< / span > < span class = "n" > stack< / span > < span class = "p" > )))< / 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" > concat< / span > < span class = "p" > (< / span > < span class = "n" > then< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ),< / span > < span class = "n" > dictionary< / span >
< span class = "k" > def< / span > < span class = "nf" > branch_false< / span > < span class = "p" > (< / span > < span class = "n" > stack< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > dictionary< / span > < span class = "p" > ):< / span >
< span class = "p" > (< / span > < span class = "n" > then< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > else_< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > flag< / span > < span class = "p" > ,< / span > < span class = "n" > stack< / span > < span class = "p" > )))< / 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" > concat< / span > < span class = "p" > (< / span > < span class = "n" > else_< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ),< / span > < span class = "n" > dictionary< / span >
< span class = "n" > branch< / span > < span class = "o" > =< / span > < span class = "n" > CombinatorJoyType< / span > < span class = "p" > (< / span > < span class = "s1" > ' branch' < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > branch_true< / span > < span class = "p" > ,< / span > < span class = "n" > branch_false< / span > < span class = "p" > ],< / span > < span class = "mi" > 100< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< p > You can also provide an optional stack effect, input-side only, that
will then be used as an identity function (that accepts and returns
stacks that match the “guard” stack effect) which will be used to guard
against type mismatches going into the evaluation of the combinator.< / p >
< / div >
< div class = "section" id = "infer" >
< h4 > < code class = "docutils literal notranslate" > < span class = "pre" > infer()< / span > < / code > < a class = "headerlink" href = "#infer" title = "Permalink to this headline" > ¶< / a > < / h4 >
< p > With those in place, we can define a function that accepts a sequence of
Joy type variables, including ones representing functions (not just
values), and attempts to grind out all the possible stack effects of
that expression.< / p >
< p > One tricky thing is that type variables < em > in the expression< / em > have to be
updated along with the stack effects after doing unification or we risk
losing useful information. This was a straightforward, if awkward,
modification to the call structure of < code class = "docutils literal notranslate" > < span class = "pre" > meta_compose()< / span > < / code > et. al.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > ID< / span > < span class = "o" > =< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span > < span class = "c1" > # Identity function.< / span >
< span class = "n " > ID < / span > < span class = "o " > = < / span > < span class = "n" > S < / span > < span class = "p" > [ < / span > < span class = "mi " > 0 < / span > < span class = "p" > ], < / span > < span class = "n" > S < / span > < span class = "p" > [ < / span > < span class = "mi" > 0 < / span > < span class = "p" > ] < / span > < span class = "c1" > # Identity function. < / span >
< span class = "k " > def < / span > < span class = "nf " > infer < / span > < span class = "p" > ( < / span > < span class = "o " > * < / span > < span class = "n" > expression < / span > < span class = "p" > ): < / span >
< span class = "k" > return< / span > < span class = "nb" > sorted< / span > < span class = "p" > (< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > _infer< / span > < span class = "p" > (< / span > < span class = "n" > list_to_stack< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ))))< / span >
< span class = "k" > def< / span > < span class = "nf" > infer< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > F< / span > < span class = "o" > =< / span > < span class = "n" > ID< / span > < span class = "p" > ):< / span >
< span class = "k" > def< / span > < span class = "nf" > _ infer< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > F< / span > < span class = "o" > =< / span > < span class = "n" > ID< / span > < span class = "p" > ):< / span >
< span class = "n" > _log_it< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > F< / span > < span class = "p" > )< / span >
< span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > e< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "p" > [< / span > < span class = "n" > F< / span > < span class = "p" > ]< / span >
< span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "o" > =< / span > < span class = "n" > e< / span >
< span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > SymbolJoyType< / span > < span class = "p" > ):< / span >
< span class = "n" > res < / span > < span class = "o" > =< / span > < span class = "n" > flatten < / span > < span class = "p" > ( < / span > < span class = "n" > infer < / span > < span class = "p" > ( < / span > < span class = "n" > e < / span > < span class = "p" > , < / span > < span class = "n" > Fn < / span > < span class = "p" > ) < / span > < span class = "k" > for < / span > < span class = "n" > F n< / span > < span class = "ow " > in < / span > < span class = "n" > MC < / span > < span class = "p" > ([ < / span > < span class = "n" > F < / span > < span class = "p" > ] ,< / span > < span class = "n" > n < / span > < span class = "o" > . < / span > < span class = "n" > stack_effects < / span > < span class = "p" > )) < / span >
< span class = "n" > eFG < / span > < span class = "o" > =< / span > < span class = "n" > meta_compose < / span > < span class = "p" > ([ < / span > < span class = "n" > F< / span > < span class = "p" > ], < / span > < span class = "n" > n< / span > < span class = "o" > . < / span > < span class = "n" > stack_effects < / span > < span class = "p" > ,< / span > < span class = "n" > e < / span > < span class = "p" > )< / span >
< span class = "n" > res< / span > < span class = "o" > =< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > _infer< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > Fn< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > Fn< / span > < span class = "ow" > in< / span > < span class = "n" > eFG< / span > < span class = "p" > )< / span >
< span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > CombinatorJoyType< / span > < span class = "p" > ):< / span >
< span class = "n" > res < / span > < span class = "o" > = < / span > < span class = "p" > [] < / span >
< span class = "k " > for < / span > < span class = "n" > combinator < / span > < span class = "ow" > in< / span > < span class = "n" > n< / span > < span class = "o" > .< / span > < span class = "n" > stack_effects< / span > < span class = "p" > : < / span >
< span class = "n" > fi< / span > < span class = "p" > ,< / span > < span class = "n" > fo< / span > < span class = "o" > =< / span > < span class = "n" > F< / span >
< span class = "n " > new_fo < / span > < span class = "p" > , < / span > < span class = "n" > ee < / span > < span class = "p" > , < / span > < span class = "n" > _ < / span > < span class = "o" > = < / span > < span class = "n" > combinator < / span > < span class = "p" > (< / span > < span class = "n" > fo < / span > < span class = "p" > ,< / span > < span class = "n" > e < / span > < span class = "p" > , < / span > < span class = "p" > {} )< / span >
< span class = "n " > ee < / span > < span class = "o " > = < / span > < span class = "n " > update < / span > < span class = "p " > ( < / span > < span class = "n" > FUNCTIONS< / span > < span class = "p" > ,< / span > < span class = "n" > ee < / span > < span class = "p" > ) < / span > < span class = "c1 " > # Fix Symbols. < / span >
< span class = "n" > new_F < / span > < span class = "o" > = < / span > < span class = "n" > fi < / span > < span class = "p" > , < / span > < span class = "n" > new_fo < / span >
< span class = "n" > res< / span > < span class = "o" > . < / span > < span class = "n" > extend < / span > < span class = "p" > (< / span > < span class = "n" > infer < / span > < span class = "p" > ( < / span > < span class = "n" > ee < / span > < span class = "p" > , < / span > < span class = "n" > new_F < / span > < span class = "p" > )) < / span >
< span class = "n" > fi < / span > < span class = "p" > , < / span > < span class = "n" > fo < / span > < span class = "o" > = < / span > < span class = "n" > n < / span > < span class = "o" > . < / span > < span class = "n" > enter_guard < / span > < span class = "p" > ( < / span > < span class = "n" > F < / span > < span class = "p" > ) < / span >
< span class = "n " > res < / span > < span class = "o" > = < / span > < span class = "n" > flatten < / span > < span class = "p" > ( < / span > < span class = "n" > _interpret < / span > < span class = "p" > ( < / span > < span class = "n" > f < / span > < span class = "p" > , < / span > < span class = "n" > fi < / span > < span class = "p" > , < / span > < span class = "n" > fo < / span > < span class = "p" > , < / span > < span class = "n" > e < / span > < span class = "p" > ) < / span > < span class = "k" > for < / span > < span class = "n" > f < / span > < span class = "ow" > in< / span > < span class = "n" > n< / span > < span class = "o" > .< / span > < span class = "n" > stack_effects< / span > < span class = "p" > ) < / span >
< span class = "k " > elif < / span > < span class = "nb" > isinstance < / span > < span class = "p" > (< / span > < span class = "n" > n < / span > < span class = "p" > ,< / span > < span class = "n" > Symbol < / span > < span class = "p" > ): < / span >
< span class = "k " > assert < / span > < span class = "n " > n < / span > < span class = "ow " > not < / span > < span class = "ow " > in < / span > < span class = "n" > FUNCTIONS< / span > < span class = "p" > ,< / span > < span class = "nb " > repr < / span > < span class = "p" > ( < / span > < span class = "n " > n < / span > < span class = "p" > ) < / span >
< span class = "n" > func < / span > < span class = "o" > = < / span > < span class = "n" > joy < / span > < span class = "o" > . < / span > < span class = "n" > library < / span > < span class = "o" > . < / span > < span class = "n" > _dictionary < / span > < span class = "p" > [ < / span > < span class = "n" > n< / span > < span class = "p" > ] < / span >
< span class = "n" > res< / span > < span class = "o" > = < / span > < span class = "n" > _interpret < / span > < span class = "p" > (< / span > < span class = "n" > func < / span > < span class = "p" > , < / span > < span class = "n" > F < / span > < span class = "p" > [ < / span > < span class = "mi" > 0 < / span > < span class = "p" > ], < / span > < span class = "n" > F < / span > < span class = "p" > [ < / span > < span class = "mi" > 1 < / span > < span class = "p" > ], < / span > < span class = "n" > e < / span > < span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "n" > lit < / span > < span class = "o " > = < / span > < span class = "n" > s9 < / span > < span class = "p" > , < / span > < span class = "p " > ( < / span > < span class = "n" > n < / span > < span class = "p" > , < / span > < span class = "n" > s9 < / span > < span class = "p" > ) < / span >
< span class = "n" > res< / span > < span class = "o" > =< / span > < span class = "n" > flatten < / span > < span class = "p" > ( < / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > Fn < / span > < span class = " p"> ) < / span > < span class = "k " > for < / span > < span class = "n " > Fn < / span > < span class = "ow" > in < / span > < span class = "n" > MC < / span > < span class = " p"> ([ < / span > < span class = "n" > F < / span > < span class = "p" > ] ,< / span > < span class = "p" > [ < / span > < span class = " n"> lit < / span > < span class = "p" > ] ))< / span >
< span class = "n" > fi < / span > < span class = "p " > , < / span > < span class = "n" > fo < / span > < span class = "o " > = < / span > < span class = "n" > F < / span >
< span class = "n" > res< / span > < span class = "o" > =< / span > < span class = "n" > _ infer< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "p" > ( < / span > < span class = "n " > fi < / span > < span class = "p " > , < / span > < span class = "p" > (< / span > < span class = "n" > n < / span > < span class = "p" > ,< / span > < span class = "n" > fo < / span > < span class = "p" > ) ))< / span >
< span class = "k" > return< / span > < span class = "n" > res< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > f0< / span > < span class = "p" > ,< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > f2< / span > < span class = "p" > ,< / span > < span class = "n" > f3< / span > < span class = "p" > ,< / span > < span class = "n" > f4< / span > < span class = "p" > ,< / span > < span class = "n" > f5< / span > < span class = "p" > ,< / span > < span class = "n" > f6< / span > < span class = "p" > ,< / span > < span class = "n" > f7< / span > < span class = "p" > ,< / span > < span class = "n" > f8< / span > < span class = "p" > ,< / span > < span class = "n" > f9< / span > < span class = "o" > =< / span > < span class = "n" > F< / span > < span class = "o" > =< / span > < span class = "nb" > map< / span > < span class = "p" > (< / span > < span class = "n" > FloatJoyType< / span > < span class = "p" > ,< / span > < span class = "n" > _R< / span > < span class = "p" > )< / span >
< span class = "n" > i0< / span > < span class = "p" > ,< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > i2< / span > < span class = "p" > ,< / span > < span class = "n" > i3< / span > < span class = "p" > ,< / span > < span class = "n" > i4< / span > < span class = "p" > ,< / span > < span class = "n" > i5< / span > < span class = "p" > ,< / span > < span class = "n" > i6< / span > < span class = "p" > ,< / span > < span class = "n" > i7< / span > < span class = "p" > ,< / span > < span class = "n" > i8< / span > < span class = "p" > ,< / span > < span class = "n" > i9< / span > < span class = "o" > =< / span > < span class = "n" > I< / span > < span class = "o" > =< / span > < span class = "nb" > map< / span > < span class = "p" > (< / span > < span class = "n" > IntJoyType< / span > < span class = "p" > ,< / span > < span class = "n" > _R< / span > < span class = "p" > )< / span >
< span class = "n" > n0< / span > < span class = "p" > ,< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "n" > n3< / span > < span class = "p" > ,< / span > < span class = "n" > n4< / span > < span class = "p" > ,< / span > < span class = "n" > n5< / span > < span class = "p" > ,< / span > < span class = "n" > n6< / span > < span class = "p" > ,< / span > < span class = "n" > n7< / span > < span class = "p" > ,< / span > < span class = "n" > n8< / span > < span class = "p" > ,< / span > < span class = "n" > n9< / span > < span class = "o" > =< / span > < span class = "n" > N< / span >
< span class = "n" > s0< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "n" > s2< / span > < span class = "p" > ,< / span > < span class = "n" > s3< / span > < span class = "p" > ,< / span > < span class = "n" > s4< / span > < span class = "p" > ,< / span > < span class = "n" > s5< / span > < span class = "p" > ,< / span > < span class = "n" > s6< / span > < span class = "p" > ,< / span > < span class = "n" > s7< / span > < span class = "p" > ,< / span > < span class = "n" > s8< / span > < span class = "p" > ,< / span > < span class = "n" > s9< / span > < span class = "o" > =< / span > < span class = "n" > S< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > import< / span > < span class = "nn" > joy.library< / span >
< span class = "n" > FNs< / span > < span class = "o" > =< / span > < span class = "s1" > ' ' ' ccons cons divmod_ dup dupd first< / span >
< span class = "s1" > over pm pop popd popdd popop pred< / span >
< span class = "s1" > rest rolldown rollup rrest second< / span >
< span class = "s1" > sqrt stack succ swaack swap swons< / span >
< span class = "s1" > third tuck uncons' ' ' < / span >
< span class = "n" > FUNCTIONS < / span > < span class = "o" > = < / span > < span class = "p" > { < / span >
< span class = "n" > name < / span > < span class = "p" > : < / span > < span class = "n" > SymbolJoyTyp e< / span > < span class = "p" > ( < / span > < span class = "n" > name < / span > < span class = "p " > , < / span > < span class = "p " > [ < / span > < span class = "n " > NEW_DEFS < / span > < span class = "p " > [ < / span > < span class = "n " > name < / span > < span class = "p " > ]], < / span > < span class = "n " > i < / span > < span class = "p" > )< / span >
< span class = "k" > for < / span > < span class = "n" > i < / span > < span class = "p" > , < / span > < span class = "n" > nam e< / span > < span class = "ow " > in < / span > < span class = "nb " > enumer ate< / span > < span class = "p" > (< / span > < span class = "n" > FNs < / span > < span class = "o " > . < / span > < span class = "n" > strip < / span > < span class = "p" > ( )< / span > < span class = "o " > . < / span > < span class = "n" > split < / span > < span class = "p" > ()) < / span >
< span class = "p" > } < / span >
< span class = "n" > FUNCTIONS < / span > < span class = "p" > [ < / span > < span class = "s1" > ' sum ' < / span > < span class = "p" > ] < / span > < span class = "o " > = < / span > < span class = "n" > SymbolJoyType < / span > < span class = "p" > ( < / span > < span class = "s1" > ' sum ' < / span > < span class = "p" > , < / span > < span class = "p" > [((( < / span > < span class = "n" > Ns < / span > < span class = "p" > [ < / span > < span class = "mi" > 1 < / span > < span class = "p" > ], < / span > < span class = "n" > s1 < / span > < span class = "p" > ), < / span > < span class = "n" > s0 < / span > < span class = "p" > ), < / span > < span class = "p" > (< / span > < span class = "n" > n0 < / span > < span class = "p" > ,< / span > < span class = "n" > s0 < / span > < span class = "p" > ))], < / span > < span class = "mi" > 100 < / span > < span class = "p" > )< / span >
< span class = "n" > FUNCTIONS< / span > < span class = "p" > [< / span > < span class = "s1" > ' mul' < / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > SymbolJoyType< / span > < span class = "p" > (< / span > < span class = "s1" > ' mul' < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span >
< span class = "p" > ((< / span > < span class = "n" > i2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > i3< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span >
< span class = "p" > ((< / span > < span class = "n" > f2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > f3< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span >
< span class = "p" > ((< / span > < span class = "n" > i2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > f3< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span >
< span class = "p" > ((< / span > < span class = "n" > f2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > f3< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "p" > )),< / span >
< span class = "p" > ],< / span > < span class = "mi" > 101< / span > < span class = "p" > )< / span >
< span class = "n" > FUNCTIONS< / span > < span class = "o" > .< / span > < span class = "n" > update< / span > < span class = "p" > ({< / span >
< span class = "n" > combo< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "p" > :< / span > < span class = "n" > CombinatorJoyType< / span > < span class = "p" > (< / span > < span class = "n" > combo< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > combo< / span > < span class = "p" > ],< / span > < span class = "n" > i< / span > < span class = "p" > )< / span >
< span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "n" > combo< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > ((< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > dip< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > dipd< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > dipdd< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > dupdip< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > b< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span >
< span class = "n" > joy< / span > < span class = "o" > .< / span > < span class = "n" > library< / span > < span class = "o" > .< / span > < span class = "n" > infra< / span > < span class = "p" > ,< / span >
< span class = "p" > ))< / span >
< span class = "p" > })< / span >
< span class = "k" > def < / span > < span class = "nf" > _interpret < / span > < span class = "p" > ( < / span > < span class = "n" > f < / span > < span class = "p" > , < / span > < span class = "n" > fi < / span > < span class = "p" > , < / span > < span class = "n" > fo < / span > < span class = "p" > , < / span > < span class = "n" > e < / span > < span class = "p" > ): < / span >
< span class = "n" > new_fo < / span > < span class = "p" > , < / span > < span class = "n" > e e< / span > < span class = "p" > , < / span > < span class = "n" > _ < / span > < span class = "o " > = < / span > < span class = "n " > f < / span > < span class = "p " > ( < / span > < span class = "n " > fo < / span > < span class = "p " > , < / span > < span class = "n " > e < / span > < span class = "p " > , < / span > < span class = "p" > {} )< / span >
< span class = "n" > e e< / span > < span class = "o" > = < / span > < span class = "n" > upd ate< / span > < span class = "p" > (< / span > < span class = "n" > FUNCTIONS < / span > < span class = "p " > , < / span > < span class = "n" > ee < / span > < span class = "p" > )< / span > < span class = "c1 " > # Fix Symbols. < / span >
< span class = "n" > new_F < / span > < span class = "o" > = < / span > < span class = "n" > fi < / span > < span class = "p" > , < / span > < span class = "n" > new_fo < / span >
< span class = "k " > return < / span > < span class = "n" > _infer < / span > < span class = "p" > (< / span > < span class = "n" > ee < / span > < span class = "p" > ,< / span > < span class = "n" > new_F < / span > < span class = "p" > )< / span >
< span class = "k" > def< / span > < span class = "nf" > branch_true< / span > < span class = "p" > (< / span > < span class = "n" > stack< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > dictionary< / span > < span class = "p" > ):< / span >
< span class = "p" > (< / span > < span class = "n" > then< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > else_< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > flag< / span > < span class = "p" > ,< / span > < span class = "n" > stack< / span > < span class = "p" > )))< / 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" > CONCAT< / span > < span class = "p" > (< / span > < span class = "n" > then< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > ),< / span > < span class = "n" > dictionary< / span >
< span class = "k" > def< / span > < span class = "nf" > branch_false < / span > < span class = "p" > ( < / span > < span class = "n" > stack < / span > < span class = "p" > , < / span > < span class = "n" > expression < / span > < span class = "p" > ,< / span > < span class = "n" > dictionary < / span > < span class = "p" > ):< / span >
< span class = "p" > ( < / span > < span class = "n" > then < / span > < span class = "p" > , < / span > < span class = "p" > ( < / span > < span class = "n" > else_ < / span > < span class = "p" > , < / span > < span class = "p" > ( < / span > < span class = "n" > fla g< / span > < span class = "p " > , < / span > < span class = "n" > stack < / span > < span class = "p" > ))) < / 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 " > CONCAT < / span > < span class = "p " > ( < / span > < span class = "n " > else_ < / span > < span class = "p " > , < / span > < span class = "n " > expression < / span > < span class = "p " > ), < / span > < span class = "n " > dictionary < / span >
< span class = "k" > def< / span > < span class = "nf" > _log_it < / span > < span class = "p" > ( < / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > F < / span > < span class = "p" > ):< / span >
< span class = "n" > _lo g< / span > < span class = "o " > . < / span > < span class = "n" > info < / span > < span class = "p " > ( < / span >
< span class = "sa " > u < / span > < span class = "s1 " > ' < / span > < span class = "si " > %3i < / span > < span class = "s1 " > < / span > < span class = "si " > %s < / span > < span class = "s1 " > ∘ < / span > < span class = "si " > %s < / span > < span class = "s1 " > ' < / span > < span class = "p " > , < / span >
< span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > inspect_stack< / span > < span class = "p" > ()),< / span >
< span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > F< / span > < span class = "p" > ),< / span >
< span class = "n" > expression_to_string< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ),< / span >
< span class = "p" > )< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "work-in-progress" >
< h4 > Work in Progress< a class = "headerlink" href = "#work-in-progress" title = "Permalink to this headline" > ¶< / a > < / h4 >
< p > And that brings us to current Work-In-Progress. The mixed-mode
inferencer/interpreter < code class = "docutils literal notranslate" > < span class = "pre" > infer()< / span > < / code > function seems to work well. There
are details I should document, and the rest of the code in the
“polytypes” module (FIXME link to its docs here!) should be explained…
There is cruft to convert the definitions in < code class = "docutils literal notranslate" > < span class = "pre" > DEFS< / span > < / code > to the new
< code class = "docutils literal notranslate" > < span class = "pre" > SymbolJoyType< / span > < / code > objects, and some combinators. Here is an example of
output from the current code :< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "mi" > 1< / span > < span class = "o" > /< / span > < span class = "mi" > 0< / span > < span class = "c1" > # (Don' t try to run this cell! It' s not going to work. This is " read only" code heh..)< / span >
< span class = "n" > FUNCTIONS < / span > < span class = "p " > [ < / span > < span class = "s1 " > ' branch ' < / span > < span class = "p" > ] < / span > < span class = "o" > =< / span > < span class = "n " > CombinatorJoyType < / span > < span class = "p " > ( < / span > < span class = "s1" > ' branch ' < / span > < span class = "p" > ,< / span > < span class = "p " > [ < / span > < span class = "n" > branch_true < / span > < span class = "p" > ,< / span > < span class = "n" > branch_false < / span > < span class = "p " > ], < / span > < span class = "mi" > 100 < / span > < span class = "p" > )< / span >
< span class = "n" > logging < / span > < span class = "o " > . < / span > < span class = "n " > basicConfig < / span > < span class = "p" > ( < / span > < span class = "nb" > format < / span > < span class = "o" > =< / span > < span class = "s1 " > ' < / span > < span class = "si " > %(message)s < / span > < span class = "s1" > ' < / span > < span class = "p" > ,< / span > < span class = "n " > stream < / span > < span class = "o" > = < / span > < span class = "n" > sys < / span > < span class = "o" > . < / span > < span class = "n" > stdout < / span > < span class = "p" > ,< / span > < span class = "n" > level < / span > < span class = "o " > = < / span > < span class = "n" > logging < / span > < span class = "o" > . < / span > < span class = "n" > INFO < / span > < span class = "p" > )< / span >
< span class = "nb" > globals< / span > < span class = "p" > ()< / span > < span class = "o" > .< / span > < span class = "n" > update< / span > < span class = "p" > (< / span > < span class = "n" > FUNCTIONS< / span > < span class = "p" > )< / span >
< span class = "n" > h< / span > < span class = "o" > =< / span > < span class = "n" > infer< / span > < span class = "p" > ((< / span > < span class = "n" > pred< / span > < span class = "p" > ,< / span > < span class = "n" > s2< / span > < span class = "p" > ),< / span > < span class = "p" > (< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "n" > s3< / span > < span class = "p" > ),< / span > < span class = "p" > (< / span > < span class = "n" > div< / span > < span class = "p" > ,< / span > < span class = "n" > s4< / span > < span class = "p" > ),< / span > < span class = "p" > (< / span > < span class = "n" > nullary< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "nb" > bool< / span > < span class = "p" > ,< / span > < span class = "n" > s5< / span > < span class = "p" > )),< / span > < span class = "n" > dipd< / span > < span class = "p" > ,< / span > < span class = "n" > branch< / span > < span class = "p" > )< / span >
< span class = "nb" > print< / span > < span class = "s1" > ' -' < / span > < span class = "o" > *< / span > < span class = "mi" > 40< / span >
< span class = "k" > for< / span > < span class = "n" > fi< / span > < span class = "p" > ,< / span > < span class = "n" > fo< / span > < span class = "ow" > in< / span > < span class = "n" > h< / span > < span class = "p" > :< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "n" > fi< / span > < span class = "p" > ,< / span > < span class = "n" > fo< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "nb" > globals < / span > < span class = "p" > () < / span > < span class = "o" > . < / span > < span class = "n" > update < / span > < span class = "p" > ( < / span > < span class = "n" > FUNCTIONS < / span > < span class = "p" > ) < / span >
< p > The numbers at the start of the lines are the current depth of the
Python call stack. They’ re followed by the current computed stack effect
(initialized to < code class = "docutils literal notranslate" > < span class = "pre" > ID< / span > < / code > ) then the pending expression (the inference of
the stack effect of which is the whole object of the current example.)< / p >
< p > In this example we are implementing (and inferring) < code class = "docutils literal notranslate" > < span class = "pre" > ifte< / span > < / code > as
< code class = "docutils literal notranslate" > < span class = "pre" > [nullary< / span > < span class = "pre" > bool]< / span > < span class = "pre" > dipd< / span > < span class = "pre" > branch< / span > < / code > which shows off a lot of the current
implementation in action.< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > 7 (--) ∘ [pred] [mul] [div] [nullary bool] dipd branch
8 (-- [pred ...2]) ∘ [mul] [div] [nullary bool] dipd branch
9 (-- [pred ...2] [mul ...3]) ∘ [div] [nullary bool] dipd branch
10 (-- [pred ...2] [mul ...3] [div ...4]) ∘ [nullary bool] dipd branch
11 (-- [pred ...2] [mul ...3] [div ...4] [nullary bool ...5]) ∘ dipd branch
15 (-- [pred ...5]) ∘ nullary bool [mul] [div] branch
19 (-- [pred ...2]) ∘ [stack] dinfrirst bool [mul] [div] branch
20 (-- [pred ...2] [stack ]) ∘ dinfrirst bool [mul] [div] branch
22 (-- [pred ...2] [stack ]) ∘ dip infra first bool [mul] [div] branch
26 (--) ∘ stack [pred] infra first bool [mul] [div] branch
29 (... -- ... [...]) ∘ [pred] infra first bool [mul] [div] branch
30 (... -- ... [...] [pred ...1]) ∘ infra first bool [mul] [div] branch
34 (--) ∘ pred s1 swaack first bool [mul] [div] branch
37 (n1 -- n2) ∘ [n1] swaack first bool [mul] [div] branch
38 (... n1 -- ... n2 [n1 ...]) ∘ swaack first bool [mul] [div] branch
41 (... n1 -- ... n1 [n2 ...]) ∘ first bool [mul] [div] branch
44 (n1 -- n1 n2) ∘ bool [mul] [div] branch
47 (n1 -- n1 b1) ∘ [mul] [div] branch
48 (n1 -- n1 b1 [mul ...1]) ∘ [div] branch
49 (n1 -- n1 b1 [mul ...1] [div ...2]) ∘ branch
53 (n1 -- n1) ∘ div
56 (f2 f1 -- f3) ∘
56 (i1 f1 -- f2) ∘
56 (f1 i1 -- f2) ∘
56 (i2 i1 -- f1) ∘
53 (n1 -- n1) ∘ mul
56 (f2 f1 -- f3) ∘
56 (i1 f1 -- f2) ∘
56 (f1 i1 -- f2) ∘
56 (i2 i1 -- i3) ∘
----------------------------------------
(f2 f1 -- f3)
(i1 f1 -- f2)
(f1 i1 -- f2)
(i2 i1 -- f1)
(i2 i1 -- i3)
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > from< / span > < span class = "nn" > itertools< / span > < span class = "k" > import< / span > < span class = "n" > chain< / span >
< span class = "kn" > from< / span > < span class = "nn" > joy.utils.stack< / span > < span class = "k" > import< / span > < span class = "n" > list_to_stack< / span > < span class = "k" > as< / span > < span class = "n" > l2s< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > l2s< / span > < span class = "p" > ([< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "n" > s2< / span > < span class = "p" > ),< / span > < span class = "p" > (< / span > < span class = "n" > stack< / span > < span class = "p" > ,< / span > < span class = "n" > s3< / span > < span class = "p" > ),< / span > < span class = "n" > dip< / span > < span class = "p" > ,< / span > < span class = "n" > infra< / span > < span class = "p" > ,< / span > < span class = "n" > first< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > expression< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "p" > ((< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "n" > s2< / span > < span class = "p" > ),< / span > < span class = "p" > ((< / span > < span class = "n" > stack< / span > < span class = "p" > ,< / span > < span class = "n" > s3< / span > < span class = "p" > ),< / span > < span class = "p" > (< / span > < span class = "n" > dip< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > infra< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > first< / span > < span class = "p" > ,< / span > < span class = "p" > ())))))))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > l2s< / span > < span class = "p" > ([< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "n" > mul< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > expression< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "p" > ())))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > [(< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > ))]< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > [(< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > ))]< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > for< / span > < span class = "n" > stack_effect_comment< / span > < span class = "ow" > in< / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ):< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > stack_effect_comment< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "o" > --< / span > < span class = "n" > f1< / span > < span class = "p" > )< / span >
< span class = "p" > (< / span > < span class = "o" > --< / span > < span class = "n" > i1< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > expression< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > n1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > n2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "p" > ())))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > [(< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > f1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > )),< / span > < span class = "p" > (< / span > < span class = "n" > s1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > i1< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > ))]< / span >
< / pre > < / div >
< / div >
< p > And that brings us to current Work-In-Progress. I’ m pretty hopeful that
the mixed-mode inferencer/interpreter < code class = "docutils literal notranslate" > < span class = "pre" > infer()< / span > < / code > function along with
the ability to specify multiple implementations for the combinators will
permit modelling of the stack effects of e.g. < code class = "docutils literal notranslate" > < span class = "pre" > ifte< / span > < / code > . If I can keep up
the pace I should be able to verify that conjecture by the end of June.< / p >
< / div >
< div class = "section" id = "conclusion" >
< h2 > Conclusion< a class = "headerlink" href = "#conclusion" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > (for now…) < / p >
< p > We built a simple type inferencer, and a kind of crude “compiler” for a
subset of Joy functions. Then we built a more powerful inferencer that
actually does some evaluation and explores branching code paths< / p >
< p > Work remains to be done:< / p >
< ul class = "simple" >
< li > the rest of the library has to be covered< / li >
@@ -2280,19 +2333,17 @@ the pace I should be able to verify that conjecture by the end of June.</p>
went off and just started writing code to see if it would work. It
does, but now I have to come back and describe here what I did.< / li >
< / ul >
< p > I’ m starting to realize that, with the inferencer/checker/compiler
coming along, and with the UI ready to be rewritten in Joy, I’ m close to
a time when my ephasis is going to have to shift from crunchy code stuff
to squishy human stuff. I’ m going to have to put normal people in front
of this and see if, in fact, they < em > can< / em > learn the basics of programming
with it.< / p >
< p > The rest of this stuff is junk and/or unfinished material.< / p >
< / div >
< div class = "section" id = "appendix-joy-in-the-logical-paradigm" >
< h2 > Appendix: Joy in the Logical Paradigm< a class = "headerlink" href = "#appendix-joy-in-the-logical-paradigm" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > For this to work the type label classes have to be modified to let
< code class = "docutils literal notranslate" > < span class = "pre" > T< / span > < span class = "pre" > > =< / span > < span class = "pre" > t< / span > < / code > succeed, where e.g. < code class = "docutils literal notranslate" > < span class = "pre" > T< / span > < / code > is < code class = "docutils literal notranslate" > < span class = "pre" > IntJoyType< / span > < / code > and < code class = "docutils literal notranslate" > < span class = "pre" > t< / span > < / code > is
< code class = "docutils literal notranslate" > < span class = "pre" > int< / span > < / code > < / p >
< p > For < em > type checking < / em > to work the type label classes have to be modified
to let < code class = "docutils literal notranslate" > < span class = "pre" > T< / span > < span class = "pre" > > =< / span > < span class = "pre" > t< / span > < / code > succeed, where e.g. < code class = "docutils literal notranslate" > < span class = "pre" > T< / span > < / code > is < code class = "docutils literal notranslate" > < span class = "pre" > IntJoyType< / span > < / code > and < code class = "docutils literal notranslate" > < span class = "pre" > t< / span > < / code >
is < code class = "docutils literal notranslate" > < span class = "pre" > int< / span > < / code > . If you do that you can take advantage of the < em > logical
relational< / em > nature of the stack effect comments to “compute in reverse”
as it were. There’ s a working demo of this at the end of the
< code class = "docutils literal notranslate" > < span class = "pre" > polytypes< / span > < / code > module. But if you’ re interested in all that you should
just use Prolog!< / p >
< p > Anyhow, type < em > checking< / em > is a few easy steps away.< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > def< / span > < span class = "nf" > _ge< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > other< / span > < span class = "p" > ):< / span >
< span class = "k" > return< / span > < span class = "p" > (< / span > < span class = "nb" > issubclass< / span > < span class = "p" > (< / span > < span class = "n" > other< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "p" > ,< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "p" > )< / span >
< span class = "ow" > or< / span > < span class = "nb" > hasattr< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "s1" > ' accept' < / span > < span class = "p" > )< / span >
@@ -2303,271 +2354,6 @@ with it.</p>
< span class = "n" > StackJoyType< / span > < span class = "o" > .< / span > < span class = "n" > accept< / span > < span class = "o" > =< / span > < span class = "nb" > tuple< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > F< / span > < span class = "o" > =< / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > l2s< / span > < span class = "p" > ((< / span > < span class = "n" > pop< / span > < span class = "p" > ,< / span > < span class = "n" > swap< / span > < span class = "p" > ,< / span > < span class = "n" > rolldown< / span > < span class = "p" > ,< / span > < span class = "n" > rest< / span > < span class = "p" > ,< / span > < span class = "n" > rest< / span > < span class = "p" > ,< / span > < span class = "n" > cons< / span > < span class = "p" > ,< / span > < span class = "n" > cons< / span > < span class = "p" > )))< / span >
< span class = "k" > for< / span > < span class = "n" > f< / span > < span class = "ow" > in< / span > < span class = "n" > F< / span > < span class = "p" > :< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > f< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "n" > a4< / span > < span class = "n" > a5< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "n" > a3< / span > < span class = "n" > a2< / span > < span class = "n" > a1< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a2< / span > < span class = "n" > a3< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > from< / span > < span class = "nn" > joy.parser< / span > < span class = "k" > import< / span > < span class = "n" > text_to_expression< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > F< / span > < span class = "o" > =< / span > < span class = "n" > infer< / span > < span class = "p" > (< / span > < span class = "n" > l2s< / span > < span class = "p" > ((< / span > < span class = "n" > pop< / span > < span class = "p" > ,< / span > < span class = "n" > pop< / span > < span class = "p" > ,< / span > < span class = "n" > pop< / span > < span class = "p" > )))< / span >
< span class = "k" > for< / span > < span class = "n" > f< / span > < span class = "ow" > in< / span > < span class = "n" > F< / span > < span class = "p" > :< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > f< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > a3< / span > < span class = "n" > a2< / span > < span class = "n" > a1< / span > < span class = "o" > --< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "n" > text_to_expression< / span > < span class = "p" > (< / span > < span class = "s1" > ' 0 1 2' < / span > < span class = "p" > )< / span >
< span class = "n" > s< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "mi" > 2< / span > < span class = "p" > ,< / span > < span class = "p" > ())))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > a1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > a2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > a3< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > )))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > L< / span > < span class = "o" > =< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span >
< span class = "n" > L< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ()< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "n" > text_to_expression< / span > < span class = "p" > (< / span > < span class = "s1" > ' 0 1 2 [3 4]' < / span > < span class = "p" > )< / span >
< span class = "n" > s< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "mi" > 2< / span > < span class = "p" > ,< / span > < span class = "p" > ((< / span > < span class = "mi" > 3< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "mi" > 4< / span > < span class = "p" > ,< / span > < span class = "p" > ())),< / span > < span class = "p" > ()))))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > a1< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > a2< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > a3< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > )))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > L< / span > < span class = "o" > =< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span >
< span class = "n" > L< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ()< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > L< / span > < span class = "o" > =< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > s< / span > < span class = "p" > )< / span >
< span class = "n" > L< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ()< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "o" > ---------------------------------------------------------------------------< / span >
< span class = "ne" > IndexError< / span > < span class = "n" > Traceback< / span > < span class = "p" > (< / span > < span class = "n" > most< / span > < span class = "n" > recent< / span > < span class = "n" > call< / span > < span class = "n" > last< / span > < span class = "p" > )< / span >
< span class = "o" > < < / span > < span class = "n" > ipython< / span > < span class = "o" > -< / span > < span class = "nb" > input< / span > < span class = "o" > -< / span > < span class = "mi" > 133< / span > < span class = "o" > -< / span > < span class = "mi" > 58< / span > < span class = "n" > a8e44e9cba< / span > < span class = "o" > > < / span > < span class = "ow" > in< / span > < span class = "o" > < < / span > < span class = "n" > module< / span > < span class = "o" > > < / span > < span class = "p" > ()< / span >
< span class = "o" > ----> < / span > < span class = "mi" > 1< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< span class = "ne" > IndexError< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "n" > index< / span > < span class = "n" > out< / span > < span class = "n" > of< / span > < span class = "nb" > range< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > s< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > A< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span > < span class = "o" > > =< / span > < span class = "mi" > 23< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "abstract-interpretation" >
< h2 > < a class = "reference external" href = "https://en.wikipedia.org/wiki/Abstract_interpretation" > Abstract Interpretation< / a > < a class = "headerlink" href = "#abstract-interpretation" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > I < em > think< / em > this might be sorta what I’ m doing above with the < code class = "docutils literal notranslate" > < span class = "pre" > kav()< / span > < / code >
function… In any event “mixed-mode” interpreters that include values
and type variables and can track constraints, etc. will be, uh,
super-useful. And Abstract Interpretation should be a rich source of
ideas.< / p >
< / div >
< div class = "section" id = "junk" >
< h2 > Junk< a class = "headerlink" href = "#junk" title = "Permalink to this headline" > ¶< / a > < / h2 >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > class< / span > < span class = "nc" > SymbolJoyType< / span > < span class = "p" > (< / span > < span class = "n" > AnyJoyType< / span > < span class = "p" > ):< / span > < span class = "n" > prefix< / span > < span class = "o" > =< / span > < span class = "s1" > ' F' < / span >
< span class = "n" > W< / span > < span class = "o" > =< / span > < span class = "nb" > map< / span > < span class = "p" > (< / span > < span class = "n" > SymbolJoyType< / span > < span class = "p" > ,< / span > < span class = "n" > _R< / span > < span class = "p" > )< / span >
< span class = "n" > k< / span > < span class = "o" > =< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "p" > ((< / span > < span class = "n" > W< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 2< / span > < span class = "p" > ]),< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span >
< span class = "n" > Symbol< / span > < span class = "p" > (< / span > < span class = "s1" > ' cons' < / span > < span class = "p" > )< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > k< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > dip_a< / span > < span class = "o" > =< / span > < span class = "p" > ((< / span > < span class = "n" > W< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 2< / span > < span class = "p" > ]),< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > d< / span > < span class = "o" > =< / span > < span class = "n" > relabel< / span > < span class = "p" > (< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > dip_a< / span > < span class = "p" > )< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > d< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > s< / span > < span class = "o" > =< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > unify< / span > < span class = "p" > (< / span > < span class = "n" > d< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > k< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]))[< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< span class = "n" > s< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > j< / span > < span class = "o" > =< / span > < span class = "n" > update< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > k< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > j< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > j< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > cons< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > for< / span > < span class = "n" > f< / span > < span class = "ow" > in< / span > < span class = "n" > MC< / span > < span class = "p" > ([< / span > < span class = "n" > k< / span > < span class = "p" > ],< / span > < span class = "p" > [< / span > < span class = "n" > dup< / span > < span class = "p" > ]):< / span >
< span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > f< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > l< / span > < span class = "o" > =< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "p" > ((< / span > < span class = "n" > cons< / span > < span class = "p" > ,< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 2< / span > < span class = "p" > ]),< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > l< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > def< / span > < span class = "nf" > dip_t< / span > < span class = "p" > (< / span > < span class = "n" > F< / span > < span class = "p" > ):< / span >
< span class = "p" > (< / span > < span class = "n" > quote< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > a1< / span > < span class = "p" > ,< / span > < span class = "n" > sec< / span > < span class = "p" > ))< / span > < span class = "o" > =< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span >
< span class = "n" > G< / span > < span class = "o" > =< / span > < span class = "n" > F< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > sec< / span >
< span class = "n" > P< / span > < span class = "o" > =< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 3< / span > < span class = "p" > ],< / span > < span class = "p" > (< / span > < span class = "n" > a1< / span > < span class = "p" > ,< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 3< / span > < span class = "p" > ])< / span >
< span class = "n" > a< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > P< / span > < span class = "p" > ]< / span >
< span class = "k" > while< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > quote< / span > < span class = "p" > ,< / span > < span class = "nb" > tuple< / span > < span class = "p" > ):< / span >
< span class = "n" > term< / span > < span class = "p" > ,< / span > < span class = "n" > quote< / span > < span class = "o" > =< / span > < span class = "n" > quote< / span >
< span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > term< / span > < span class = "p" > )< / span >
< span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > G< / span > < span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > a< / span > < span class = "p" > [::< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "kn" > from< / span > < span class = "nn" > joy.utils.stack< / span > < span class = "k" > import< / span > < span class = "n" > iter_stack< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "n" > b< / span > < span class = "p" > ,< / span > < span class = "n" > c< / span > < span class = "o" > =< / span > < span class = "n" > dip_t< / span > < span class = "p" > (< / span > < span class = "n" > l< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > a< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > b< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > c< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > MC< / span > < span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "p" > ],< / span > < span class = "p" > [< / span > < span class = "n" > b< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > kjs< / span > < span class = "o" > =< / span > < span class = "n" > MC< / span > < span class = "p" > (< / span > < span class = "n" > MC< / span > < span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "p" > ],< / span > < span class = "p" > [< / span > < span class = "n" > b< / span > < span class = "p" > ]),< / span > < span class = "p" > [< / span > < span class = "n" > c< / span > < span class = "p" > ])< / span >
< span class = "n" > kjs< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "nb" > print< / span > < span class = "n" > doc_from_stack_effect< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > kjs< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > a0< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a0< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "n" > a1< / span > < span class = "p" > )< / span >
< span class = "n" > a0< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "n" > a1< / span > < span class = "p" > [< / span > < span class = "n" > cons< / span > < span class = "p" > ]< / span > < span class = "n" > dip< / span >
< span class = "o" > ----------------------------< / span >
< span class = "p" > [< / span > < span class = "n" > a0< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "n" > a1< / span >
< / pre > < / div >
< / div >
< div class = "section" id = "concat" >
< h3 > < code class = "docutils literal notranslate" > < span class = "pre" > concat< / span > < / code > < a class = "headerlink" href = "#concat" title = "Permalink to this headline" > ¶< / a > < / h3 >
< p > How to deal with < code class = "docutils literal notranslate" > < span class = "pre" > concat< / span > < / code > ?< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > concat< / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< p > We would like to represent this in Python somehow…< / p >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > concat< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]),< / span > < span class = "p" > ((< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]),)< / span >
< / pre > < / div >
< / div >
< p > But this is actually < code class = "docutils literal notranslate" > < span class = "pre" > cons< / span > < / code > with the first argument restricted to be a
stack:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [[< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< p > What we have implemented so far would actually only permit:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 2.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > concat< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]),< / span > < span class = "p" > (< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 2< / span > < span class = "p" > ],)< / span >
< / pre > < / div >
< / div >
< p > Which works but can lose information. Consider < code class = "docutils literal notranslate" > < span class = "pre" > cons< / span > < span class = "pre" > concat< / span > < / code > , this is
how much information we < em > could< / em > retain:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< p > As opposed to just:< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 2.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "represent-concat" >
< h3 > represent < code class = "docutils literal notranslate" > < span class = "pre" > concat< / span > < / code > < a class = "headerlink" href = "#represent-concat" title = "Permalink to this headline" > ¶< / a > < / h3 >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "p" > (< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< p > Meaning that < code class = "docutils literal notranslate" > < span class = "pre" > A*< / span > < / code > on the right-hand side should all the crap from
< code class = "docutils literal notranslate" > < span class = "pre" > .0.< / span > < / code > .< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "n" > c< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< p > or…< / p >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > ([< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > b< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< span class = "p" > ([< / span > < span class = "n" > a< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "mf" > 0.< / span > < span class = "p" > ]< / span > < span class = "p" > [< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ]< / span > < span class = "o" > --< / span > < span class = "p" > [< / span > < span class = "n" > a< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "mf" > 1.< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > b< / span > < span class = "p" > ,< / span > < span class = "n" > S0< / span > < span class = "p" > ))< / span > < span class = "o" > .< / span > < span class = "n" > S1< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > b< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "o" > *< / span > < span class = "p" > ,< / span > < span class = "n" > S1< / span > < span class = "p" > )))< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "k" > class< / span > < span class = "nc" > Astar< / span > < span class = "p" > (< / span > < span class = "nb" > object< / span > < span class = "p" > ):< / span >
< span class = "k" > def< / span > < span class = "nf" > __repr__< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ):< / span >
< span class = "k" > return< / span > < span class = "s1" > ' A*' < / span >
< span class = "k" > def< / span > < span class = "nf" > concat< / span > < span class = "p" > (< / span > < span class = "n" > s0< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span > < span class = "p" > ):< / span >
< span class = "n" > a< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< span class = "k" > while< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > s0< / span > < span class = "p" > ,< / span > < span class = "nb" > tuple< / span > < span class = "p" > ):< / span >
< span class = "n" > term< / span > < span class = "p" > ,< / span > < span class = "n" > s0< / span > < span class = "o" > =< / span > < span class = "n" > s0< / span >
< span class = "n" > a< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > term< / span > < span class = "p" > )< / span >
< span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > s0< / span > < span class = "p" > ,< / span > < span class = "n" > StackJoyType< / span > < span class = "p" > ),< / span > < span class = "nb" > repr< / span > < span class = "p" > (< / span > < span class = "n" > s0< / span > < span class = "p" > )< / span >
< span class = "n" > s1< / span > < span class = "o" > =< / span > < span class = "n" > Astar< / span > < span class = "p" > (),< / span > < span class = "n" > s1< / span >
< span class = "k" > for< / span > < span class = "n" > term< / span > < span class = "ow" > in< / span > < span class = "nb" > reversed< / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "p" > ):< / span >
< span class = "n" > s1< / span > < span class = "o" > =< / span > < span class = "n" > term< / span > < span class = "p" > ,< / span > < span class = "n" > s1< / span >
< span class = "k" > return< / span > < span class = "n" > s1< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "n" > b< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]),< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > [< / span > < span class = "mi" > 2< / span > < span class = "p" > ],< / span > < span class = "n" > S< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ])< / span >
< / pre > < / div >
< / div >
< div class = "code ipython2 highlight-default notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > concat< / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "p" > ,< / span > < span class = "n" > b< / span > < span class = "p" > )< / span >
< / pre > < / div >
< / div >
< / div >
< / div >
< / div >
@@ -2579,7 +2365,7 @@ how much information we <em>could</em> retain:</p>
< div class = "sphinxsidebarwrapper" >
< h3 > < a href = "../index.html" > Table Of Contents< / a > < / h3 >
< ul >
< li > < a class = "reference internal" href = "#" > Type Inference < / a > < ul >
< li > < a class = "reference internal" href = "#" > The Blissful Elegance of Typing Joy < / a > < ul >
< li > < a class = "reference internal" href = "#part-i-poial-s-rules" > Part I: Pöial’ s Rules< / a > < ul >
< li > < a class = "reference internal" href = "#first-rule" > First Rule< / a > < / li >
< li > < a class = "reference internal" href = "#second-rule" > Second Rule< / a > < / li >
@@ -2652,17 +2438,20 @@ how much information we <em>could</em> retain:</p>
< / li >
< / ul >
< / li >
< li > < a class = "reference internal" href = "#part-vii-typing-combinators" > Part VII: Typing Combinators< / a > < / li >
< li > < a class = "reference internal" href = "#conclusion" > Conclusion < / a > < / li >
< li > < a class = "reference internal" href = "#appendix-joy-in-the-logical-paradigm" > Appendix: Joy in the Logical Paradigm < / a > < / li >
< li > < a class = "reference internal" href = "#abstract-interpretation" > Abstract Interpretation < / a > < / li >
< li > < a class = "reference internal" href = "#junk" > Junk < / a > < ul >
< li > < a class = "reference internal" href = "#concat" > < code class = "docutils literal notranslate" > < span class = "pre" > concat < / span > < / code > < / a > < / li >
< li > < a class = "reference internal" href = "#represent-concat" > represent < code class = "docutils literal notranslate" > < span class = "pre" > concat< / span > < / code > < / a > < / li >
< li > < a class = "reference internal" href = "#part-vii-typing-combinators" > Part VII: Typing Combinators< / a > < ul >
< li > < a class = "reference internal" href = "#hybrid-inferencer-interpreter" > Hybrid Inferencer/Interpreter < / a > < ul >
< li > < a class = "reference internal" href = "#joy-types-for-functions" > Joy Types for Functions < / a > < / li >
< li > < a class = "reference internal" href = "#specialized-for-simple-functions-and-combinators" > Specialized for Simple Functions and Combinators < / a > < / li >
< li > < a class = "reference internal" href = "#infer" > < code class = "docutils literal notranslate" > < span class = "pre" > infer() < / span > < / code > < / a > < / li >
< li > < a class = "reference internal" href = "#work-in-progress" > Work in Progress < / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li > < a class = "reference internal" href = "#conclusion" > Conclusion< / a > < / li >
< li > < a class = "reference internal" href = "#appendix-joy-in-the-logical-paradigm" > Appendix: Joy in the Logical Paradigm< / a > < / li >
< / ul >
< / li >
< / ul >
< div class = "relations" >
< h3 > Related Topics< / h3 >