[pypy-dev] Help (again)

Léonard de Haro leonard.de.haro at ens.fr
Mon Jun 25 16:40:02 CEST 2012


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

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
(treeClass.py and parser.py as tools, the bugged file is 
RPinterpretImperative.py)

Thanks again.

Leonard


More information about the pypy-dev mailing list