def fun_decl(s): params = s[2] body = s[4] fn = utils.foldr(syntax.Lambda, params + [body]) return { "lhs": syntax.Ident(s[1].value), "rhs": fn, }
def std_env(checker: check.Checker) -> StdEnv: T = checker.fresh_var() U = checker.fresh_var() V = checker.fresh_var() W = checker.fresh_var() return env.Env(locals={ syntax.Ident("null"): typ.Fn(typ.List(T), typ.Bool), syntax.Ident("tail"): typ.Fn(typ.List(U), typ.List(U)), syntax.Ident("zero"): typ.Fn(typ.Int, typ.Bool), syntax.Ident("succ"): typ.Fn(typ.Int, typ.Int), syntax.Ident("pred"): typ.Fn(typ.Int, typ.Int), syntax.Ident("times"): typ.Fn(typ.Int, typ.Fn(typ.Int, typ.Int)), syntax.Ident("pair"): typ.Fn(V, typ.Fn(W, typ.Tuple(V, W))), })
def ident_expr(s): return syntax.Ident(s[0].value)
def fn_expr(s): param = syntax.Ident(s[1].value) return syntax.Lambda(param, s[3])
def params_multi(s): return s[0] + [syntax.Ident(s[1].value)]
def params_single(s): return [syntax.Ident(s[0].value)]
def val_decl(s): return { "lhs": syntax.Ident(s[1].value), "rhs": s[3], }