summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda.hs
blob: d2df56fff1541597b32034de85b616487b6850ed (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
26
27
28
29
30
31
32
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)