packages feed

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)