g2-0.2.0.0: tests_quasiquote/Lambda/Interpreter.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Lambda.Interpreter where
import Data.Data
import Data.List
import G2.QuasiQuotes.QuasiQuotes
import G2.QuasiQuotes.G2Rep
type Id = String
data Prim = I Int | B Bool | Fun Id
deriving (Show, Eq, Data)
$(derivingG2Rep ''Prim)
data Expr
= Var Id
| Lam Id Expr
| App Expr Expr
| Const Prim
deriving (Show, Eq, Data)
$(derivingG2Rep ''Expr)
type Env = [(Id, Expr)]
eval :: Env -> Expr -> Expr
eval env (Var id) =
case lookup id env of
Just expr -> eval env expr
Nothing -> Const (Fun id)
eval env (App (Lam i body) arg) =
eval ((i, arg) : env) body
eval env expr = expr