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 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)
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())
def __call__(self): return v.Number(self.left.value / self.right.value)