module IL.Type
(
Module (..), Decl (..), ConstrDecl (..), CallConv (..), Type (..)
, Literal (..), ConstrTerm (..), Expression (..), Eval (..), Alt (..)
, Binding (..)
) where
import Data.Generics (Data, Typeable)
import Curry.Base.Ident
import Curry.Base.Position (SrcRef(..), SrcRefOf (..))
import Base.Expr
data Module = Module ModuleIdent [ModuleIdent] [Decl]
deriving (Eq, Show, Data, Typeable)
data Decl
= DataDecl QualIdent Int [ConstrDecl [Type]]
| NewtypeDecl QualIdent Int (ConstrDecl Type)
| FunctionDecl QualIdent [Ident] Type Expression
| ExternalDecl QualIdent CallConv String Type
deriving (Eq, Show, Data, Typeable)
data ConstrDecl a = ConstrDecl QualIdent a
deriving (Eq, Show, Data, Typeable)
data CallConv
= Primitive
| CCall
deriving (Eq, Show, Data, Typeable)
data Type
= TypeConstructor QualIdent [Type]
| TypeVariable Int
| TypeArrow Type Type
deriving (Eq, Show, Data, Typeable)
data Literal
= Char SrcRef Char
| Int SrcRef Integer
| Float SrcRef Double
deriving (Eq, Show, Data, Typeable)
data ConstrTerm
= LiteralPattern Literal
| ConstructorPattern QualIdent [Ident]
| VariablePattern Ident
deriving (Eq, Show, Data, Typeable)
data Expression
= Literal Literal
| Variable Ident
| Function QualIdent Int
| Constructor QualIdent Int
| Apply Expression Expression
| Case SrcRef Eval Expression [Alt]
| Or Expression Expression
| Exist Ident Expression
| Let Binding Expression
| Letrec [Binding] Expression
| Typed Expression Type
deriving (Eq, Show, Data, Typeable)
data Eval
= Rigid
| Flex
deriving (Eq, Show, Data, Typeable)
data Alt = Alt ConstrTerm Expression
deriving (Eq, Show, Data, Typeable)
data Binding = Binding Ident Expression
deriving (Eq, Show, Data, Typeable)
instance Expr Expression where
fv (Variable v) = [v]
fv (Apply e1 e2) = fv e1 ++ fv e2
fv (Case _ _ e alts) = fv e ++ fv alts
fv (Or e1 e2) = fv e1 ++ fv e2
fv (Exist v e) = filter (/= v) (fv e)
fv (Let (Binding v e1) e2) = fv e1 ++ filter (/= v) (fv e2)
fv (Letrec bds e) = filter (`notElem` vs) (fv es ++ fv e)
where (vs, es) = unzip [(v, e') | Binding v e' <- bds]
fv _ = []
instance Expr Alt where
fv (Alt (ConstructorPattern _ vs) e) = filter (`notElem` vs) (fv e)
fv (Alt (VariablePattern v) e) = filter (v /=) (fv e)
fv (Alt _ e) = fv e
instance SrcRefOf ConstrTerm where
srcRefOf (LiteralPattern l) = srcRefOf l
srcRefOf (ConstructorPattern i _) = srcRefOf i
srcRefOf (VariablePattern i) = srcRefOf i
instance SrcRefOf Literal where
srcRefOf (Char s _) = s
srcRefOf (Int s _) = s
srcRefOf (Float s _) = s