egison-4.1.0: hs-src/Language/Egison/IExpr.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{- |
Module : Language.Egison.IExpr
Licence : MIT
This module defines internal representation of Egison language.
-}
module Language.Egison.IExpr
( ITopExpr (..)
, IExpr (..)
, IPattern (..)
, ILoopRange (..)
, IBindingExpr
, IMatchClause
, IPatternDef
, IPrimitiveDataPattern
, Var (..)
, stringToVar
, Index (..)
, extractSupOrSubIndex
, extractIndex
, makeIApply
-- Re-export from AST
, ConstantExpr (..)
, PMMode (..)
, PrimitivePatPattern (..)
, PDPatternBase (..)
) where
import Data.Hashable (Hashable)
import GHC.Generics (Generic)
import Language.Egison.AST ( ConstantExpr (..)
, PMMode (..)
, PrimitivePatPattern (..)
, PDPatternBase (..)
)
data ITopExpr
= IDefine Var IExpr
| ITest IExpr
| IExecute IExpr
| ILoadFile String
| ILoad String
deriving Show
data IExpr
= IConstantExpr ConstantExpr
| IVarExpr String
| IIndexedExpr Bool IExpr [Index IExpr]
| ISubrefsExpr Bool IExpr IExpr
| ISuprefsExpr Bool IExpr IExpr
| IUserrefsExpr Bool IExpr IExpr
| IInductiveDataExpr String [IExpr]
| ITupleExpr [IExpr]
| ICollectionExpr [IExpr]
| IConsExpr IExpr IExpr
| IJoinExpr IExpr IExpr
| IHashExpr [(IExpr, IExpr)]
| IVectorExpr [IExpr]
| ILambdaExpr (Maybe String) [String] IExpr
| IMemoizedLambdaExpr [String] IExpr
| ICambdaExpr String IExpr
| IPatternFunctionExpr [String] IPattern
| IIfExpr IExpr IExpr IExpr
| ILetRecExpr [IBindingExpr] IExpr
| ILetExpr [IBindingExpr] IExpr
| IWithSymbolsExpr [String] IExpr
| IMatchExpr PMMode IExpr IExpr [IMatchClause]
| IMatchAllExpr PMMode IExpr IExpr [IMatchClause]
| IMatcherExpr [IPatternDef]
| IQuoteExpr IExpr
| IQuoteSymbolExpr IExpr
| IWedgeApplyExpr IExpr [IExpr]
| IDoExpr [IBindingExpr] IExpr
| ISeqExpr IExpr IExpr
| IApplyExpr IExpr [IExpr]
| ICApplyExpr IExpr IExpr
| IGenerateTensorExpr IExpr IExpr
| ITensorExpr IExpr IExpr
| ITensorContractExpr IExpr
| ITensorMapExpr IExpr IExpr
| ITensorMap2Expr IExpr IExpr IExpr
| ITransposeExpr IExpr IExpr
| IFlipIndicesExpr IExpr
| IFunctionExpr [String]
deriving Show
type IBindingExpr = (IPrimitiveDataPattern, IExpr)
type IMatchClause = (IPattern, IExpr)
type IPatternDef = (PrimitivePatPattern, IExpr, [(IPrimitiveDataPattern, IExpr)])
type IPrimitiveDataPattern = PDPatternBase Var
data IPattern
= IWildCard
| IPatVar String
| IValuePat IExpr
| IPredPat IExpr
| IIndexedPat IPattern [IExpr]
| ILetPat [IBindingExpr] IPattern
| INotPat IPattern
| IAndPat IPattern IPattern
| IOrPat IPattern IPattern
| IForallPat IPattern IPattern
| ITuplePat [IPattern]
| IInductivePat String [IPattern]
| ILoopPat String ILoopRange IPattern IPattern
| IContPat
| IPApplyPat IExpr [IPattern]
| IVarPat String
| IInductiveOrPApplyPat String [IPattern]
| ISeqNilPat
| ISeqConsPat IPattern IPattern
| ILaterPatVar
-- For symbolic computing
| IDApplyPat IPattern [IPattern]
deriving Show
data ILoopRange = ILoopRange IExpr IExpr IPattern
deriving Show
data Index a
= Sub a
| Sup a
| SupSub a
| User a
| DF Integer Integer
deriving (Show, Eq, Functor, Foldable, Generic, Traversable)
extractSupOrSubIndex :: Index a -> Maybe a
extractSupOrSubIndex (Sub x) = Just x
extractSupOrSubIndex (Sup x) = Just x
extractSupOrSubIndex (SupSub x) = Just x
extractSupOrSubIndex _ = Nothing
extractIndex :: Index a -> a
extractIndex (Sub x) = x
extractIndex (Sup x) = x
extractIndex (SupSub x) = x
extractIndex (User x) = x
extractIndex DF{} = undefined
data Var = Var String [Index ()]
deriving (Eq, Generic, Show)
instance Hashable (Index ())
instance Hashable Var
stringToVar :: String -> Var
stringToVar name = Var name []
makeIApply :: String -> [IExpr] -> IExpr
makeIApply func args = IApplyExpr (IVarExpr func) args
instance {-# OVERLAPPING #-} Show (Index String) where
show (Sup s) = "~" ++ s
show (Sub s) = "_" ++ s
show (SupSub s) = "~_" ++ s
show (User s) = "|" ++ s
show (DF _ _) = ""