def desugar_cons(sexpr): sexpr = sexpr.rest() return desugar( s.Cons( s.Atom("inr"), s.Cons(s.Cons(s.Atom("pair"), s.Cons(sexpr.first(), sexpr.rest())), s.Nil())))
def desugar_list(sexpr): sexpr = sexpr.rest() if isinstance(sexpr, s.Nil): return desugar_nil(sexpr) else: return desugar( s.Cons( s.Atom("cons"), s.Cons(sexpr.first(), s.Cons(s.Cons(s.Atom("list"), sexpr.rest()), s.Nil()))))
def desugar_let_star(sexpr): body = sexpr.rest().rest() bind1 = sexpr.rest().first() newbind = s.Cons(bind1.first(), s.Nil()) if bind1.length() == 1: return desugar(s.Cons(s.Atom("let"), s.Cons(bind1, body))) else: bind2 = bind1.rest() return desugar( s.Cons( s.Atom("let"), s.Cons( newbind, s.Cons(s.Cons(s.Atom("let*"), s.Cons(bind2, body)), s.Nil()))))
def desugar_arith(sexpr): if sexpr.length() == 1: if sexpr.first().repr() == "+" or sexpr.first.repr() == "-": return v.Number(0) else: return v.Number(1) elif sexpr.length() == 2: return desugar(sexpr.rest().first()) # Recursive case elif sexpr.length() > 2: return e.Application( desugar(sexpr.first()), desugar(sexpr.second()), desugar(s.Cons(sexpr.first(), sexpr.right.rest()))) else: salt()
def recursive_letify(sexpr): if sexpr.length() == 1: return sexpr.first() else: return s.Cons( s.Atom("let"), s.Cons( s.Cons( s.Cons(s.Atom(generate_garbage_ident()), s.Cons(sexpr.first(), s.Nil())), s.Nil()), s.Cons(recursive_letify(sexpr.rest()), s.Nil())))
def desugar_nil(sexpr): return desugar(s.Cons(s.Atom("inl"), s.Cons(s.Atom("unit"), s.Nil())))