g2-0.2.0.0: tests_quasiquote/Simple/Simple1.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Simple.Simple1 ( Expr (..)
, eval
, num1) where
import Data.Data
import G2.QuasiQuotes.G2Rep
data Expr = Var Int
| Lam Expr
| App Expr Expr
deriving (Show, Read, Eq, Data)
$(derivingG2Rep ''Expr)
type Stack = [Expr]
eval :: Stack -> Expr -> Expr
eval (e:stck) (Lam e') = eval stck (rep e e')
eval stck (App e1 e2) = eval (e2:stck) e1
eval stck e@(Var _) = foldl1 App (e:stck)
rep :: Expr -> Expr -> Expr
rep e (Var _) = e
rep e (Lam e') = Lam (rep e e')
rep e (App e1 e2) = App (rep e e1) (rep e e2)
num1 :: Expr
num1 = Lam (Var 1)