summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda.hs
blob: 9d0f3cfab39f9414f65c24a8e68aa7975110576a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)

-- | Top-level evaluator
-- Load an AST into given `Env` and `Context`, returning an extended
-- `Env` and `Context` with declarations bound
loadProgram ::
  AST ->
  Env ->
  Context ->
  Either TypeError (Term, Type, Env, Context)
-- loadProgram (Let d r) ρ γ = do
--   (ρ', γ') <- checkD 0 d ρ γ
--   loadProgram r ρ' γ'
loadProgram expr env context =
  let term = desugar expr
   in case infer term of
        Left typeError -> Left typeError
        Right typ ->
          Right (fromDeBruijn $ eval (toDeBruijn term), typ, env, context)