Ejemplo n.º 1
0
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())))
Ejemplo n.º 2
0
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()))))
Ejemplo n.º 3
0
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()))))
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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())))
Ejemplo n.º 6
0
def desugar_nil(sexpr):
    return desugar(s.Cons(s.Atom("inl"), s.Cons(s.Atom("unit"), s.Nil())))