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)
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)])
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)
def to_cpsatom(self): newdef = Def(self.name, self.form.to_cpsatom()) newdef.toplevel = self.toplevel return newdef