module PosCode(module Prim, module PosCode, Pos) where import Util.Extra(noPos) import Prim import ForeignCode (ImpExp) import Syntax (CallConv) import SyntaxPos import Id type PosCode = [PosBinding] type PosBinding = (Id, PosLambda) data LambdaFlags = LamFLNone | LamFLIntro | LamFLLambda deriving Eq instance Show LambdaFlags where show LamFLNone = "" show LamFLIntro = "INT" show LamFLLambda = "LAMBDA" data PosLambda = PosLambda Pos LambdaFlags [(Pos,Id)] [(Pos,Id)] PosExp | PosPrimitive Pos Id | PosForeign Pos Id Int String CallConv ImpExp posExpApp :: Pos -> [PosExp] -> PosExp posExpApp pos [a] = a posExpApp pos as = PosExpApp pos as posExpLet :: Pos -> [PosBinding] -> PosExp -> PosExp posExpLet pos [] exp = exp posExpLet pos bindings exp = PosExpLet False pos bindings exp data PosExp = PosExpDict PosExp -- ^ Hack to mark dictionaries | PosExpLet Bool Pos [PosBinding] PosExp -- ^ True for recursive lets, false otherwise | PosExpCase Pos PosExp [PosAlt] | PosExpApp Pos [PosExp] | PosExpThunk Pos Bool [PosExp] -- ^ True if this is really \'apply\' | PosExpFatBar Bool PosExp PosExp -- ^ True if fail can escape fatbar | PosExpFail | PosExpIf Pos Bool PosExp PosExp PosExp -- ^ True if this is really a guard | PosVar Pos Id | PosCon Pos Id | PosInt Pos Int | PosChar Pos Int | PosFloat Pos Float | PosDouble Pos Double | PosInteger Pos Integer | PosString Pos String | PosPrim Pos Prim Id -- | Only temporary !! | PosExpLambda Pos Bool [(Pos,Id)] [(Pos,Id)] PosExp -- In reality this data structure should have -- PosAltChar and PosAltInteger -- FIXME required data PosAlt = PosAltCon Pos Id [(Pos,Id)] PosExp -- ^ Constructor numbers, new variables, expression | PosAltInt Pos Int Bool PosExp -- ^ Is the Int an Integer{True} or a Char{False} isPosAtom :: PosExp -> Bool isPosAtom (PosVar _ _) = True isPosAtom (PosCon _ _) = True isPosAtom (PosInt _ _) = True isPosAtom (PosChar _ _) = True isPosAtom (PosFloat _ _) = True isPosAtom (PosDouble _ _) = True isPosAtom (PosInteger _ _) = True isPosAtom (PosString _ _) = True isPosAtom (PosPrim _ _ _) = True isPosAtom (PosExpThunk _ _ [atom]) = isPosAtom atom -- thunks representing zero arity functions and constructors are atoms isPosAtom _ = False instance HasPos PosExp where getPos (PosExpDict exp) = getPos exp getPos (PosExpLet _ pos _ _) = pos getPos (PosExpCase pos _ _) = pos getPos (PosExpApp pos _) = pos getPos (PosExpThunk pos _ _) = pos getPos (PosExpFatBar _ e _) = getPos e getPos (PosExpFail) = noPos getPos (PosExpIf pos _ _ _ _) = pos getPos (PosVar pos _) = pos getPos (PosCon pos _) = pos getPos (PosInt pos _) = pos getPos (PosChar pos _) = pos getPos (PosFloat pos _) = pos getPos (PosDouble pos _) = pos getPos (PosInteger pos _) = pos getPos (PosString pos _) = pos getPos (PosPrim pos _ _) = pos getPos (PosExpLambda pos _ _ _ _) = pos class PlayPosExp a where mapPosExp :: (PosExp -> PosExp) -> a -> a instance PlayPosExp a => PlayPosExp [a] where mapPosExp f xs = map (mapPosExp f) xs -- since its not a Haskell 98 instance mapPosExp_Binding :: PlayPosExp b => (PosExp -> PosExp) -> (a, b) -> (a, b) mapPosExp_Binding f (a, b) = (a, mapPosExp f b) instance PlayPosExp PosLambda where mapPosExp f (PosLambda p i a b x) = PosLambda p i a b (mapPosExp f x) mapPosExp f x = x instance PlayPosExp PosExp where mapPosExp f y = f $ case y of (PosExpDict x) -> PosExpDict (g x) (PosExpLet a b c d) -> PosExpLet a b (map (mapPosExp_Binding f) c) (g d) (PosExpCase a b c) -> PosExpCase a (g b) (g c) (PosExpApp a b) -> PosExpApp a (g b) (PosExpThunk a b c) -> PosExpThunk a b (g c) (PosExpFatBar a b c) -> PosExpFatBar a (g b) (g c) (PosExpIf a b c d e) -> PosExpIf a b (g c) (g d) (g e) (PosExpLambda a b c d e) -> PosExpLambda a b c d (g e) x -> x where g x = mapPosExp f x instance PlayPosExp PosAlt where mapPosExp f (PosAltCon a b c d) = PosAltCon a b c (mapPosExp f d) mapPosExp f (PosAltInt a b c d) = PosAltInt a b c (mapPosExp f d)