[pypy-dev] Help (again)

Amaury Forgeot d'Arc amauryfa at gmail.com
Mon Jun 25 17:10:20 CEST 2012


2012/6/25 Léonard de Haro <leonard.de.haro at ens.fr>

> Hi everyone!
>
> First of all, thaks for your answers last time. Second of all, I need your
> help again.
>
> I'm coding an imperative version of my interpret and to do so, I coded
> continuations. I used a similat technique to the one used in the Prolog
> interpret you advised me to take a look at last time.
>
> I define a serie of class all inheriting from a simulated-abstract Contk
> class. Every class has a method apply which contains instruction for what's
> next to do. All these methods take the same arguments and (except in one
> case) return the same kind of tuple.
>
> The interpret function uses 4 variables that are updated: expr, env, cont,
> val. Thus, the result of .apply(_,_,_,_) is the tuple for update.
>
> class Contk(object):
>    def __init__(self,*arg):
>        raise NotImplementedError("For abstract class")
>
>    def apply(self,expr,env,val):
>        raise NotImplementedError("For abstract class")
>
>
> class Endk(Contk):
>    def __init__(self,val):
>        self.val = val
>
>    def apply(self,expr, env, val):
>        return self.val
>
> class Idk(Contk):
>    def __init__(self):
>        pass
>
>    def apply(self, expr, env, val):
>        return expr, env, Endk(val), val
>

Even if RPython needs no explicit declaration, its constraints are similar
to C++ or Java:
overridden methods must have a compatible signature, arguments and return
value.
Here, Idk.apply returns a 4-tuple, whereas Endk returned a single value.


> There is a class for each continuation needed by the interpret.
>
> The trouble is, I get this error:
>
> [translation:ERROR]  AnnotatorError': annotation of 'union' degenerated to
> SomeObject()
> [translation:ERROR] Simple call of incompatible family:
> [translation:ERROR]       (KeyError getting at the binding!)
> [translation:ERROR]
> [translation:ERROR] In <FunctionGraph of (RPinterpretImperative:27)Idk.**apply
> at 0x1b31be8>:
> [translation:ERROR] Happened at file RPinterpretImperative.py line 28
> [translation:ERROR]
> [translation:ERROR] ==>         return expr, env, Endk(val), val
> [translation:ERROR]
> [translation:ERROR] Previous annotation:
> [translation:ERROR]   (none)
> [translation:ERROR]     .. v0 = simple_call((classobj Endk), val_0)
> [translation:ERROR]     .. '(RPinterpretImperative:27)**Idk.apply'
> [translation:ERROR] Processing block:
> [translation:ERROR]  block at 12 is a <class 'pypy.objspace.flow.**
> flowcontext.SpamBlock'>
> [translation:ERROR]  in (RPinterpretImperative:27)Idk.**apply
> [translation:ERROR]  containing the following operations:
> [translation:ERROR]        v0 = simple_call((classobj Endk), val_0)
> [translation:ERROR]        v1 = newtuple(expr_0, env_0, v0, val_0)
> [translation:ERROR]  --end--
>
>
> So at first I thought it was due to tuple that would not accept newly
> created objects, but after a few tests, it appears that not. Then I tought
> the annotator couldn't realize by himself that returning an Endk object is
> the same as returning a Contk, so I annotated the whole file with assertion
> to force him to realize that my variable cont should be a Contk not any
> other kind of subclass, but it didn't work either.
>
> So I don't know what to do now.
>
> I've even tried to implement apply outside of the classes, or to make a
> function for each parameters returned, but nothing worked.
>
> You can find the source here : https://github.com/zebign1/**
> RPython-internship/tree/**master/Interpreters/ifF1WAE<https://github.com/zebign1/RPython-internship/tree/master/Interpreters/ifF1WAE>
> (treeClass.py and parser.py as tools, the bugged file is
> RPinterpretImperative.py)
>
> Thanks again.
>
> Leonard
> ______________________________**_________________
> pypy-dev mailing list
> pypy-dev at python.org
> http://mail.python.org/**mailman/listinfo/pypy-dev<http://mail.python.org/mailman/listinfo/pypy-dev>
>



-- 
Amaury Forgeot d'Arc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20120625/6e6cf3b9/attachment.html>


More information about the pypy-dev mailing list