{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} module Types where import Data.Functor.Foldable.TH import GHC.Generics data AExp = LitTrue | LitFalse | Ident String | Number Integer | LitStr String | AAdd AExp AExp | ASub AExp AExp | AMul AExp AExp | ADiv AExp AExp | AGt AExp AExp | ALt AExp AExp | AEq AExp AExp | ABsl AExp AExp | ABsr AExp AExp | AAnd AExp AExp | AOr AExp AExp | AXor AExp AExp | Lam [String] CExp deriving (Show, Read, Generic) data GlobalAExp = GlobalLitTrue | GlobalLitFalse | GlobalIdent String | GlobalNumber Integer | GlobalLitStr String | GlobalAAdd GlobalAExp GlobalAExp | GlobalASub GlobalAExp GlobalAExp | GlobalAMul GlobalAExp GlobalAExp | GlobalADiv GlobalAExp GlobalAExp | GlobalAGt GlobalAExp GlobalAExp | GlobalALt GlobalAExp GlobalAExp | GlobalAEq GlobalAExp GlobalAExp | GlobalABsl GlobalAExp GlobalAExp | GlobalABsr GlobalAExp GlobalAExp | GlobalAAnd GlobalAExp GlobalAExp | GlobalAOr GlobalAExp GlobalAExp | GlobalAXor GlobalAExp GlobalAExp | Funcref String deriving (Show, Read, Generic) data Funcall = Call String [AExp] | Atom AExp deriving (Show, Read, Generic) data CExp = Let String Funcall CExp | If AExp CExp CExp | FC Funcall deriving (Show, Read, Generic) makeBaseFunctor ''CExp makeBaseFunctor ''AExp makeBaseFunctor ''GlobalAExp makeBaseFunctor ''Funcall