Esempio n. 1
0
 def rewrite_cps(self, cont):
     formrv = newvar('$FormRv_')
     newdef = Def(self.name, formrv)
     newdef.toplevel = self.toplevel
     formcont = Lambda([formrv], [Apply(cont, [newdef])])
     formcont.name = gensym('$FormCont_').sval
     return self.form.rewrite_cps(formcont)
Esempio n. 2
0
 def rewrite_cps(self, cont):
     formrv = newvar('$FormRv_')
     newdef = Def(self.name, formrv)
     newdef.toplevel = self.toplevel
     formcont = Lambda([formrv], [Apply(cont, [newdef])])
     formcont.name = gensym('$FormCont_').sval
     return self.form.rewrite_cps(formcont)
Esempio n. 3
0
 def rewrite_cps(self, cont):
     fst, snd, trd = self.fst, self.snd, self.trd
     if isinstance(cont, Var):
         if fst.is_cpsatom():
             return If(fst.to_cpsatom(), snd.rewrite_cps(cont),
                       trd.rewrite_cps(cont))
         else:
             fstval = newvar('$PredRv_')
             fstcont = Lambda(
                 [fstval],
                 [If(fstval, snd.rewrite_cps(cont), trd.rewrite_cps(cont))])
             fstcont.name = gensym('$PredCont_').sval
             return fst.rewrite_cps(fstcont)
     else:
         contval = newvar('$Cont_')
         contdef = Def(contval, cont)
         if fst.is_cpsatom():
             return Seq([
                 contdef,
                 If(fst.to_cpsatom(), snd.rewrite_cps(contval),
                    trd.rewrite_cps(contval))
             ])
         else:
             fstval = newvar('$PredRv_')
             fstcont = Lambda([fstval], [
                 If(fstval, snd.rewrite_cps(contval),
                    trd.rewrite_cps(contval))
             ])
             fstcont.name = gensym('$PredCont_').sval
             return Seq([contdef, fst.rewrite_cps(fstcont)])
Esempio n. 4
0
def build_def(w_form, w_args):
    if len(w_args) < 2:
        raise W_ValueError('define requires at least 2 args',
                           w_form, 'build_def()').wrap()
    w_first = w_args[0]
    if isinstance(w_first, W_Symbol): # is symbol, a normal define
        if len(w_args) != 2:
            raise W_ValueError('define variable requires 2 args',
                               w_form, 'build_def()').wrap()
        w_name = w_first
        form = w_args[1].to_ast()
    elif isinstance(w_first, W_Pair): # is pair, we are defining lambda
        name_formals_w, w_rest = w_first.to_list()
        w_name = name_formals_w[0]
        formals_w = list_to_pair(name_formals_w[1:], w_rest)
        w_lambda_form = [formals_w] + w_args[1:]
        form = build_lambda(w_form, w_lambda_form)
    else:
        raise W_TypeError('Pair or Symbol', w_first, 'build_def()').wrap()

    if not isinstance(w_name, W_Symbol):
        raise W_TypeError('Symbol', w_name, 'build_def()').wrap()
    if isinstance(form, Lambda):
        form.name = w_name.sval
    return Def(Var(w_name), form)
Esempio n. 5
0
 def to_cpsatom(self):
     newdef = Def(self.name, self.form.to_cpsatom())
     newdef.toplevel = self.toplevel
     return newdef
Esempio n. 6
0
 def to_cpsatom(self):
     newdef = Def(self.name, self.form.to_cpsatom())
     newdef.toplevel = self.toplevel
     return newdef