Exemplo n.º 1
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()
Exemplo n.º 2
0
def desugar(sexpr):
    if isinstance(sexpr, s.Atom):
        return desugar_atom(sexpr)

    if isinstance(sexpr, s.Nil):
        return e.Application(v.Number(0))  # invalid

    if isinstance(sexpr, s.Atom):
        return desugar_atom(sexpr)

    action = sexpr.first().repr()
    if action in antirecipies:
        return antirecipies[action](sexpr)

    else:
        return desugar_generic_app(sexpr)
Exemplo n.º 3
0
def desugar_atom(sexpr):
    if not isinstance(sexpr, s.Atom):
        desugar(sexpr)

    if is_number(sexpr.repr()):
        return v.Number(float(sexpr.repr()))
    elif sexpr.repr() in v.Prims:
        return v.Primitive(sexpr.repr())
    # Sugarbools
    elif sexpr.repr() == "#t":
        return v.Bool(1)
    elif sexpr.repr() == "#f":
        return v.Bool(0)
    elif sexpr.repr() == "unit":
        return v.Unit()
    # parser doesn't support spaces and I don't want to rearchitect it so this will do:
    elif sexpr.repr() == "#S":
        return v.String("\" \"")
    elif sexpr.repr()[0] == "\"" and sexpr.repr()[-1] == "\"":
        return v.String(sexpr.repr())
    # Must be an id then
    else:
        return v.ID(sexpr.repr())
Exemplo n.º 4
0
 def __call__(self):
     return v.Number(self.left.value / self.right.value)