module Minilang.Lambda where import Minilang.Lambda.DeBruijn (eval, fromDeBruijn, toDeBruijn) import Minilang.Lambda.Eval (Env, Term) import Minilang.Lambda.Infer (Context, TypeError, infer) import Minilang.Lambda.Parser (AST, desugar) import Minilang.Lambda.Unify (Type (..)) import Minilang.REPL.Types (Language (..)) -- | Top-level evaluator -- Load an AST into given `Env` and `Context`, returning an extended -- `Env` and `Context` with declarations bound loadProgram :: Language -> AST -> Env -> Context -> Either TypeError (Term, Type, Env, Context) -- loadProgram (Let d r) ρ γ = do -- (ρ', γ') <- checkD 0 d ρ γ -- loadProgram r ρ' γ' loadProgram language expr env context = let term = desugar expr v = fromDeBruijn $ eval (toDeBruijn term) in case language of Typed -> case infer term of Left typeError -> Left typeError Right typ -> Right (v, typ, env, context) Untyped -> Right (v, TyVar "", env, context)