egison 3.9.4 → 3.10.0
raw patch · 32 files changed
+1305/−932 lines, 32 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.Arg
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.EgisonExpr
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.EgisonPattern
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.EgisonTopExpr
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.InnerExpr
- Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.Types.Var
- Language.Egison.Types: AlgebraicDataMatcherExpr :: [(String, [EgisonExpr])] -> EgisonExpr
- Language.Egison.Types: AndPat :: [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: ApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: ArrayBoundsExpr :: EgisonExpr -> EgisonExpr
- Language.Egison.Types: ArrayExpr :: [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: ArrayRefExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: BFSMode :: PMMode
- Language.Egison.Types: BinaryOpExpr :: EgisonBinOp -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: BoolExpr :: Bool -> EgisonExpr
- Language.Egison.Types: CApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: CambdaExpr :: String -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: CharExpr :: Char -> EgisonExpr
- Language.Egison.Types: CollectionExpr :: [InnerExpr] -> EgisonExpr
- Language.Egison.Types: ContPat :: EgisonPattern
- Language.Egison.Types: DApplyPat :: EgisonPattern -> [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: DFSMode :: PMMode
- Language.Egison.Types: DFscript :: Integer -> Integer -> Index a
- Language.Egison.Types: Define :: Var -> EgisonExpr -> EgisonTopExpr
- Language.Egison.Types: DivPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
- Language.Egison.Types: DoExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: DotSubscript :: a -> Index a
- Language.Egison.Types: DotSupscript :: a -> Index a
- Language.Egison.Types: EgisonBinOp :: String -> String -> Int -> BinOpAssoc -> Bool -> EgisonBinOp
- Language.Egison.Types: EgisonOpts :: Maybe (String, [String]) -> Bool -> Maybe String -> Maybe String -> [(String, String)] -> [String] -> [String] -> Maybe String -> Maybe String -> Maybe String -> Bool -> Bool -> Bool -> Bool -> String -> Maybe String -> Bool -> EgisonOpts
- Language.Egison.Types: ElementExpr :: EgisonExpr -> InnerExpr
- Language.Egison.Types: Execute :: EgisonExpr -> EgisonTopExpr
- Language.Egison.Types: FlipIndicesExpr :: EgisonExpr -> EgisonExpr
- Language.Egison.Types: FloatExpr :: Double -> EgisonExpr
- Language.Egison.Types: FreshVarExpr :: EgisonExpr
- Language.Egison.Types: FunctionExpr :: [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: GenerateArrayExpr :: EgisonExpr -> (EgisonExpr, EgisonExpr) -> EgisonExpr
- Language.Egison.Types: GenerateTensorExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: HashExpr :: [(EgisonExpr, EgisonExpr)] -> EgisonExpr
- Language.Egison.Types: IfExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: IndexedExpr :: Bool -> EgisonExpr -> [Index EgisonExpr] -> EgisonExpr
- Language.Egison.Types: IndexedPat :: EgisonPattern -> [EgisonExpr] -> EgisonPattern
- Language.Egison.Types: InductiveDataExpr :: String -> [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: InductivePat :: String -> [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: IntegerExpr :: Integer -> EgisonExpr
- Language.Egison.Types: InvertedScalarArg :: String -> Arg
- Language.Egison.Types: IoExpr :: EgisonExpr -> EgisonExpr
- Language.Egison.Types: LambdaArgExpr :: [Char] -> EgisonExpr
- Language.Egison.Types: LambdaExpr :: [Arg] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: LaterPat :: EgisonPattern -> EgisonPattern
- Language.Egison.Types: LaterPatVar :: EgisonPattern
- Language.Egison.Types: LeftAssoc :: BinOpAssoc
- Language.Egison.Types: LetExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: LetPat :: [BindingExpr] -> EgisonPattern -> EgisonPattern
- Language.Egison.Types: LetRecExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: LetStarExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: Load :: String -> EgisonTopExpr
- Language.Egison.Types: LoadFile :: String -> EgisonTopExpr
- Language.Egison.Types: LoopPat :: Var -> LoopRange -> EgisonPattern -> EgisonPattern -> EgisonPattern
- Language.Egison.Types: LoopRange :: EgisonExpr -> EgisonExpr -> EgisonPattern -> LoopRange
- Language.Egison.Types: MacroExpr :: [String] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: MatchAllDFSExpr :: EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatchAllExpr :: EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatchAllLambdaExpr :: EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatchDFSExpr :: EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatchExpr :: EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatchLambdaExpr :: EgisonExpr -> [MatchClause] -> EgisonExpr
- Language.Egison.Types: MatcherExpr :: [PatternDef] -> EgisonExpr
- Language.Egison.Types: MemoizeExpr :: [(EgisonExpr, EgisonExpr, EgisonExpr)] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: MemoizedLambdaExpr :: [String] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: MultPat :: [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: MultiSubscript :: a -> a -> Index a
- Language.Egison.Types: MultiSuperscript :: a -> a -> Index a
- Language.Egison.Types: NonAssoc :: BinOpAssoc
- Language.Egison.Types: NotPat :: EgisonPattern -> EgisonPattern
- Language.Egison.Types: OrPat :: [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: PApplyPat :: EgisonExpr -> [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: PDConsPat :: PrimitiveDataPattern -> PrimitiveDataPattern -> PrimitiveDataPattern
- Language.Egison.Types: PDConstantPat :: EgisonExpr -> PrimitiveDataPattern
- Language.Egison.Types: PDEmptyPat :: PrimitiveDataPattern
- Language.Egison.Types: PDInductivePat :: String -> [PrimitiveDataPattern] -> PrimitiveDataPattern
- Language.Egison.Types: PDPatVar :: String -> PrimitiveDataPattern
- Language.Egison.Types: PDSnocPat :: PrimitiveDataPattern -> PrimitiveDataPattern -> PrimitiveDataPattern
- Language.Egison.Types: PDTuplePat :: [PrimitiveDataPattern] -> PrimitiveDataPattern
- Language.Egison.Types: PDWildCard :: PrimitiveDataPattern
- Language.Egison.Types: PPInductivePat :: String -> [PrimitivePatPattern] -> PrimitivePatPattern
- Language.Egison.Types: PPPatVar :: PrimitivePatPattern
- Language.Egison.Types: PPTuplePat :: [PrimitivePatPattern] -> PrimitivePatPattern
- Language.Egison.Types: PPValuePat :: String -> PrimitivePatPattern
- Language.Egison.Types: PPWildCard :: PrimitivePatPattern
- Language.Egison.Types: ParserUnexpectedEOF :: EgisonError
- Language.Egison.Types: PartialExpr :: Integer -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: PartialVarExpr :: Integer -> EgisonExpr
- Language.Egison.Types: PatVar :: Var -> EgisonPattern
- Language.Egison.Types: PatternFunctionExpr :: [String] -> EgisonPattern -> EgisonExpr
- Language.Egison.Types: PlusPat :: [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: PowerExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: PowerPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
- Language.Egison.Types: PredPat :: EgisonExpr -> EgisonPattern
- Language.Egison.Types: ProcedureExpr :: [String] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: QuoteExpr :: EgisonExpr -> EgisonExpr
- Language.Egison.Types: QuoteSymbolExpr :: EgisonExpr -> EgisonExpr
- Language.Egison.Types: Redefine :: Var -> EgisonExpr -> EgisonTopExpr
- Language.Egison.Types: RightAssoc :: BinOpAssoc
- Language.Egison.Types: ScalarArg :: String -> Arg
- Language.Egison.Types: SeqConsPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
- Language.Egison.Types: SeqExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: SeqNilPat :: EgisonPattern
- Language.Egison.Types: SomethingExpr :: EgisonExpr
- Language.Egison.Types: StringExpr :: Text -> EgisonExpr
- Language.Egison.Types: SubCollectionExpr :: EgisonExpr -> InnerExpr
- Language.Egison.Types: SubrefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: Subscript :: a -> Index a
- Language.Egison.Types: SupSubscript :: a -> Index a
- Language.Egison.Types: Superscript :: a -> Index a
- Language.Egison.Types: SuprefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: SymbolicTensorExpr :: [EgisonExpr] -> EgisonExpr -> String -> EgisonExpr
- Language.Egison.Types: TensorArg :: String -> Arg
- Language.Egison.Types: TensorContractExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: TensorExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: TensorMap2Expr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: TensorMapExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: Test :: EgisonExpr -> EgisonTopExpr
- Language.Egison.Types: TransposeExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: TupleExpr :: [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: TuplePat :: [EgisonPattern] -> EgisonPattern
- Language.Egison.Types: UnaryOpExpr :: String -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: UndefinedExpr :: EgisonExpr
- Language.Egison.Types: UserrefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: Userscript :: a -> Index a
- Language.Egison.Types: ValuePat :: EgisonExpr -> EgisonPattern
- Language.Egison.Types: Var :: [String] -> [Index ()] -> Var
- Language.Egison.Types: VarExpr :: Var -> EgisonExpr
- Language.Egison.Types: VarPat :: String -> EgisonPattern
- Language.Egison.Types: VectorExpr :: [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: WedgeApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: WildCard :: EgisonPattern
- Language.Egison.Types: WithSymbolsExpr :: [String] -> EgisonExpr -> EgisonExpr
- Language.Egison.Types: [assoc] :: EgisonBinOp -> BinOpAssoc
- Language.Egison.Types: [func] :: EgisonBinOp -> String
- Language.Egison.Types: [isWedge] :: EgisonBinOp -> Bool
- Language.Egison.Types: [optEvalString] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optExecFile] :: EgisonOpts -> Maybe (String, [String])
- Language.Egison.Types: [optExecuteString] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optFieldInfo] :: EgisonOpts -> [(String, String)]
- Language.Egison.Types: [optFilterTsvInput] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optLoadFiles] :: EgisonOpts -> [String]
- Language.Egison.Types: [optLoadLibs] :: EgisonOpts -> [String]
- Language.Egison.Types: [optMapTsvInput] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optMathExpr] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optNoIO] :: EgisonOpts -> Bool
- Language.Egison.Types: [optPrompt] :: EgisonOpts -> String
- Language.Egison.Types: [optSExpr] :: EgisonOpts -> Bool
- Language.Egison.Types: [optShowBanner] :: EgisonOpts -> Bool
- Language.Egison.Types: [optShowVersion] :: EgisonOpts -> Bool
- Language.Egison.Types: [optSubstituteString] :: EgisonOpts -> Maybe String
- Language.Egison.Types: [optTestOnly] :: EgisonOpts -> Bool
- Language.Egison.Types: [optTsvOutput] :: EgisonOpts -> Bool
- Language.Egison.Types: [priority] :: EgisonBinOp -> Int
- Language.Egison.Types: [repr] :: EgisonBinOp -> String
- Language.Egison.Types: data Arg
- Language.Egison.Types: data BinOpAssoc
- Language.Egison.Types: data EgisonBinOp
- Language.Egison.Types: data EgisonExpr
- Language.Egison.Types: data EgisonOpts
- Language.Egison.Types: data EgisonPattern
- Language.Egison.Types: data EgisonTopExpr
- Language.Egison.Types: data Index a
- Language.Egison.Types: data InnerExpr
- Language.Egison.Types: data LoopRange
- Language.Egison.Types: data PMMode
- Language.Egison.Types: data PrimitiveDataPattern
- Language.Egison.Types: data PrimitivePatPattern
- Language.Egison.Types: data Var
- Language.Egison.Types: defaultOption :: EgisonOpts
- Language.Egison.Types: instance Data.Hashable.Class.Hashable (Language.Egison.Types.Index ())
- Language.Egison.Types: instance Data.Hashable.Class.Hashable Language.Egison.Types.Var
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.Arg
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.BinOpAssoc
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.EgisonBinOp
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.EgisonExpr
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.EgisonPattern
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.EgisonTopExpr
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.InnerExpr
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.LoopRange
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.PrimitiveDataPattern
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.PrimitivePatPattern
- Language.Egison.Types: instance GHC.Classes.Eq Language.Egison.Types.Var
- Language.Egison.Types: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Egison.Types.Index a)
- Language.Egison.Types: instance GHC.Classes.Ord Language.Egison.Types.BinOpAssoc
- Language.Egison.Types: instance GHC.Classes.Ord Language.Egison.Types.EgisonBinOp
- Language.Egison.Types: instance GHC.Generics.Generic (Language.Egison.Types.Index a)
- Language.Egison.Types: instance GHC.Generics.Generic Language.Egison.Types.Var
- Language.Egison.Types: instance GHC.Show.Show (Language.Egison.Types.Index ())
- Language.Egison.Types: instance GHC.Show.Show (Language.Egison.Types.Index GHC.Base.String)
- Language.Egison.Types: instance GHC.Show.Show (Language.Egison.Types.Index Language.Egison.Types.EgisonExpr)
- Language.Egison.Types: instance GHC.Show.Show (Language.Egison.Types.Index Language.Egison.Types.EgisonValue)
- Language.Egison.Types: instance GHC.Show.Show (Language.Egison.Types.Index Language.Egison.Types.ScalarData)
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.Arg
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.BinOpAssoc
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.EgisonBinOp
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.EgisonExpr
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.EgisonPattern
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.EgisonTopExpr
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.InnerExpr
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.LoopRange
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.PMMode
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.PrimitiveDataPattern
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.PrimitivePatPattern
- Language.Egison.Types: instance GHC.Show.Show Language.Egison.Types.Var
- Language.Egison.Types: readUTF8File :: FilePath -> IO String
- Language.Egison.Types: reservedBinops :: [EgisonBinOp]
- Language.Egison.Types: showTSV :: EgisonValue -> String
- Language.Egison.Types: stringToVar :: String -> Var
- Language.Egison.Types: stringToVarExpr :: String -> EgisonExpr
- Language.Egison.Types: type BindingExpr = ([Var], EgisonExpr)
- Language.Egison.Types: type Id = String
- Language.Egison.Types: type MatchClause = (EgisonPattern, EgisonExpr)
- Language.Egison.Types: type PatternDef = (PrimitivePatPattern, EgisonExpr, [(PrimitiveDataPattern, EgisonExpr)])
+ Language.Egison.AST: AlgebraicDataMatcherExpr :: [(String, [EgisonExpr])] -> EgisonExpr
+ Language.Egison.AST: AndPat :: [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: ApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: ArrayBoundsExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.AST: ArrayExpr :: [EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: ArrayRefExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: BFSMode :: PMMode
+ Language.Egison.AST: BinaryOpExpr :: EgisonBinOp -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: BoolExpr :: Bool -> EgisonExpr
+ Language.Egison.AST: CApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: CambdaExpr :: String -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: CharExpr :: Char -> EgisonExpr
+ Language.Egison.AST: CollectionExpr :: [InnerExpr] -> EgisonExpr
+ Language.Egison.AST: ContPat :: EgisonPattern
+ Language.Egison.AST: DApplyPat :: EgisonPattern -> [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: DFSMode :: PMMode
+ Language.Egison.AST: DFscript :: Integer -> Integer -> Index a
+ Language.Egison.AST: Define :: Var -> EgisonExpr -> EgisonTopExpr
+ Language.Egison.AST: DivPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
+ Language.Egison.AST: DoExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: DotSubscript :: a -> Index a
+ Language.Egison.AST: DotSupscript :: a -> Index a
+ Language.Egison.AST: EgisonBinOp :: String -> String -> Int -> BinOpAssoc -> Bool -> EgisonBinOp
+ Language.Egison.AST: ElementExpr :: EgisonExpr -> InnerExpr
+ Language.Egison.AST: Execute :: EgisonExpr -> EgisonTopExpr
+ Language.Egison.AST: FlipIndicesExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.AST: FloatExpr :: Double -> EgisonExpr
+ Language.Egison.AST: FreshVarExpr :: EgisonExpr
+ Language.Egison.AST: FunctionExpr :: [EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: GenerateArrayExpr :: EgisonExpr -> (EgisonExpr, EgisonExpr) -> EgisonExpr
+ Language.Egison.AST: GenerateTensorExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: HashExpr :: [(EgisonExpr, EgisonExpr)] -> EgisonExpr
+ Language.Egison.AST: IfExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: IndexedExpr :: Bool -> EgisonExpr -> [Index EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: IndexedPat :: EgisonPattern -> [EgisonExpr] -> EgisonPattern
+ Language.Egison.AST: InductiveDataExpr :: String -> [EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: InductivePat :: String -> [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: IntegerExpr :: Integer -> EgisonExpr
+ Language.Egison.AST: InvertedScalarArg :: String -> Arg
+ Language.Egison.AST: IoExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.AST: LambdaArgExpr :: [Char] -> EgisonExpr
+ Language.Egison.AST: LambdaExpr :: [Arg] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: LaterPat :: EgisonPattern -> EgisonPattern
+ Language.Egison.AST: LaterPatVar :: EgisonPattern
+ Language.Egison.AST: LeftAssoc :: BinOpAssoc
+ Language.Egison.AST: LetExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: LetPat :: [BindingExpr] -> EgisonPattern -> EgisonPattern
+ Language.Egison.AST: LetRecExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: LetStarExpr :: [BindingExpr] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: Load :: String -> EgisonTopExpr
+ Language.Egison.AST: LoadFile :: String -> EgisonTopExpr
+ Language.Egison.AST: LoopPat :: Var -> LoopRange -> EgisonPattern -> EgisonPattern -> EgisonPattern
+ Language.Egison.AST: LoopRange :: EgisonExpr -> EgisonExpr -> EgisonPattern -> LoopRange
+ Language.Egison.AST: MacroExpr :: [String] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: MatchAllExpr :: PMMode -> EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
+ Language.Egison.AST: MatchAllLambdaExpr :: EgisonExpr -> [MatchClause] -> EgisonExpr
+ Language.Egison.AST: MatchExpr :: PMMode -> EgisonExpr -> EgisonExpr -> [MatchClause] -> EgisonExpr
+ Language.Egison.AST: MatchLambdaExpr :: EgisonExpr -> [MatchClause] -> EgisonExpr
+ Language.Egison.AST: MatcherExpr :: [PatternDef] -> EgisonExpr
+ Language.Egison.AST: MemoizeExpr :: [(EgisonExpr, EgisonExpr, EgisonExpr)] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: MemoizedLambdaExpr :: [String] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: MultPat :: [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: MultiSubscript :: a -> a -> Index a
+ Language.Egison.AST: MultiSuperscript :: a -> a -> Index a
+ Language.Egison.AST: NonAssoc :: BinOpAssoc
+ Language.Egison.AST: NotPat :: EgisonPattern -> EgisonPattern
+ Language.Egison.AST: OrPat :: [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: PApplyPat :: EgisonExpr -> [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: PDConsPat :: PrimitiveDataPattern -> PrimitiveDataPattern -> PrimitiveDataPattern
+ Language.Egison.AST: PDConstantPat :: EgisonExpr -> PrimitiveDataPattern
+ Language.Egison.AST: PDEmptyPat :: PrimitiveDataPattern
+ Language.Egison.AST: PDInductivePat :: String -> [PrimitiveDataPattern] -> PrimitiveDataPattern
+ Language.Egison.AST: PDPatVar :: String -> PrimitiveDataPattern
+ Language.Egison.AST: PDSnocPat :: PrimitiveDataPattern -> PrimitiveDataPattern -> PrimitiveDataPattern
+ Language.Egison.AST: PDTuplePat :: [PrimitiveDataPattern] -> PrimitiveDataPattern
+ Language.Egison.AST: PDWildCard :: PrimitiveDataPattern
+ Language.Egison.AST: PPInductivePat :: String -> [PrimitivePatPattern] -> PrimitivePatPattern
+ Language.Egison.AST: PPPatVar :: PrimitivePatPattern
+ Language.Egison.AST: PPTuplePat :: [PrimitivePatPattern] -> PrimitivePatPattern
+ Language.Egison.AST: PPValuePat :: String -> PrimitivePatPattern
+ Language.Egison.AST: PPWildCard :: PrimitivePatPattern
+ Language.Egison.AST: PartialExpr :: Integer -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: PartialVarExpr :: Integer -> EgisonExpr
+ Language.Egison.AST: PatVar :: Var -> EgisonPattern
+ Language.Egison.AST: PatternFunctionExpr :: [String] -> EgisonPattern -> EgisonExpr
+ Language.Egison.AST: PlusPat :: [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: PowerExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: PowerPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
+ Language.Egison.AST: PredPat :: EgisonExpr -> EgisonPattern
+ Language.Egison.AST: ProcedureExpr :: [String] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: QuoteExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.AST: QuoteSymbolExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.AST: Redefine :: Var -> EgisonExpr -> EgisonTopExpr
+ Language.Egison.AST: RightAssoc :: BinOpAssoc
+ Language.Egison.AST: ScalarArg :: String -> Arg
+ Language.Egison.AST: SeqConsPat :: EgisonPattern -> EgisonPattern -> EgisonPattern
+ Language.Egison.AST: SeqExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: SeqNilPat :: EgisonPattern
+ Language.Egison.AST: SomethingExpr :: EgisonExpr
+ Language.Egison.AST: StringExpr :: Text -> EgisonExpr
+ Language.Egison.AST: SubCollectionExpr :: EgisonExpr -> InnerExpr
+ Language.Egison.AST: SubrefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: Subscript :: a -> Index a
+ Language.Egison.AST: SupSubscript :: a -> Index a
+ Language.Egison.AST: Superscript :: a -> Index a
+ Language.Egison.AST: SuprefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: TensorArg :: String -> Arg
+ Language.Egison.AST: TensorContractExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: TensorExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: TensorMap2Expr :: EgisonExpr -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: TensorMapExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: Test :: EgisonExpr -> EgisonTopExpr
+ Language.Egison.AST: TransposeExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: TupleExpr :: [EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: TuplePat :: [EgisonPattern] -> EgisonPattern
+ Language.Egison.AST: UnaryOpExpr :: String -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: UndefinedExpr :: EgisonExpr
+ Language.Egison.AST: UserrefsExpr :: Bool -> EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: Userscript :: a -> Index a
+ Language.Egison.AST: ValuePat :: EgisonExpr -> EgisonPattern
+ Language.Egison.AST: Var :: [String] -> [Index ()] -> Var
+ Language.Egison.AST: VarExpr :: Var -> EgisonExpr
+ Language.Egison.AST: VarPat :: String -> EgisonPattern
+ Language.Egison.AST: VectorExpr :: [EgisonExpr] -> EgisonExpr
+ Language.Egison.AST: WedgeApplyExpr :: EgisonExpr -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: WildCard :: EgisonPattern
+ Language.Egison.AST: WithSymbolsExpr :: [String] -> EgisonExpr -> EgisonExpr
+ Language.Egison.AST: [assoc] :: EgisonBinOp -> BinOpAssoc
+ Language.Egison.AST: [func] :: EgisonBinOp -> String
+ Language.Egison.AST: [isWedge] :: EgisonBinOp -> Bool
+ Language.Egison.AST: [priority] :: EgisonBinOp -> Int
+ Language.Egison.AST: [repr] :: EgisonBinOp -> String
+ Language.Egison.AST: data Arg
+ Language.Egison.AST: data BinOpAssoc
+ Language.Egison.AST: data EgisonBinOp
+ Language.Egison.AST: data EgisonExpr
+ Language.Egison.AST: data EgisonPattern
+ Language.Egison.AST: data EgisonTopExpr
+ Language.Egison.AST: data Index a
+ Language.Egison.AST: data InnerExpr
+ Language.Egison.AST: data LoopRange
+ Language.Egison.AST: data PMMode
+ Language.Egison.AST: data PrimitiveDataPattern
+ Language.Egison.AST: data PrimitivePatPattern
+ Language.Egison.AST: data Var
+ Language.Egison.AST: instance Data.Hashable.Class.Hashable (Language.Egison.AST.Index ())
+ Language.Egison.AST: instance Data.Hashable.Class.Hashable Language.Egison.AST.Var
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.Arg
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.BinOpAssoc
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.EgisonBinOp
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.EgisonExpr
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.EgisonPattern
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.EgisonTopExpr
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.InnerExpr
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.LoopRange
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.PMMode
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.PrimitiveDataPattern
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.PrimitivePatPattern
+ Language.Egison.AST: instance GHC.Classes.Eq Language.Egison.AST.Var
+ Language.Egison.AST: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Egison.AST.Index a)
+ Language.Egison.AST: instance GHC.Classes.Ord Language.Egison.AST.BinOpAssoc
+ Language.Egison.AST: instance GHC.Classes.Ord Language.Egison.AST.EgisonBinOp
+ Language.Egison.AST: instance GHC.Generics.Generic (Language.Egison.AST.Index a)
+ Language.Egison.AST: instance GHC.Generics.Generic Language.Egison.AST.Var
+ Language.Egison.AST: instance GHC.Show.Show (Language.Egison.AST.Index ())
+ Language.Egison.AST: instance GHC.Show.Show (Language.Egison.AST.Index GHC.Base.String)
+ Language.Egison.AST: instance GHC.Show.Show (Language.Egison.AST.Index Language.Egison.AST.EgisonExpr)
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.Arg
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.BinOpAssoc
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.EgisonBinOp
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.EgisonExpr
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.EgisonPattern
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.EgisonTopExpr
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.InnerExpr
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.LoopRange
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.PMMode
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.PrimitiveDataPattern
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.PrimitivePatPattern
+ Language.Egison.AST: instance GHC.Show.Show Language.Egison.AST.Var
+ Language.Egison.AST: reservedBinops :: [EgisonBinOp]
+ Language.Egison.AST: stringToVar :: String -> Var
+ Language.Egison.AST: stringToVarExpr :: String -> EgisonExpr
+ Language.Egison.AST: type BindingExpr = ([Var], EgisonExpr)
+ Language.Egison.AST: type MatchClause = (EgisonPattern, EgisonExpr)
+ Language.Egison.AST: type PatternDef = (PrimitivePatPattern, EgisonExpr, [(PrimitiveDataPattern, EgisonExpr)])
+ Language.Egison.CmdOptions: EgisonOpts :: Maybe (String, [String]) -> Bool -> Maybe String -> Maybe String -> [(String, String)] -> [String] -> [String] -> Maybe String -> Maybe String -> Maybe String -> Bool -> Bool -> Bool -> Bool -> String -> Maybe String -> Bool -> EgisonOpts
+ Language.Egison.CmdOptions: [optEvalString] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optExecFile] :: EgisonOpts -> Maybe (String, [String])
+ Language.Egison.CmdOptions: [optExecuteString] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optFieldInfo] :: EgisonOpts -> [(String, String)]
+ Language.Egison.CmdOptions: [optFilterTsvInput] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optLoadFiles] :: EgisonOpts -> [String]
+ Language.Egison.CmdOptions: [optLoadLibs] :: EgisonOpts -> [String]
+ Language.Egison.CmdOptions: [optMapTsvInput] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optMathExpr] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optNoIO] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: [optPrompt] :: EgisonOpts -> String
+ Language.Egison.CmdOptions: [optSExpr] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: [optShowBanner] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: [optShowVersion] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: [optSubstituteString] :: EgisonOpts -> Maybe String
+ Language.Egison.CmdOptions: [optTestOnly] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: [optTsvOutput] :: EgisonOpts -> Bool
+ Language.Egison.CmdOptions: cmdParser :: ParserInfo EgisonOpts
+ Language.Egison.CmdOptions: data EgisonOpts
+ Language.Egison.CmdOptions: defaultOption :: EgisonOpts
+ Language.Egison.Pretty: class PrettyS a
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.Arg
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.BindingExpr
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.EgisonExpr
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.EgisonPattern
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.EgisonTopExpr
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.InnerExpr
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.MatchClause
+ Language.Egison.Pretty: instance Data.Text.Prettyprint.Doc.Internal.Pretty Language.Egison.AST.Var
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS (Language.Egison.AST.Index Language.Egison.AST.EgisonExpr)
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS (Language.Egison.AST.Index Language.Egison.Types.EgisonValue)
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS (Language.Egison.AST.Index Language.Egison.Types.ScalarData)
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.Arg
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.EgisonBinOp
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.EgisonExpr
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.EgisonPattern
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.InnerExpr
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.LoopRange
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.AST.Var
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.EgisonValue
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.PolyExpr
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.ScalarData
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.SymbolExpr
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.TermExpr
+ Language.Egison.Pretty: instance Language.Egison.Pretty.PrettyS Language.Egison.Types.VarWithIndices
+ Language.Egison.Pretty: prettyS :: PrettyS a => a -> String
+ Language.Egison.Pretty: showTSV :: EgisonValue -> String
+ Language.Egison.Types: instance GHC.Show.Show (Language.Egison.AST.Index Language.Egison.Types.EgisonValue)
+ Language.Egison.Types: instance GHC.Show.Show (Language.Egison.AST.Index Language.Egison.Types.ScalarData)
- Language.Egison.Types: class (EgisonData a) => EgisonWHNF a
+ Language.Egison.Types: class EgisonData a => EgisonWHNF a
Files
- egison.cabal +5/−2
- hs-src/Interpreter/egison.hs +2/−100
- hs-src/Language/Egison.hs +5/−1
- hs-src/Language/Egison/AST.hs +360/−0
- hs-src/Language/Egison/CmdOptions.hs +136/−0
- hs-src/Language/Egison/Core.hs +46/−104
- hs-src/Language/Egison/Desugar.hs +9/−13
- hs-src/Language/Egison/Parser.hs +16/−15
- hs-src/Language/Egison/ParserNonS.hs +34/−27
- hs-src/Language/Egison/Pretty.hs +261/−8
- hs-src/Language/Egison/Primitives.hs +41/−5
- hs-src/Language/Egison/Types.hs +75/−460
- hs-src/Language/Egison/Util.hs +2/−1
- hs-src/Tool/translator.hs +13/−13
- lib/core/sexpr.egi +6/−0
- nons-test/test/dp.egi +47/−0
- nons-test/test/lib/core/base.egi +10/−3
- nons-test/test/lib/core/order.egi +9/−9
- nons-test/test/poker.egi +39/−0
- nons-test/test/primitive.egi +2/−2
- nons-test/test/syntax.egi +96/−91
- sample/mahjong.egi +14/−10
- sample/math/others/mobius-transformation.egi +3/−2
- sample/poker-hands-with-joker.egi +28/−21
- sample/poker-hands.egi +28/−21
- sample/primes.egi +6/−3
- test/Test.hs +10/−7
- test/answer/sample/mahjong.egi +0/−2
- test/answer/sample/poker-hands-with-joker.egi +0/−4
- test/answer/sample/poker-hands.egi +0/−4
- test/answer/sample/primes.egi +0/−2
- test/lib/math/tensor.egi +2/−2
egison.cabal view
@@ -1,5 +1,5 @@ Name: egison-Version: 3.9.4+Version: 3.10.0 Synopsis: Programming language with non-linear pattern-matching against non-free data Description: An interpreter for Egison, a **pattern-matching-oriented**, purely functional programming language.@@ -63,7 +63,7 @@ sample/*.egi sample/io/*.egi sample/math/algebra/*.egi sample/math/analysis/*.egi sample/math/geometry/*.egi sample/math/number/*.egi sample/math/others/*.egi test/*.egi test/lib/core/*.egi test/lib/math/*.egi nons-test/test/*.egi nons-test/test/lib/core/*.egi- test/answer/sample/*.egi test/answer/sample/math/geometry/*.egi test/answer/sample/math/number/*.egi+ test/answer/sample/math/geometry/*.egi test/answer/sample/math/number/*.egi elisp/egison-mode.el @@ -93,13 +93,16 @@ , vector , split , hashable+ , optparse-applicative , prettyprinter if !impl(ghc > 8.0) Build-Depends: fail Hs-Source-Dirs: hs-src Exposed-Modules: Language.Egison+ Language.Egison.AST Language.Egison.Core+ Language.Egison.CmdOptions Language.Egison.Desugar Language.Egison.Types Language.Egison.Parser
hs-src/Interpreter/egison.hs view
@@ -9,8 +9,6 @@ import Control.Monad.Trans.State import Prelude hiding (catch) -import Data.Char-import Data.Semigroup ((<>)) import qualified Data.Text as T import Data.Version@@ -22,111 +20,15 @@ import System.IO import Language.Egison+import Language.Egison.CmdOptions import Language.Egison.Core (recursiveBind) import Language.Egison.MathOutput import Language.Egison.Util import Options.Applicative - main :: IO ()-main = execParser parserInfo >>= runWithOptions--parserInfo :: ParserInfo EgisonOpts-parserInfo = info (helper <*> parser)- $ fullDesc- <> header "The Egison Programming Language"- where- parser = EgisonOpts- <$> optional ((,) <$> strArgument (metavar "FILE") <*> many (strArgument (metavar "ARGS")))- <*> switch- (short 'v'- <> long "version"- <> help "Show version number")- <*> optional (strOption- (short 'e'- <> long "eval"- <> metavar "EXPR"- <> help "Evaluate the argument string"))- <*> optional (strOption- (short 'c'- <> long "command"- <> metavar "EXPR"- <> help "Execute the argument string"))- <*> many (readFieldOption <$> strOption- (short 'F'- <> long "field"- <> metavar "FIELD"- <> help "Field information"))- <*> many (strOption- (short 'L'- <> long "load-library"- <> metavar "FILE"- <> help "Load library"))- <*> many (strOption- (short 'l'- <> long "load-file"- <> metavar "FILE"- <> help "Load file"))- <*> optional (strOption- (short 's'- <> long "substitute"- <> metavar "EXPR"- <> help "Operate input in tsv format as infinite stream"))- <*> optional ((\s -> "(map " ++ s ++ " $)") <$> strOption- (short 'm'- <> long "map"- <> metavar "EXPR"- <> help "Operate input in tsv format line by line"))- <*> optional ((\s -> "(filter " ++ s ++ " $)") <$> strOption- (short 'f'- <> long "filter"- <> metavar "EXPR"- <> help "Filter input in tsv format line by line"))- <*> switch- (short 'T'- <> long "tsv"- <> help "Output in tsv format")- <*> switch- (long "no-io"- <> help "Prohibit all io primitives")- <*> flag True False- (long "no-banner"- <> help "Do not display banner")- <*> switch- (short 't'- <> long "test"- <> help "Execute only test expressions")- <*> strOption- (short 'p'- <> long "prompt"- <> metavar "STRING"- <> value "> "- <> help "Set prompt string")- <*> optional (strOption- (short 'M'- <> long "math"- <> metavar "(asciimath|latex|mathematica|maxima)"- <> help "Output in AsciiMath, Latex, Mathematica, or Maxima format"))- <*> flag True False- (short 'N'- <> long "new-syntax"- <> help "[experimental] Use non-S expression syntax")--readFieldOption :: String -> (String, String)-readFieldOption str =- let (s, rs) = span isDigit str in- case rs of- ',':rs' -> let (e, opts) = span isDigit rs' in- case opts of- ['s'] -> ("{" ++ s ++ " " ++ e ++ "}", "")- ['c'] -> ("{}", "{" ++ s ++ " " ++ e ++ "}")- ['s', 'c'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")- ['c', 's'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")- ['s'] -> ("{" ++ s ++ "}", "")- ['c'] -> ("", "{" ++ s ++ "}")- ['s', 'c'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")- ['c', 's'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")+main = execParser cmdParser >>= runWithOptions runWithOptions :: EgisonOpts -> IO () runWithOptions opts
hs-src/Language/Egison.hs view
@@ -9,7 +9,8 @@ -} module Language.Egison- ( module Language.Egison.Types+ ( module Language.Egison.AST+ , module Language.Egison.Types , module Language.Egison.Primitives -- * Eval Egison expressions , evalTopExprs@@ -33,6 +34,8 @@ import Data.Version import qualified Paths_egison as P +import Language.Egison.AST+import Language.Egison.CmdOptions import Language.Egison.Core import Language.Egison.MathOutput (changeOutputInLang) import Language.Egison.Parser as Parser@@ -147,4 +150,5 @@ , "lib/core/random.egi" , "lib/core/string.egi" , "lib/core/maybe.egi"+ , "lib/core/sexpr.egi" -- For compatibility between new and old syntax ]
+ hs-src/Language/Egison/AST.hs view
@@ -0,0 +1,360 @@+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleInstances #-}++{- |+Module : Language.Egison.AST+Copyright : Satoshi Egi+Licence : MIT++This module defines the syntax of Egison.+-}++module Language.Egison.AST+ ( EgisonTopExpr (..)+ , EgisonExpr (..)+ , EgisonPattern (..)+ , Var (..)+ , Arg (..)+ , Index (..)+ , PMMode (..)+ , InnerExpr (..)+ , BindingExpr (..)+ , MatchClause (..)+ , PatternDef (..)+ , LoopRange (..)+ , PrimitivePatPattern (..)+ , PrimitiveDataPattern (..)+ , EgisonBinOp (..)+ , BinOpAssoc (..)+ , reservedBinops+ , stringToVar+ , stringToVarExpr+ ) where++import Data.Hashable (Hashable)+import Data.List (intercalate)+import Data.List.Split (splitOn)+import Data.Text (Text)+import qualified Data.Text as T+import GHC.Generics (Generic)++data EgisonTopExpr =+ Define Var EgisonExpr+ | Redefine Var EgisonExpr+ | Test EgisonExpr+ | Execute EgisonExpr+ -- temporary : we will replace load to import and export+ | LoadFile String+ | Load String+ deriving (Show, Eq)++data EgisonExpr =+ CharExpr Char+ | StringExpr Text+ | BoolExpr Bool+ | IntegerExpr Integer+ | FloatExpr Double+ | VarExpr Var+ | FreshVarExpr+ | IndexedExpr Bool EgisonExpr [Index EgisonExpr] -- True -> delete old index and append new one+ | SubrefsExpr Bool EgisonExpr EgisonExpr+ | SuprefsExpr Bool EgisonExpr EgisonExpr+ | UserrefsExpr Bool EgisonExpr EgisonExpr+ | PowerExpr EgisonExpr EgisonExpr -- TODO: delete this in v4.0.0+ | InductiveDataExpr String [EgisonExpr]+ | TupleExpr [EgisonExpr]+ | CollectionExpr [InnerExpr] -- TODO: InnerExpr should be EgisonExpr from v4.0.0+ | ArrayExpr [EgisonExpr]+ | HashExpr [(EgisonExpr, EgisonExpr)]+ | VectorExpr [EgisonExpr]++ | LambdaExpr [Arg] EgisonExpr+ | LambdaArgExpr [Char]+ | MemoizedLambdaExpr [String] EgisonExpr+ | MemoizeExpr [(EgisonExpr, EgisonExpr, EgisonExpr)] EgisonExpr+ | CambdaExpr String EgisonExpr+ | ProcedureExpr [String] EgisonExpr+ | MacroExpr [String] EgisonExpr+ | PatternFunctionExpr [String] EgisonPattern++ | IfExpr EgisonExpr EgisonExpr EgisonExpr+ | LetRecExpr [BindingExpr] EgisonExpr+ | LetExpr [BindingExpr] EgisonExpr+ | LetStarExpr [BindingExpr] EgisonExpr+ | WithSymbolsExpr [String] EgisonExpr++ | MatchExpr PMMode EgisonExpr EgisonExpr [MatchClause]+ | MatchAllExpr PMMode EgisonExpr EgisonExpr [MatchClause]+ | MatchLambdaExpr EgisonExpr [MatchClause]+ | MatchAllLambdaExpr EgisonExpr [MatchClause]++ | MatcherExpr [PatternDef]+ | AlgebraicDataMatcherExpr [(String, [EgisonExpr])]++ | QuoteExpr EgisonExpr+ | QuoteSymbolExpr EgisonExpr+ | WedgeApplyExpr EgisonExpr EgisonExpr++ | DoExpr [BindingExpr] EgisonExpr+ | IoExpr EgisonExpr++ | UnaryOpExpr String EgisonExpr+ | BinaryOpExpr EgisonBinOp EgisonExpr EgisonExpr++ | SeqExpr EgisonExpr EgisonExpr+ | ApplyExpr EgisonExpr EgisonExpr+ | CApplyExpr EgisonExpr EgisonExpr+ | PartialExpr Integer EgisonExpr+ | PartialVarExpr Integer++ | GenerateArrayExpr EgisonExpr (EgisonExpr, EgisonExpr)+ | ArrayBoundsExpr EgisonExpr+ | ArrayRefExpr EgisonExpr EgisonExpr++ | GenerateTensorExpr EgisonExpr EgisonExpr+ | TensorExpr EgisonExpr EgisonExpr EgisonExpr EgisonExpr+ | TensorContractExpr EgisonExpr EgisonExpr+ | TensorMapExpr EgisonExpr EgisonExpr+ | TensorMap2Expr EgisonExpr EgisonExpr EgisonExpr+ | TransposeExpr EgisonExpr EgisonExpr+ | FlipIndicesExpr EgisonExpr++ | FunctionExpr [EgisonExpr]++ | SomethingExpr+ | UndefinedExpr+ deriving (Eq)++data Var = Var [String] [Index ()]+ deriving (Eq, Generic)++data Arg =+ ScalarArg String+ | InvertedScalarArg String+ | TensorArg String+ deriving (Eq)++data Index a =+ Subscript a+ | Superscript a+ | SupSubscript a+ | MultiSubscript a a+ | MultiSuperscript a a+ | DFscript Integer Integer -- DifferentialForm+ | Userscript a+ | DotSubscript a+ | DotSupscript a+ deriving (Eq, Generic)++data InnerExpr =+ ElementExpr EgisonExpr+ | SubCollectionExpr EgisonExpr+ deriving (Show, Eq)++data PMMode = BFSMode | DFSMode+ deriving (Eq, Show)++type BindingExpr = ([Var], EgisonExpr)+type MatchClause = (EgisonPattern, EgisonExpr)+type PatternDef = (PrimitivePatPattern, EgisonExpr, [(PrimitiveDataPattern, EgisonExpr)])++-- TODO(momohatt): AndPat and OrPat take only 2 arguments in new syntax+data EgisonPattern =+ WildCard+ | PatVar Var+ | ValuePat EgisonExpr+ | PredPat EgisonExpr+ | IndexedPat EgisonPattern [EgisonExpr]+ | LetPat [BindingExpr] EgisonPattern+ | LaterPat EgisonPattern+ | NotPat EgisonPattern+ | AndPat [EgisonPattern]+ | OrPat [EgisonPattern]+ | TuplePat [EgisonPattern]+ | InductivePat String [EgisonPattern]+ | LoopPat Var LoopRange EgisonPattern EgisonPattern+ | ContPat+ | PApplyPat EgisonExpr [EgisonPattern]+ | VarPat String+ | SeqNilPat+ | SeqConsPat EgisonPattern EgisonPattern+ | LaterPatVar+ -- For symbolic computing+ | DApplyPat EgisonPattern [EgisonPattern]+ | DivPat EgisonPattern EgisonPattern+ | PlusPat [EgisonPattern]+ | MultPat [EgisonPattern]+ | PowerPat EgisonPattern EgisonPattern+ deriving Eq++data LoopRange = LoopRange EgisonExpr EgisonExpr EgisonPattern+ deriving Eq++data PrimitivePatPattern =+ PPWildCard+ | PPPatVar+ | PPValuePat String+ | PPInductivePat String [PrimitivePatPattern]+ | PPTuplePat [PrimitivePatPattern]+ deriving (Show, Eq)++data PrimitiveDataPattern =+ PDWildCard+ | PDPatVar String+ | PDInductivePat String [PrimitiveDataPattern]+ | PDTuplePat [PrimitiveDataPattern]+ | PDEmptyPat+ | PDConsPat PrimitiveDataPattern PrimitiveDataPattern+ | PDSnocPat PrimitiveDataPattern PrimitiveDataPattern+ | PDConstantPat EgisonExpr+ deriving (Show, Eq)++data EgisonBinOp+ = EgisonBinOp { repr :: String -- syntastic representation+ , func :: String -- semantics+ , priority :: Int+ , assoc :: BinOpAssoc+ , isWedge :: Bool -- True if operator is prefixed with '!'+ }+ deriving (Eq, Ord)++instance Show EgisonBinOp where+ show = repr++data BinOpAssoc+ = LeftAssoc+ | RightAssoc+ | NonAssoc+ deriving (Eq, Ord)++instance Show BinOpAssoc where+ show LeftAssoc = "infixl"+ show RightAssoc = "infixr"+ show NonAssoc = "infix"++reservedBinops :: [EgisonBinOp]+reservedBinops =+ [ makeBinOp "^" "**" 8 LeftAssoc+ , makeBinOp "*" "*" 7 LeftAssoc+ , makeBinOp "/" "/" 7 LeftAssoc+ , makeBinOp "%" "remainder" 7 LeftAssoc+ , makeBinOp "+" "+" 6 LeftAssoc+ , makeBinOp "-" "-" 6 LeftAssoc+ , makeBinOp "++" "append" 5 RightAssoc+ , makeBinOp "::" "cons" 5 RightAssoc+ , makeBinOp "=" "eq?" 4 LeftAssoc+ , makeBinOp "<=" "lte?" 4 LeftAssoc+ , makeBinOp ">=" "gte?" 4 LeftAssoc+ , makeBinOp "<" "lt?" 4 LeftAssoc+ , makeBinOp ">" "gt?" 4 LeftAssoc+ , makeBinOp "&&" "and" 3 RightAssoc+ , makeBinOp "||" "or" 2 RightAssoc+ ]+ where+ makeBinOp r f p a =+ EgisonBinOp { repr = r, func = f, priority = p, assoc = a, isWedge = False }++instance Hashable (Index ())+instance Hashable Var++stringToVar :: String -> Var+stringToVar name = Var (splitOn "." name) []++stringToVarExpr :: String -> EgisonExpr+stringToVarExpr = VarExpr . stringToVar++instance Show EgisonExpr where+ show (CharExpr c) = "c#" ++ [c]+ show (StringExpr str) = "\"" ++ T.unpack str ++ "\""+ show (BoolExpr True) = "#t"+ show (BoolExpr False) = "#f"+ show (IntegerExpr n) = show n+ show (FloatExpr x) = show x+ show (VarExpr name) = show name+ show (PartialVarExpr n) = "%" ++ show n+ show (FunctionExpr args) = "(function [" ++ unwords (map show args) ++ "])"+ show (IndexedExpr True expr idxs) = show expr ++ concatMap show idxs+ show (IndexedExpr False expr idxs) = show expr ++ "..." ++ concatMap show idxs+ show (TupleExpr exprs) = "[" ++ unwords (map show exprs) ++ "]"+ show (CollectionExpr ls) = "{" ++ unwords (map show ls) ++ "}"++ show (UnaryOpExpr op e) = op ++ " " ++ show e+ show (BinaryOpExpr op e1 e2) = "(" ++ show e1 ++ " " ++ show op ++ " " ++ show e2 ++ ")"++ show (QuoteExpr e) = "'" ++ show e+ show (QuoteSymbolExpr e) = "`" ++ show e++ show (ApplyExpr fn (TupleExpr [])) = "(" ++ show fn ++ ")"+ show (ApplyExpr fn (TupleExpr args)) = "(" ++ show fn ++ " " ++ unwords (map show args) ++ ")"+ show (ApplyExpr fn arg) = "(" ++ show fn ++ " " ++ show arg ++ ")"+ show (VectorExpr xs) = "[| " ++ unwords (map show xs) ++ " |]"+ show (WithSymbolsExpr xs e) = "(withSymbols {" ++ unwords (map show xs) ++ "} " ++ show e ++ ")"+ show _ = "(not supported)"++instance Show Var where+ show (Var xs is) = intercalate "." xs ++ concatMap show is++instance Show Arg where+ show (ScalarArg name) = "$" ++ name+ show (InvertedScalarArg name) = "*$" ++ name+ show (TensorArg name) = "%" ++ name++instance Show (Index ()) where+ show (Superscript ()) = "~"+ show (Subscript ()) = "_"+ show (SupSubscript ()) = "~_"+ show (DFscript _ _) = ""+ show (Userscript _) = "|"++instance Show (Index String) where+ show (Superscript s) = "~" ++ s+ show (Subscript s) = "_" ++ s+ show (SupSubscript s) = "~_" ++ s+ show (DFscript _ _) = ""+ show (Userscript i) = "|" ++ show i++instance Show (Index EgisonExpr) where+ show (Superscript i) = "~" ++ show i+ show (Subscript i) = "_" ++ show i+ show (SupSubscript i) = "~_" ++ show i+ show (DFscript _ _) = ""+ show (Userscript i) = "|" ++ show i++instance Show EgisonPattern where+ show WildCard = "_"+ show (PatVar var) = "$" ++ show var+ show (ValuePat expr) = "," ++ show expr+ show (PredPat expr) = "?" ++ show expr+ show (IndexedPat pat exprs) = show pat ++ concatMap (("_" ++) . show) exprs+ show (LetPat bexprs pat) = "(let {" ++ unwords (map (\(vars, expr) -> "[" ++ showVarsHelper vars ++ " " ++ show expr ++ "]") bexprs) +++ "} " ++ show pat ++ ")"+ where showVarsHelper [] = ""+ showVarsHelper [v] = "$" ++ show v+ showVarsHelper vs = "[" ++ unwords (map (("$" ++) . show) vs) ++ "]"+ show (LaterPat pat) = "(later " ++ show pat ++ ")"+ show (NotPat pat) = "!" ++ show pat+ show (AndPat pats) = "(&" ++ concatMap ((" " ++) . show) pats ++ ")"+ show (OrPat pats) = "(|" ++ concatMap ((" " ++) . show) pats ++ ")"+ show (TuplePat pats) = "[" ++ unwords (map show pats) ++ "]"+ show (InductivePat name pats) = "<" ++ name ++ concatMap ((" " ++) . show) pats ++ ">"+ show (LoopPat var range pat endPat) = "(loop $" ++ unwords [show var, show range, show pat, show endPat] ++ ")"+ show ContPat = "..."+ show (PApplyPat expr pats) = "(" ++ unwords (show expr : map show pats) ++ ")"+ show (VarPat name) = name+ show SeqNilPat = "{}"+ show (SeqConsPat pat pat') = "{" ++ show pat ++ showSeqPatHelper pat' ++ "}"+ where showSeqPatHelper SeqNilPat = ""+ showSeqPatHelper (SeqConsPat pat pat') = " " ++ show pat ++ showSeqPatHelper pat'+ showSeqPatHelper pat = " " ++ show pat+ show LaterPatVar = "#"++ show (DApplyPat pat pats) = "(" ++ unwords (show pat : map show pats) ++ ")"+ show (DivPat pat pat') = "(/ " ++ show pat ++ " " ++ show pat' ++ ")"+ show (PlusPat pats) = "(+" ++ concatMap ((" " ++) . show) pats+ show (MultPat pats) = "(*" ++ concatMap ((" " ++) . show) pats+ show (PowerPat pat pat') = "(" ++ show pat ++ " ^ " ++ show pat' ++ ")"++instance Show LoopRange where+ show (LoopRange start (ApplyExpr (VarExpr (Var ["from"] [])) (ApplyExpr _ (TupleExpr (x:_)))) endPat) =+ "[" ++ show start ++ " (from " ++ show x ++ ") " ++ show endPat ++ "]"+ show (LoopRange start ends endPat) = "[" ++ show start ++ " " ++ show ends ++ " " ++ show endPat ++ "]"
+ hs-src/Language/Egison/CmdOptions.hs view
@@ -0,0 +1,136 @@+{- |+Module : Language.Egison.CmdOptions+Copyright : Satoshi Egi+Licence : MIT++This module provides command line options of Egison interpreter.+-}++module Language.Egison.CmdOptions+ ( EgisonOpts (..)+ , defaultOption+ , cmdParser+ ) where++import Data.Char (isDigit)+import Options.Applicative++data EgisonOpts = EgisonOpts {+ optExecFile :: Maybe (String, [String]),+ optShowVersion :: Bool,+ optEvalString :: Maybe String,+ optExecuteString :: Maybe String,+ optFieldInfo :: [(String, String)],+ optLoadLibs :: [String],+ optLoadFiles :: [String],+ optSubstituteString :: Maybe String,+ optMapTsvInput :: Maybe String,+ optFilterTsvInput :: Maybe String,+ optTsvOutput :: Bool,+ optNoIO :: Bool,+ optShowBanner :: Bool,+ optTestOnly :: Bool,+ optPrompt :: String,+ optMathExpr :: Maybe String,+ optSExpr :: Bool+ }++defaultOption :: EgisonOpts+defaultOption = EgisonOpts Nothing False Nothing Nothing [] [] [] Nothing Nothing Nothing False False True False "> " Nothing True++cmdParser :: ParserInfo EgisonOpts+cmdParser = info (helper <*> cmdArgParser)+ $ fullDesc+ <> header "The Egison Programming Language"++cmdArgParser :: Parser EgisonOpts+cmdArgParser = EgisonOpts+ <$> optional ((,) <$> strArgument (metavar "FILE") <*> many (strArgument (metavar "ARGS")))+ <*> switch+ (short 'v'+ <> long "version"+ <> help "Show version number")+ <*> optional (strOption+ (short 'e'+ <> long "eval"+ <> metavar "EXPR"+ <> help "Evaluate the argument string"))+ <*> optional (strOption+ (short 'c'+ <> long "command"+ <> metavar "EXPR"+ <> help "Execute the argument string"))+ <*> many (readFieldOption <$> strOption+ (short 'F'+ <> long "field"+ <> metavar "FIELD"+ <> help "Field information"))+ <*> many (strOption+ (short 'L'+ <> long "load-library"+ <> metavar "FILE"+ <> help "Load library"))+ <*> many (strOption+ (short 'l'+ <> long "load-file"+ <> metavar "FILE"+ <> help "Load file"))+ <*> optional (strOption+ (short 's'+ <> long "substitute"+ <> metavar "EXPR"+ <> help "Operate input in tsv format as infinite stream"))+ <*> optional ((\s -> "(map " ++ s ++ " $)") <$> strOption+ (short 'm'+ <> long "map"+ <> metavar "EXPR"+ <> help "Operate input in tsv format line by line"))+ <*> optional ((\s -> "(filter " ++ s ++ " $)") <$> strOption+ (short 'f'+ <> long "filter"+ <> metavar "EXPR"+ <> help "Filter input in tsv format line by line"))+ <*> switch+ (short 'T'+ <> long "tsv"+ <> help "Output in tsv format")+ <*> switch+ (long "no-io"+ <> help "Prohibit all io primitives")+ <*> flag True False+ (long "no-banner"+ <> help "Do not display banner")+ <*> switch+ (short 't'+ <> long "test"+ <> help "Execute only test expressions")+ <*> strOption+ (short 'p'+ <> long "prompt"+ <> metavar "STRING"+ <> value "> "+ <> help "Set prompt string")+ <*> optional (strOption+ (short 'M'+ <> long "math"+ <> metavar "(asciimath|latex|mathematica|maxima)"+ <> help "Output in AsciiMath, Latex, Mathematica, or Maxima format"))+ <*> flag True False+ (short 'N'+ <> long "new-syntax"+ <> help "[experimental] Use non-S expression syntax")++readFieldOption :: String -> (String, String)+readFieldOption str =+ let (s, rs) = span isDigit str in+ case rs of+ ',':rs' -> let (e, opts) = span isDigit rs' in+ case opts of+ ['s'] -> ("{" ++ s ++ " " ++ e ++ "}", "")+ ['c'] -> ("{}", "{" ++ s ++ " " ++ e ++ "}")+ ['s', 'c'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")+ ['c', 's'] -> ("{" ++ s ++ " " ++ e ++ "}", "{" ++ s ++ " " ++ e ++ "}")+ ['s'] -> ("{" ++ s ++ "}", "")+ ['c'] -> ("", "{" ++ s ++ "}")+ ['s', 'c'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")+ ['c', 's'] -> ("{" ++ s ++ "}", "{" ++ s ++ "}")
hs-src/Language/Egison/Core.hs view
@@ -64,8 +64,11 @@ import Data.Text (Text) import qualified Data.Text as T +import Language.Egison.AST+import Language.Egison.CmdOptions import Language.Egison.Parser as Parser import Language.Egison.ParserNonS as ParserNonS+import Language.Egison.Pretty import Language.Egison.Types --@@ -82,27 +85,28 @@ LoadFile file -> if optNoIO opts then throwError $ Default "No IO support"- else do exprs' <- if- | optSExpr opts -> Parser.loadFile file- | otherwise -> ParserNonS.loadFile file+ else do exprs' <- if optSExpr opts then Parser.loadFile file+ else ParserNonS.loadFile file collectDefs opts (exprs' ++ exprs) bindings rest Load file -> if optNoIO opts then throwError $ Default "No IO support"- else do exprs' <- if- | optSExpr opts -> Parser.loadLibraryFile file- | otherwise -> ParserNonS.loadLibraryFile file+ else do exprs' <- if optSExpr opts then Parser.loadLibraryFile file+ else ParserNonS.loadLibraryFile file collectDefs opts (exprs' ++ exprs) bindings rest collectDefs _ [] bindings rest = return (bindings, reverse rest) evalTopExpr' :: EgisonOpts -> StateT [(Var, EgisonExpr)] EgisonM Env -> EgisonTopExpr -> EgisonM (Maybe String, StateT [(Var, EgisonExpr)] EgisonM Env) evalTopExpr' _ st (Define name expr) = return (Nothing, withStateT (\defines -> (name, expr):defines) st) evalTopExpr' _ st (Redefine name expr) = return (Nothing, mapStateT (>>= \(env, defines) -> (, defines) <$> recursiveRebind env (name, expr)) st)-evalTopExpr' _ st (Test expr) = do+evalTopExpr' opts st (Test expr) = do pushFuncName "<stdin>" val <- evalStateT st [] >>= flip evalExprDeep expr popFuncName- return (Just (show val), st)+ case (optSExpr opts, optMathExpr opts) of+ (False, Nothing) -> return (Just (show val), st)+ _ -> return (Just (prettyS val), st)+ evalTopExpr' _ st (Execute expr) = do pushFuncName "<stdin>" io <- evalStateT st [] >>= flip evalExpr expr@@ -142,12 +146,12 @@ return (case x of Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p)) -> case fn of- Nothing -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ show name) argnames args js, 1)]]) p)+ Nothing -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ prettyS name) argnames args js, 1)]]) p) Just s -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p) _ -> x) where refVar' :: Env -> Var -> EgisonM ObjectRef- refVar' env var = maybe (newEvaluatedObjectRef (Value (symbolScalarData "" $ show var))) return+ refVar' env var = maybe (newEvaluatedObjectRef (Value (symbolScalarData "" $ prettyS var))) return (refVar env var) evalExpr env (PartialVarExpr n) = evalExpr env (stringToVarExpr ("::" ++ show n))@@ -177,8 +181,8 @@ evalExpr env@(Env frame maybe_vwi) (VectorExpr exprs) = do whnfs <- mapM (\(expr, i) ->- let env' = maybe env (\(VarWithIndices nameString indexList) -> Env frame $ Just $ VarWithIndices nameString $ changeIndexList indexList [toEgison $ toInteger i]) maybe_vwi in- evalExpr env' expr) $ zip exprs [1..(length exprs + 1)]+ let env' = maybe env (\(VarWithIndices nameString indexList) -> Env frame $ Just $ VarWithIndices nameString $ changeIndexList indexList [toEgison $ toInteger i]) maybe_vwi+ in evalExpr env' expr) $ zip exprs [1..(length exprs + 1)] case whnfs of (Intermediate (ITensor Tensor{}):_) -> mapM toTensor (zipWith (curry f) whnfs [1..(length exprs + 1)]) >>= tConcat' >>= fromTensor@@ -188,8 +192,8 @@ Intermediate $ ITensor $ Tensor ns (V.fromList $ zipWith (curry g) (V.toList xs) $ map (\ms -> map toEgison $ toInteger i:ms) $ enumTensorIndices ns) indices f (x, _) = x g (Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p)), ms) =- let fn' = maybe fn (\(VarWithIndices nameString indexList) -> Just $ symbolScalarData "" $ show $ VarWithIndices nameString $ changeIndexList indexList ms) maybe_vwi in- Value $ ScalarData $ Div (Plus [Term 1 [(FunctionData fn' argnames args js, 1)]]) p+ let fn' = maybe fn (\(VarWithIndices nameString indexList) -> Just $ symbolScalarData "" $ prettyS $ VarWithIndices nameString $ changeIndexList indexList ms) maybe_vwi+ in Value $ ScalarData $ Div (Plus [Term 1 [(FunctionData fn' argnames args js, 1)]]) p g (x, _) = x evalExpr env (TensorExpr nsExpr xsExpr supExpr subExpr) = do@@ -243,29 +247,13 @@ (Just objRef) -> evalRef objRef Nothing -> evalExpr env expr _ -> evalExpr env expr- js <- mapM (\case- Superscript n -> Superscript <$> evalExprDeep env n- Subscript n -> Subscript <$> evalExprDeep env n- SupSubscript n -> SupSubscript <$> evalExprDeep env n- Userscript n -> Userscript <$> evalExprDeep env n- ) indices-+ js <- mapM evalIndex indices ret <- case tensor of (Value (ScalarData (Div (Plus [Term 1 [(Symbol id name [], 1)]]) (Plus [Term 1 []])))) -> do- js2 <- mapM (\case- Superscript n -> Superscript <$> (evalExprDeep env n >>= extractScalar)- Subscript n -> Subscript <$> (evalExprDeep env n >>= extractScalar)- SupSubscript n -> SupSubscript <$> (evalExprDeep env n >>= extractScalar)- Userscript n -> Userscript <$> (evalExprDeep env n >>= extractScalar)- ) indices+ js2 <- mapM evalIndexToScalar indices return $ Value (ScalarData (Div (Plus [Term 1 [(Symbol id name js2, 1)]]) (Plus [Term 1 []]))) (Value (ScalarData (Div (Plus [Term 1 [(Symbol id name js', 1)]]) (Plus [Term 1 []])))) -> do- js2 <- mapM (\case- Superscript n -> Superscript <$> (evalExprDeep env n >>= extractScalar)- Subscript n -> Subscript <$> (evalExprDeep env n >>= extractScalar)- SupSubscript n -> SupSubscript <$> (evalExprDeep env n >>= extractScalar)- Userscript n -> Userscript <$> (evalExprDeep env n >>= extractScalar)- ) indices+ js2 <- mapM evalIndexToScalar indices return $ Value (ScalarData (Div (Plus [Term 1 [(Symbol id name (js' ++ js2), 1)]]) (Plus [Term 1 []]))) (Value (TensorData (Tensor ns xs is))) -> if bool then Value <$> (tref js (Tensor ns xs js) >>= toTensor >>= tContract' >>= fromTensor)@@ -274,12 +262,7 @@ if bool then tref js (Tensor ns xs js) >>= toTensor >>= tContract' >>= fromTensor else tref (is ++ js) (Tensor ns xs (is ++ js)) >>= toTensor >>= tContract' >>= fromTensor _ -> do- js2 <- mapM (\case- Superscript n -> Superscript <$> (evalExprDeep env n >>= extractScalar)- Subscript n -> Subscript <$> (evalExprDeep env n >>= extractScalar)- SupSubscript n -> SupSubscript <$> (evalExprDeep env n >>= extractScalar)- Userscript n -> Userscript <$> (evalExprDeep env n >>= extractScalar)- ) indices+ js2 <- mapM evalIndexToScalar indices refArray tensor (map (\case Superscript k -> ScalarData k Subscript k -> ScalarData k@@ -291,12 +274,25 @@ case ret of Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p)) -> case fn of- Nothing -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ show var ++ concatMap show indices) argnames args js, 1)]]) p)+ Nothing -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ prettyS var ++ concatMap show indices) argnames args js, 1)]]) p) Just s -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p) _ -> ret _ -> ret return ret2 where+ evalIndex :: Index EgisonExpr -> EgisonM (Index EgisonValue)+ evalIndex = \case+ Superscript n -> Superscript <$> evalExprDeep env n+ Subscript n -> Subscript <$> evalExprDeep env n+ SupSubscript n -> SupSubscript <$> evalExprDeep env n+ Userscript n -> Userscript <$> evalExprDeep env n+ evalIndexToScalar :: Index EgisonExpr -> EgisonM (Index ScalarData)+ evalIndexToScalar = \case+ Superscript n -> Superscript <$> (evalExprDeep env n >>= extractScalar)+ Subscript n -> Subscript <$> (evalExprDeep env n >>= extractScalar)+ SupSubscript n -> SupSubscript <$> (evalExprDeep env n >>= extractScalar)+ Userscript n -> Userscript <$> (evalExprDeep env n >>= extractScalar)+ f :: Index a -> Index () f (Superscript _) = Superscript () f (Subscript _) = Subscript ()@@ -322,12 +318,6 @@ if bool then tref js (Tensor ns xs js) >>= toTensor >>= tContract' >>= fromTensor else tref (is ++ js) (Tensor ns xs (is ++ js)) >>= toTensor >>= tContract' >>= fromTensor _ -> throwError =<< NotImplemented "subrefs" <$> getFuncNameStack- where- f :: Index a -> Index ()- f (Superscript _) = Superscript ()- f (Subscript _) = Subscript ()- f (SupSubscript _) = SupSubscript ()- f (Userscript _) = Userscript () evalExpr env (SuprefsExpr bool expr jsExpr) = do js <- map Superscript <$> (evalExpr env jsExpr >>= collectionToList)@@ -348,12 +338,6 @@ if bool then tref js (Tensor ns xs js) >>= toTensor >>= tContract' >>= fromTensor else tref (is ++ js) (Tensor ns xs (is ++ js)) >>= toTensor >>= tContract' >>= fromTensor _ -> throwError =<< NotImplemented "suprefs" <$> getFuncNameStack- where- f :: Index a -> Index ()- f (Superscript _) = Superscript ()- f (Subscript _) = Subscript ()- f (SupSubscript _) = SupSubscript ()- f (Userscript _) = Userscript () evalExpr env (UserrefsExpr bool expr jsExpr) = do val <- evalExprDeep env expr@@ -383,16 +367,7 @@ evalExpr env@(Env frame (Just name)) (FunctionExpr args) = do args' <- mapM (evalExprDeep env) args- return . Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ show name) (map (symbolScalarData "" . show) args) args' [], 1)]]) (Plus [Term 1 []]))--evalExpr env (SymbolicTensorExpr args sizeExpr name) = do- args' <- mapM (evalExprDeep env) args- size' <- evalExpr env sizeExpr- size'' <- collectionToList size'- ns <- mapM fromEgison size'' :: EgisonM [Integer]- let xs = map ((\ms -> Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" (name ++ concatMap ((\m -> "_" ++ m) . show) ms)) (map (symbolScalarData "" . show) args) args' [], 1)]]) (Plus [Term 1 []])))- . map toEgison) (enumTensorIndices ns)- fromTensor (Tensor ns (V.fromList xs) [])+ return . Value $ ScalarData (Div (Plus [Term 1 [(FunctionData (Just $ symbolScalarData "" $ prettyS name) (map (symbolScalarData "" . prettyS) args) args' [], 1)]]) (Plus [Term 1 []])) evalExpr env (IfExpr test expr expr') = do test <- evalExpr env test >>= fromWHNF@@ -423,7 +398,7 @@ nth n = let pattern = TuplePat $ flip map [1..k] $ \i -> if i == n then PatVar (stringToVar "#_") else WildCard- in MatchExpr target matcher [(pattern, stringToVarExpr "#_")]+ in MatchExpr BFSMode target matcher [(pattern, stringToVarExpr "#_")] return ((var, expr) : map (second nth) (zip names [1..])) genVar :: State Int Var@@ -498,25 +473,7 @@ Tuple [_, val'] -> return $ Value val' _ -> throwError =<< TypeMismatch "io" io <$> getFuncNameStack -evalExpr env (MatchAllExpr target matcher clauses) = do- target <- evalExpr env target- matcher <- evalExpr env matcher >>= evalMatcherWHNF- f matcher target >>= fromMList- where- fromMList :: MList EgisonM WHNFData -> EgisonM WHNFData- fromMList MNil = return . Value $ Collection Sq.empty- fromMList (MCons val m) = do- head <- IElement <$> newEvaluatedObjectRef val- tail <- ISubCollection <$> (liftIO . newIORef . Thunk $ m >>= fromMList)- seqRef <- liftIO . newIORef $ Sq.fromList [head, tail]- return . Intermediate $ ICollection seqRef- f matcher target = do- let tryMatchClause (pattern, expr) results = do- result <- patternMatch BFSMode env pattern target matcher- mmap (flip evalExpr expr . extendEnv env) result >>= flip mappend results- mfoldr tryMatchClause (return MNil) (fromList clauses)--evalExpr env (MatchAllDFSExpr target matcher clauses) = do+evalExpr env (MatchAllExpr pmmode target matcher clauses) = do target <- evalExpr env target matcher <- evalExpr env matcher >>= evalMatcherWHNF f matcher target >>= fromMList@@ -530,33 +487,18 @@ return . Intermediate $ ICollection seqRef f matcher target = do let tryMatchClause (pattern, expr) results = do- result <- patternMatch DFSMode env pattern target matcher+ result <- patternMatch pmmode env pattern target matcher mmap (flip evalExpr expr . extendEnv env) result >>= flip mappend results mfoldr tryMatchClause (return MNil) (fromList clauses) -evalExpr env (MatchExpr target matcher clauses) = do- target <- evalExpr env target- matcher <- evalExpr env matcher >>= evalMatcherWHNF- f matcher target- where- f matcher target = do- let tryMatchClause (pattern, expr) cont = do- result <- patternMatch BFSMode env pattern target matcher- case result of- MCons bindings _ -> evalExpr (extendEnv env bindings) expr- MNil -> cont- currentFuncName <- topFuncName- callstack <- getFuncNameStack- foldr tryMatchClause (throwError $ MatchFailure currentFuncName callstack) clauses--evalExpr env (MatchDFSExpr target matcher clauses) = do+evalExpr env (MatchExpr pmmode target matcher clauses) = do target <- evalExpr env target matcher <- evalExpr env matcher >>= evalMatcherWHNF f matcher target where f matcher target = do let tryMatchClause (pattern, expr) cont = do- result <- patternMatch DFSMode env pattern target matcher+ result <- patternMatch pmmode env pattern target matcher case result of MCons bindings _ -> evalExpr (extendEnv env bindings) expr MNil -> cont@@ -1016,7 +958,7 @@ recursiveRebind :: Env -> (Var, EgisonExpr) -> EgisonM Env recursiveRebind env (name, expr) = do case refVar env name of- Nothing -> throwError =<< UnboundVariable (show name) <$> getFuncNameStack+ Nothing -> throwError =<< UnboundVariable (prettyS name) <$> getFuncNameStack Just ref -> case expr of MemoizedLambdaExpr names body -> do hashRef <- liftIO $ newIORef HL.empty@@ -1147,7 +1089,7 @@ let env' = extendEnvForNonLinearPatterns env bindings loops in case pattern of NotPat _ -> throwError =<< EgisonBug "should not reach here (not pattern)" <$> getFuncNameStack- VarPat _ -> throwError $ Default $ "cannot use variable except in pattern function:" ++ show pattern+ VarPat _ -> throwError $ Default $ "cannot use variable except in pattern function:" ++ prettyS pattern LetPat bindings' pattern' -> let extractBindings ([name], expr) =@@ -1294,13 +1236,13 @@ subst k nv ((k', v'):xs) | k == k' = (k', nv):subst k nv xs | otherwise = (k', v'):subst k nv xs subst _ _ [] = []- IndexedPat pattern indices -> throwError $ Default ("invalid indexed-pattern: " ++ show pattern)+ IndexedPat pattern indices -> throwError $ Default ("invalid indexed-pattern: " ++ prettyS pattern) TuplePat patterns -> do targets <- fromTupleWHNF target when (length patterns /= length targets) $ throwError =<< TupleLength (length patterns) (length targets) <$> getFuncNameStack let trees' = zipWith3 MAtom patterns targets (replicate (length patterns) Something) ++ trees return $ msingleton $ MState env loops seqs bindings trees'- _ -> throwError $ Default $ "something can only match with a pattern variable. not: " ++ show pattern+ _ -> throwError $ Default $ "something can only match with a pattern variable. not: " ++ prettyS pattern _ -> throwError =<< EgisonBug ("should not reach here. matcher: " ++ show matcher ++ ", pattern: " ++ show pattern) <$> getFuncNameStack inductiveMatch :: Env -> EgisonPattern -> WHNFData -> Matcher ->
hs-src/Language/Egison/Desugar.hs view
@@ -22,6 +22,7 @@ import Data.Set (Set) import qualified Data.Set as S +import Language.Egison.AST import Language.Egison.Types desugarTopExpr :: EgisonTopExpr -> EgisonM EgisonTopExpr@@ -53,7 +54,8 @@ genMainClause patterns matcher = do clauses <- genClauses patterns return (PPValuePat "val", TupleExpr []- ,[(PDPatVar "tgt", MatchExpr (TupleExpr [stringToVarExpr "val", stringToVarExpr "tgt"])+ ,[(PDPatVar "tgt", MatchExpr BFSMode+ (TupleExpr [stringToVarExpr "val", stringToVarExpr "tgt"]) (TupleExpr [matcher, matcher]) clauses)]) where@@ -105,11 +107,11 @@ desugar (MatchAllLambdaExpr matcher clauses) = do name <- fresh- desugar $ LambdaExpr [TensorArg name] (MatchAllExpr (stringToVarExpr name) matcher clauses)+ desugar $ LambdaExpr [TensorArg name] (MatchAllExpr BFSMode (stringToVarExpr name) matcher clauses) desugar (MatchLambdaExpr matcher clauses) = do name <- fresh- desugar $ LambdaExpr [TensorArg name] (MatchExpr (stringToVarExpr name) matcher clauses)+ desugar $ LambdaExpr [TensorArg name] (MatchExpr BFSMode (stringToVarExpr name) matcher clauses) desugar (ArrayRefExpr expr nums) = case nums of@@ -265,17 +267,11 @@ desugar (WithSymbolsExpr vars expr) = WithSymbolsExpr vars <$> desugar expr -desugar (MatchExpr expr0 expr1 clauses) =- MatchExpr <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses--desugar (MatchDFSExpr expr0 expr1 clauses) =- MatchDFSExpr <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses--desugar (MatchAllExpr expr0 expr1 clauses) =- MatchAllExpr <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses+desugar (MatchExpr pmmode expr0 expr1 clauses) =+ MatchExpr pmmode <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses -desugar (MatchAllDFSExpr expr0 expr1 clauses) =- MatchAllDFSExpr <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses+desugar (MatchAllExpr pmmode expr0 expr1 clauses) =+ MatchAllExpr pmmode <$> desugar expr0 <*> desugar expr1 <*> desugarMatchClauses clauses desugar (DoExpr binds expr) = DoExpr <$> desugarBindings binds <*> desugar expr
hs-src/Language/Egison/Parser.hs view
@@ -25,27 +25,28 @@ , loadFile ) where +import Prelude hiding (mapM)+ import Control.Applicative (pure, (*>), (<$>), (<*), (<*>)) import Control.Monad.Except (liftIO, throwError) import Control.Monad.Identity (Identity, unless)-import Prelude hiding (mapM) -import System.Directory (doesFileExist, getHomeDirectory)- import Data.Char (isLower, isUpper) import Data.Either import Data.Functor (($>)) import Data.List.Split (splitOn) import Data.Ratio import qualified Data.Set as Set+import qualified Data.Text as T import Data.Traversable (mapM) import Text.Parsec import Text.Parsec.String import qualified Text.Parsec.Token as P--import qualified Data.Text as T+import System.Directory (doesFileExist, getHomeDirectory)+import System.IO +import Language.Egison.AST import Language.Egison.Desugar import Language.Egison.Types import Paths_egison (getDataFileName)@@ -111,6 +112,12 @@ shebang ('#':'!':cs) = ';':'#':'!':cs shebang cs = cs +readUTF8File :: FilePath -> IO String+readUTF8File name = do+ h <- openFile name ReadMode+ hSetEncoding h utf8+ hGetContents h+ -- -- Parser --@@ -226,7 +233,6 @@ <|> arrayBoundsExpr <|> arrayRefExpr <|> generateTensorExpr- <|> symbolicTensorExpr <|> tensorExpr <|> tensorContractExpr <|> tensorMapExpr@@ -290,23 +296,20 @@ lp = P.lexeme lexer (char '[') rp = char ']' -symbolicTensorExpr :: Parser EgisonExpr-symbolicTensorExpr = keywordSymbolicTensor >> SymbolicTensorExpr <$> brackets (sepEndBy expr whiteSpace) <*> expr <*> ident- quoteSymbolExpr :: Parser EgisonExpr quoteSymbolExpr = char '`' >> QuoteSymbolExpr <$> expr matchAllExpr :: Parser EgisonExpr-matchAllExpr = keywordMatchAll >> MatchAllExpr <$> expr <*> expr <*> (((:[]) <$> matchClause) <|> matchClauses)+matchAllExpr = keywordMatchAll >> MatchAllExpr BFSMode <$> expr <*> expr <*> (((:[]) <$> matchClause) <|> matchClauses) matchAllDFSExpr :: Parser EgisonExpr-matchAllDFSExpr = keywordMatchAllDFS >> MatchAllDFSExpr <$> expr <*> expr <*> (((:[]) <$> matchClause) <|> matchClauses)+matchAllDFSExpr = keywordMatchAllDFS >> MatchAllExpr DFSMode <$> expr <*> expr <*> (((:[]) <$> matchClause) <|> matchClauses) matchExpr :: Parser EgisonExpr-matchExpr = keywordMatch >> MatchExpr <$> expr <*> expr <*> matchClauses+matchExpr = keywordMatch >> MatchExpr BFSMode <$> expr <*> expr <*> matchClauses matchDFSExpr :: Parser EgisonExpr-matchDFSExpr = keywordMatchDFS >> MatchDFSExpr <$> expr <*> expr <*> matchClauses+matchDFSExpr = keywordMatchDFS >> MatchExpr DFSMode <$> expr <*> expr <*> matchClauses matchAllLambdaExpr :: Parser EgisonExpr matchAllLambdaExpr = keywordMatchAllLambda >> MatchAllLambdaExpr <$> expr <*> (((:[]) <$> matchClause) <|> matchClauses)@@ -796,7 +799,6 @@ , "user-refs" , "user-refs!" , "function"- , "symbolic-tensor" , "something" , "undefined"] @@ -877,7 +879,6 @@ keywordUserrefs = reserved "user-refs" keywordUserrefsNew = reserved "user-refs!" keywordFunction = reserved "function"-keywordSymbolicTensor = reserved "symbolic-tensor" sign :: Num a => Parser (a -> a) sign = (char '-' >> return negate)
hs-src/Language/Egison/ParserNonS.hs view
@@ -25,16 +25,16 @@ , loadFile ) where +import Prelude hiding (mapM)+ import Control.Applicative (pure, (*>), (<$>), (<$), (<*), (<*>)) import Control.Monad.Except (liftIO, throwError) import Control.Monad.State (unless)-import Prelude hiding (mapM) -import System.Directory (doesFileExist, getHomeDirectory)- import Data.Functor (($>)) import Data.List (find) import Data.Maybe (fromJust, isJust)+import Data.Text (pack) import Data.Traversable (mapM) import Control.Monad.Combinators.Expr@@ -43,9 +43,10 @@ import qualified Text.Megaparsec.Char.Lexer as L import Text.Megaparsec.Debug (dbg) import Text.Megaparsec.Pos (Pos)--import Data.Text (pack)+import System.Directory (doesFileExist, getHomeDirectory)+import System.IO +import Language.Egison.AST import Language.Egison.Desugar import Language.Egison.Types import Paths_egison (getDataFileName)@@ -99,6 +100,12 @@ shebang ('#':'!':cs) = ';':'#':'!':cs shebang cs = cs +readUTF8File :: FilePath -> IO String+readUTF8File name = do+ h <- openFile name ReadMode+ hSetEncoding h utf8+ hGetContents h+ -- -- Parser --@@ -139,7 +146,7 @@ defineOrTestExpr :: Parser EgisonTopExpr defineOrTestExpr = do e <- expr- (do symbol "="+ (do symbol ":=" body <- expr return $ convertToDefine e body) <|> return (Test e)@@ -176,6 +183,7 @@ <|> letExpr <|> withSymbolsExpr <|> doExpr+ <|> ioExpr <|> matcherExpr <|> algebraicDataMatcherExpr <|> memoizedLambdaExpr@@ -212,10 +220,10 @@ , [ InfixL (binary "+" ) , InfixL (binary "-" ) ] -- 5- , [ InfixR (binary ":" )+ , [ InfixR (binary "::" ) , InfixR (binary "++") ] -- 4- , [ InfixL (binary "==")+ , [ InfixL (binary "=") , InfixL (binary "<=") , InfixL (binary "<" ) , InfixL (binary ">=")@@ -230,10 +238,10 @@ ifExpr = keywordIf >> IfExpr <$> expr <* keywordThen <*> expr <* keywordElse <*> expr patternMatchExpr :: Parser EgisonExpr-patternMatchExpr = makeMatchExpr keywordMatch MatchExpr- <|> makeMatchExpr keywordMatchDFS MatchDFSExpr- <|> makeMatchExpr keywordMatchAll MatchAllExpr- <|> makeMatchExpr keywordMatchAllDFS MatchAllDFSExpr+patternMatchExpr = makeMatchExpr keywordMatch (MatchExpr BFSMode)+ <|> makeMatchExpr keywordMatchDFS (MatchExpr DFSMode)+ <|> makeMatchExpr keywordMatchAll (MatchAllExpr BFSMode)+ <|> makeMatchExpr keywordMatchAllDFS (MatchAllExpr DFSMode) <?> "pattern match expression" where makeMatchExpr keyword ctor = ctor <$> (keyword >> expr)@@ -285,7 +293,7 @@ <|> do var <- varLiteral args <- many arg return ([var], args)- body <- symbol "=" >> expr+ body <- symbol ":=" >> expr return $ case args of [] -> (vars, body) _ -> (vars, LambdaExpr args body)@@ -303,6 +311,9 @@ statement :: Parser BindingExpr statement = (keywordLet >> binding) <|> ([],) <$> expr +ioExpr :: Parser EgisonExpr+ioExpr = IoExpr <$> (keywordIo >> expr)+ matcherExpr :: Parser EgisonExpr matcherExpr = do keywordMatcher@@ -410,7 +421,7 @@ hashExpr = HashExpr <$> hashBraces (sepEndBy hashElem comma) where hashBraces = between (symbol "{|") (symbol "|}")- hashElem = brackets $ (,) <$> expr <*> (comma >> expr)+ hashElem = parens $ (,) <$> expr <*> (comma >> expr) index :: Parser (Index EgisonExpr) index = SupSubscript <$> (string "~_" >> atomExpr')@@ -494,13 +505,9 @@ return $ LetPat binds body loopPattern :: Parser EgisonPattern-loopPattern = do- keywordLoop- iter <- patVarLiteral- range <- loopRange- loopBody <- optional (symbol "|") >> pattern- loopEnd <- symbol "|" >> pattern- return $ LoopPat iter range loopBody loopEnd+loopPattern =+ LoopPat <$> (keywordLoop >> patVarLiteral) <*> loopRange+ <*> atomPattern <*> atomPattern where loopRange :: Parser LoopRange loopRange =@@ -525,12 +532,12 @@ table = [ [ Prefix (NotPat <$ symbol "!") ] -- 5- , [ InfixR (inductive2 "cons" ":" )+ , [ InfixR (inductive2 "cons" "::" ) , InfixR (inductive2 "join" "++") ] -- 3- , [ InfixR (binary AndPat "&&") ]+ , [ InfixR (binary AndPat "&") ] -- 2- , [ InfixR (binary OrPat "||") ]+ , [ InfixR (binary OrPat "|") ] ] inductive2 name sym = (\x y -> InductivePat name [x, y]) <$ patOperator sym binary name sym = (\x y -> name [x, y]) <$ patOperator sym@@ -574,7 +581,7 @@ where table :: [[Operator Parser PrimitivePatPattern]] table =- [ [ InfixR (inductive2 "cons" ":" )+ [ [ InfixR (inductive2 "cons" "::" ) , InfixR (inductive2 "join" "++") ] ] inductive2 name sym = (\x y -> PPInductivePat name [x, y]) <$ operator sym@@ -594,7 +601,7 @@ where table :: [[Operator Parser PrimitiveDataPattern]] table =- [ [ InfixR (PDConsPat <$ symbol ":") ]+ [ [ InfixR (PDConsPat <$ symbol "::") ] ] pdAtom :: Parser PrimitiveDataPattern pdAtom = PDWildCard <$ symbol "_"@@ -674,7 +681,7 @@ -- Characters that consist identifiers identChar :: Parser Char-identChar = alphaNumChar <|> oneOf ['.', '?', '\'']+identChar = alphaNumChar <|> oneOf ['.', '?', '\'', '/'] parens = between (symbol "(") (symbol ")") braces = between (symbol "{") (symbol "}")
hs-src/Language/Egison/Pretty.hs view
@@ -10,10 +10,18 @@ module Language.Egison.Pretty ( prettyTopExprs+ , PrettyS(..)+ , showTSV ) where +import qualified Data.Array as Array+import Data.Foldable (toList)+import qualified Data.HashMap.Strict as HashMap+import Data.List (intercalate) import Data.Text.Prettyprint.Doc+import qualified Data.Vector as V +import Language.Egison.AST import Language.Egison.Types --@@ -25,9 +33,11 @@ instance Pretty EgisonTopExpr where pretty (Define x (LambdaExpr args body)) =- pretty x <+> hsep (map pretty args) <+> equals <> softline <> pretty body- pretty (Define x expr) = pretty x <+> equals <> nest 2 (softline <> pretty expr)+ pretty x <+> hsep (map pretty args) <+> pretty ":=" <> nest 2 (softline <> pretty body)+ pretty (Define x expr) = pretty x <+> pretty ":=" <> nest 2 (softline <> pretty expr) pretty (Test expr) = pretty expr+ pretty (LoadFile file) = pretty "loadFile" <+> pretty (show file)+ pretty (Load lib) = pretty "load" <+> pretty (show lib) instance Pretty EgisonExpr where pretty (CharExpr x) = squote <> pretty x <> squote@@ -42,23 +52,55 @@ pretty (TupleExpr xs) = tupled (map pretty xs) pretty (CollectionExpr xs) = list (map pretty xs) pretty (ArrayExpr xs) = listoid "(|" "|)" (map pretty xs)- pretty (HashExpr xs) = listoid "{|" "|}" (map (\(x, y) -> list [pretty x, pretty y]) xs)+ pretty (HashExpr xs) = listoid "{|" "|}" (map (\(x, y) -> tupled [pretty x, pretty y]) xs) pretty (VectorExpr xs) = listoid "[|" "|]" (map pretty xs) pretty (LambdaExpr xs y) = pretty "\\" <> hsep (map pretty xs) <+> pretty "->" <> nest 2 (softline <> pretty y) pretty (PatternFunctionExpr xs y) = pretty "\\" <> hsep (map pretty xs) <+> pretty "=>" <> softline <> pretty y + pretty (IfExpr x y z) =+ pretty "if" <+> pretty x+ <> nest 2 (softline <> pretty "then" <+> pretty y <>+ softline <> pretty "else" <+> pretty z)+ pretty (LetRecExpr bindings body) =+ hang 1 (pretty "let" <+> align (vsep (map pretty bindings)) <> hardline <> pretty "in" <+> pretty body)+ pretty (LetExpr _ _) = error "unreachable"+ pretty (LetStarExpr _ _) = error "unreachable"++ pretty (MatchExpr BFSMode tgt matcher clauses) =+ pretty "match" <+> pretty tgt <+> prettyMatch matcher clauses+ pretty (MatchExpr DFSMode tgt matcher clauses) =+ pretty "matchDFS" <+> pretty tgt <+> prettyMatch matcher clauses+ pretty (MatchAllExpr BFSMode tgt matcher clauses) =+ pretty "matchAll" <+> pretty tgt <+> prettyMatch matcher clauses+ pretty (MatchAllExpr DFSMode tgt matcher clauses) =+ pretty "matchAllDFS" <+> pretty tgt <+> prettyMatch matcher clauses+ pretty (MatchLambdaExpr matcher clauses) =+ pretty "\\match" <+> prettyMatch matcher clauses+ pretty (MatchAllLambdaExpr matcher clauses) =+ pretty "\\matchAll" <+> prettyMatch matcher clauses+ pretty (UnaryOpExpr op x) = pretty op <> pretty x- pretty (BinaryOpExpr op x@(BinaryOpExpr op' _ _) y)- | priority op > priority op' = parens (pretty x) <+> pretty (repr op) <+> pretty' y- | otherwise = pretty x <+> pretty (repr op) <+> pretty' y+ -- (x1 op' x2) op y+ pretty (BinaryOpExpr op x@(BinaryOpExpr op' _ _) y) =+ if priority op > priority op' || priority op == priority op' && assoc op == RightAssoc+ then parens (pretty x) <+> pretty (repr op) <+> pretty' y+ else pretty x <+> pretty (repr op) <+> pretty' y+ -- x op (y1 op' y2)+ pretty (BinaryOpExpr op x y@(BinaryOpExpr op' _ _)) =+ if priority op > priority op' || priority op == priority op' && assoc op == LeftAssoc+ then pretty x <+> pretty (repr op) <+> parens (pretty y)+ else pretty x <+> pretty (repr op) <+> pretty' y pretty (BinaryOpExpr op x y) = pretty x <+> pretty (repr op) <+> pretty' y pretty (ApplyExpr x (TupleExpr ys)) = nest 2 (pretty x <+> fillSep (map pretty ys)) + pretty SomethingExpr = pretty "something"+ pretty UndefinedExpr = pretty "undefined"+ instance Pretty Arg where pretty (ScalarArg x) = pretty x- pretty (InvertedScalarArg x) = pretty "*$" <> pretty x+ pretty (InvertedScalarArg x) = pretty "*" <> pretty x pretty (TensorArg x) = pretty '%' <> pretty x instance Pretty Var where@@ -69,12 +111,223 @@ pretty (ElementExpr x) = pretty x pretty (SubCollectionExpr _) = error "Not supported" +instance {-# OVERLAPPING #-} Pretty BindingExpr where+ pretty ([var], expr) = pretty var <+> pretty ":=" <+> pretty expr+ pretty (vars, expr) = tupled (map pretty vars) <+> pretty ":=" <+> pretty expr++instance {-# OVERLAPPING #-} Pretty MatchClause where+ pretty (pat, expr) = pipe <+> pretty pat <+> pretty "->" <> softline <> pretty expr+ instance Pretty EgisonPattern where- pretty x = undefined+ pretty WildCard = pretty "_"+ pretty (PatVar x) = pretty "$" <> pretty x+ pretty (ValuePat v) = pretty "#" <> parens (pretty v) -- TODO: remove parens+ pretty (PredPat v) = pretty "?" <> parens (pretty v)+ pretty _ = pretty "hoge" pretty' :: EgisonExpr -> Doc ann pretty' x@(UnaryOpExpr _ _) = parens $ pretty x pretty' x = pretty x +prettyMatch :: EgisonExpr -> [MatchClause] -> Doc ann+prettyMatch matcher clauses =+ pretty "as" <+> pretty matcher <+> pretty "with" <> hardline <>+ align (vsep (map pretty clauses))+ listoid :: String -> String -> [Doc ann] -> Doc ann listoid lp rp elems = encloseSep (pretty lp) (pretty rp) (comma <> space) elems++--+-- Pretty printer for S-expression+--++class PrettyS a where+ prettyS :: a -> String++instance PrettyS EgisonExpr where+ prettyS (CharExpr c) = "c#" ++ [c]+ prettyS (StringExpr str) = show str+ prettyS (BoolExpr True) = "#t"+ prettyS (BoolExpr False) = "#f"+ prettyS (IntegerExpr n) = show n+ prettyS (FloatExpr x) = show x+ prettyS (VarExpr name) = prettyS name+ prettyS (PartialVarExpr n) = "%" ++ show n+ prettyS (FunctionExpr args) = "(function [" ++ unwords (map prettyS args) ++ "])"+ prettyS (IndexedExpr True expr idxs) = prettyS expr ++ concatMap prettyS idxs+ prettyS (IndexedExpr False expr idxs) = prettyS expr ++ "..." ++ concatMap prettyS idxs+ prettyS (TupleExpr exprs) = "[" ++ unwords (map prettyS exprs) ++ "]"+ prettyS (CollectionExpr ls) = "{" ++ unwords (map prettyS ls) ++ "}"++ prettyS (UnaryOpExpr op e) = op ++ " " ++ prettyS e+ prettyS (BinaryOpExpr op e1 e2) = "(" ++ prettyS e1 ++ " " ++ prettyS op ++ " " ++ prettyS e2 ++ ")"++ prettyS (QuoteExpr e) = "'" ++ prettyS e+ prettyS (QuoteSymbolExpr e) = "`" ++ prettyS e++ prettyS (ApplyExpr fn (TupleExpr [])) = "(" ++ prettyS fn ++ ")"+ prettyS (ApplyExpr fn (TupleExpr args)) = "(" ++ prettyS fn ++ " " ++ unwords (map prettyS args) ++ ")"+ prettyS (ApplyExpr fn arg) = "(" ++ prettyS fn ++ " " ++ prettyS arg ++ ")"+ prettyS (VectorExpr xs) = "[| " ++ unwords (map prettyS xs) ++ " |]"+ prettyS (WithSymbolsExpr xs e) = "(withSymbols {" ++ unwords xs ++ "} " ++ prettyS e ++ ")"+ prettyS _ = "(not supported)"++instance PrettyS EgisonValue where+ prettyS (Char c) = "c#" ++ [c]+ prettyS (String str) = show str+ prettyS (Bool True) = "#t"+ prettyS (Bool False) = "#f"+ prettyS (ScalarData mExpr) = prettyS mExpr+ prettyS (TensorData (Tensor [_] xs js)) = "[| " ++ unwords (map prettyS (V.toList xs)) ++ " |]" ++ concatMap prettyS js+ prettyS (TensorData (Tensor [0, 0] _ js)) = "[| [| |] |]" ++ concatMap prettyS js+ prettyS (TensorData (Tensor [i, j] xs js)) = "[| " ++ f (fromIntegral j) (V.toList xs) ++ "|]" ++ concatMap prettyS js+ where+ f j [] = ""+ f j xs = "[| " ++ unwords (map prettyS (take j xs)) ++ " |] " ++ f j (drop j xs)+ prettyS (TensorData (Tensor ns xs js)) = "(tensor {" ++ unwords (map show ns) ++ "} {" ++ unwords (map prettyS (V.toList xs)) ++ "} )" ++ concatMap prettyS js+ prettyS (Float x) = show x+ prettyS (InductiveData name vals) = "<" ++ name ++ concatMap ((' ':) . prettyS) vals ++ ">"+ prettyS (Tuple vals) = "[" ++ unwords (map prettyS vals) ++ "]"+ prettyS (Collection vals) = "{" ++ unwords (map prettyS (toList vals)) ++ "}"+ prettyS (Array vals) = "(|" ++ unwords (map prettyS $ Array.elems vals) ++ "|)"+ prettyS (IntHash hash) = "{|" ++ unwords (map (\(key, val) -> "[" ++ show key ++ " " ++ prettyS val ++ "]") $ HashMap.toList hash) ++ "|}"+ prettyS (CharHash hash) = "{|" ++ unwords (map (\(key, val) -> "[" ++ show key ++ " " ++ prettyS val ++ "]") $ HashMap.toList hash) ++ "|}"+ prettyS (StrHash hash) = "{|" ++ unwords (map (\(key, val) -> "[" ++ show key ++ " " ++ prettyS val ++ "]") $ HashMap.toList hash) ++ "|}"+ prettyS UserMatcher{} = "#<user-matcher>"+ prettyS (Func Nothing _ args _) = "(lambda [" ++ unwords (map ('$':) args) ++ "] ...)"+ prettyS (Func (Just name) _ _ _) = prettyS name+ prettyS (PartialFunc _ n expr) = show n ++ "#" ++ prettyS expr+ prettyS (CFunc Nothing _ name _) = "(cambda " ++ name ++ " ...)"+ prettyS (CFunc (Just name) _ _ _) = prettyS name+ prettyS (MemoizedFunc Nothing _ _ _ names _) = "(memoized-lambda [" ++ unwords names ++ "] ...)"+ prettyS (MemoizedFunc (Just name) _ _ _ names _) = prettyS name+ prettyS (Proc Nothing _ names _) = "(procedure [" ++ unwords names ++ "] ...)"+ prettyS (Proc (Just name) _ _ _) = name+ prettyS (Macro names _) = "(macro [" ++ unwords names ++ "] ...)"+ prettyS PatternFunc{} = "#<pattern-function>"+ prettyS (PrimitiveFunc name _) = "#<primitive-function " ++ name ++ ">"+ prettyS (IOFunc _) = "#<io-function>"+ prettyS (QuotedFunc _) = "#<quoted-function>"+ prettyS (Port _) = "#<port>"+ prettyS Something = "something"+ prettyS Undefined = "undefined"+ prettyS World = "#<world>"+ prettyS EOF = "#<eof>"++instance PrettyS Var where+ prettyS = show++instance PrettyS VarWithIndices where+ prettyS = show++instance PrettyS EgisonBinOp where+ prettyS = show++instance PrettyS InnerExpr where+ prettyS (ElementExpr e) = prettyS e+ prettyS (SubCollectionExpr e) = '@' : prettyS e++instance PrettyS Arg where+ prettyS (ScalarArg name) = "$" ++ name+ prettyS (InvertedScalarArg name) = "*$" ++ name+ prettyS (TensorArg name) = "%" ++ name++instance PrettyS ScalarData where+ prettyS (Div p1 (Plus [Term 1 []])) = prettyS p1+ prettyS (Div p1 p2) = "(/ " ++ prettyS p1 ++ " " ++ prettyS p2 ++ ")"++instance PrettyS PolyExpr where+ prettyS (Plus []) = "0"+ prettyS (Plus [t]) = prettyS t+ prettyS (Plus ts) = "(+ " ++ unwords (map prettyS ts) ++ ")"++instance PrettyS TermExpr where+ prettyS (Term a []) = show a+ prettyS (Term 1 [x]) = showPoweredSymbol x+ prettyS (Term 1 xs) = "(* " ++ unwords (map showPoweredSymbol xs) ++ ")"+ prettyS (Term a xs) = "(* " ++ show a ++ " " ++ unwords (map showPoweredSymbol xs) ++ ")"++showPoweredSymbol :: (SymbolExpr, Integer) -> String+showPoweredSymbol (x, 1) = prettyS x+showPoweredSymbol (x, n) = prettyS x ++ "^" ++ show n++instance PrettyS SymbolExpr where+ prettyS (Symbol _ (':':':':':':_) []) = "#"+ prettyS (Symbol _ s []) = s+ prettyS (Symbol _ s js) = s ++ concatMap prettyS js+ prettyS (Apply fn mExprs) = "(" ++ prettyS fn ++ " " ++ unwords (map prettyS mExprs) ++ ")"+ prettyS (Quote mExprs) = "'" ++ prettyS mExprs+ prettyS (FunctionData Nothing argnames args js) = "(functionData [" ++ unwords (map prettyS argnames) ++ "])" ++ concatMap prettyS js+ prettyS (FunctionData (Just name) argnames args js) = prettyS name ++ concatMap prettyS js++showTSV :: EgisonValue -> String+showTSV (Tuple (val:vals)) = foldl (\r x -> r ++ "\t" ++ x) (prettyS val) (map prettyS vals)+showTSV (Collection vals) = intercalate "\t" (map prettyS (toList vals))+showTSV val = prettyS val++instance PrettyS (Index EgisonExpr) where+ prettyS (Superscript i) = "~" ++ prettyS i+ prettyS (Subscript i) = "_" ++ prettyS i+ prettyS (SupSubscript i) = "~_" ++ prettyS i+ prettyS (DFscript _ _) = ""+ prettyS (Userscript i) = "|" ++ prettyS i++instance PrettyS (Index ScalarData) where+ prettyS (Superscript i) = "~" ++ prettyS i+ prettyS (Subscript i) = "_" ++ prettyS i+ prettyS (SupSubscript i) = "~_" ++ prettyS i+ prettyS (DFscript _ _) = ""+ prettyS (Userscript i) = "|" ++ prettyS i++instance PrettyS (Index EgisonValue) where+ prettyS (Superscript i) = case i of+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "~[" ++ prettyS i ++ "]"+ _ -> "~" ++ prettyS i+ prettyS (Subscript i) = case i of+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ prettyS i ++ "]"+ _ -> "_" ++ prettyS i+ prettyS (SupSubscript i) = "~_" ++ prettyS i+ prettyS (DFscript i j) = "_d" ++ show i ++ show j+ prettyS (Userscript i) = case i of+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ prettyS i ++ "]"+ _ -> "|" ++ prettyS i++instance PrettyS EgisonPattern where+ prettyS WildCard = "_"+ prettyS (PatVar var) = "$" ++ prettyS var+ prettyS (ValuePat expr) = "," ++ prettyS expr+ prettyS (PredPat expr) = "?" ++ prettyS expr+ prettyS (IndexedPat pat exprs) = prettyS pat ++ concatMap (("_" ++) . prettyS) exprs+ prettyS (LetPat bexprs pat) =+ "(let {" ++ unwords (map (\(vars, expr) -> "[" ++ varsHelper vars ++ " " ++ prettyS expr ++ "]") bexprs) +++ "} " ++ prettyS pat ++ ")"+ where varsHelper [] = ""+ varsHelper [v] = "$" ++ prettyS v+ varsHelper vs = "[" ++ unwords (map (("$" ++) . prettyS) vs) ++ "]"+ prettyS (LaterPat pat) = "(later " ++ prettyS pat ++ ")"+ prettyS (NotPat pat) = "!" ++ prettyS pat+ prettyS (AndPat pats) = "(&" ++ concatMap ((" " ++) . prettyS) pats ++ ")"+ prettyS (OrPat pats) = "(|" ++ concatMap ((" " ++) . prettyS) pats ++ ")"+ prettyS (TuplePat pats) = "[" ++ unwords (map prettyS pats) ++ "]"+ prettyS (InductivePat name pats) = "<" ++ name ++ concatMap ((" " ++) . prettyS) pats ++ ">"+ prettyS (LoopPat var range pat endPat) = "(loop $" ++ unwords [prettyS var, prettyS range, prettyS pat, prettyS endPat] ++ ")"+ prettyS ContPat = "..."+ prettyS (PApplyPat expr pats) = "(" ++ unwords (prettyS expr : map prettyS pats) ++ ")"+ prettyS (VarPat name) = name+ prettyS SeqNilPat = "{}"+ prettyS (SeqConsPat pat pat') = "{" ++ prettyS pat ++ seqPatHelper pat' ++ "}"+ where seqPatHelper SeqNilPat = ""+ seqPatHelper (SeqConsPat pat pat') = " " ++ prettyS pat ++ seqPatHelper pat'+ seqPatHelper pat = " " ++ prettyS pat+ prettyS LaterPatVar = "#"++ prettyS (DApplyPat pat pats) = "(" ++ unwords (prettyS pat : map prettyS pats) ++ ")"+ prettyS (DivPat pat pat') = "(/ " ++ prettyS pat ++ " " ++ prettyS pat' ++ ")"+ prettyS (PlusPat pats) = "(+" ++ concatMap ((" " ++) . prettyS) pats+ prettyS (MultPat pats) = "(*" ++ concatMap ((" " ++) . prettyS) pats+ prettyS (PowerPat pat pat') = "(" ++ prettyS pat ++ " ^ " ++ prettyS pat' ++ ")"++instance PrettyS LoopRange where+ prettyS (LoopRange start (ApplyExpr (VarExpr (Var ["from"] [])) (ApplyExpr _ (TupleExpr (x:_)))) endPat) =+ "[" ++ show start ++ " (from " ++ show x ++ ") " ++ prettyS endPat ++ "]"+ prettyS (LoopRange start ends endPat) = "[" ++ show start ++ " " ++ show ends ++ " " ++ prettyS endPat ++ "]"
hs-src/Language/Egison/Primitives.hs view
@@ -42,8 +42,10 @@ import qualified Database.SQLite3 as SQLite --} -- for 'egison-sqlite' +import Language.Egison.AST import Language.Egison.Core import Language.Egison.Parser+import Language.Egison.Pretty import Language.Egison.Types primitiveEnv :: IO Env@@ -353,6 +355,27 @@ , ("assert", assert) , ("assertEqual", assertEqual)++ -- for old library compatibility+ , ("from-math-expr", fromScalarData)+ , ("to-math-expr", toScalarData)+ , ("to-math-expr'", toScalarData)+ , ("tensor-size", tensorSize')+ , ("tensor-to-list", tensorToList')+ , ("df-order", dfOrder')+ , ("uncons-string", unconsString)+ , ("length-string", lengthString)+ , ("append-string", appendString)+ , ("split-string", splitString)+ , ("regex-cg", regexStringCaptureGroup)+ , ("add-prime", addPrime)+ , ("add-subscript", addSubscript)+ , ("add-superscript", addSuperscript)+ , ("read-process", readProcess')+ , ("read-tsv", readTSV)+ , ("show-tsv", showTSV')+ , ("tensor-with-index?", isTensorWithIndex')+ , ("assert-equal", assertEqual) ] rationalUnaryOp :: (Rational -> Rational) -> PrimitiveFunc@@ -726,8 +749,7 @@ -- ioPrimitives :: [(String, PrimitiveFunc)]-ioPrimitives = [- ("return", return')+ioPrimitives = [ ("return", return') , ("open-input-file", makePort ReadMode) , ("open-output-file", makePort WriteMode) , ("close-input-port", closePort)@@ -755,8 +777,7 @@ -- For Non-S syntax ioPrimitives' :: [(String, PrimitiveFunc)]-ioPrimitives' = [- ("return", return')+ioPrimitives' = [ ("return", return') , ("openInputFile", makePort ReadMode) , ("openOutputFile", makePort WriteMode) , ("closeInputPort", closePort)@@ -779,7 +800,22 @@ , ("rand", randRange) , ("f.rand", randRangeDouble)--- , ("sqlite", sqlite)++ -- for S-expression library compatibility+ , ("open-input-file", makePort ReadMode)+ , ("open-output-file", makePort WriteMode)+ , ("close-input-port", closePort)+ , ("close-output-port", closePort)+ , ("read-char", readChar)+ , ("read-line", readLine)+ , ("write-char", writeChar)+ , ("read-char-from-port", readCharFromPort)+ , ("read-line-from-port", readLineFromPort)+ , ("write-char-to-port", writeCharToPort)+ , ("write-to-port", writeStringToPort)+ , ("eof-port?", isEOFPort)+ , ("flush-port", flushPort)+ , ("read-file", readFile') ] makeIO :: EgisonM EgisonValue -> EgisonValue
hs-src/Language/Egison/Types.hs view
@@ -1,12 +1,10 @@ {-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE UndecidableInstances #-}+ {- | Module : Language.Egison.Types Copyright : Satoshi Egi@@ -17,32 +15,15 @@ module Language.Egison.Types (- -- * Egison expressions- EgisonTopExpr (..)- , EgisonExpr (..)- , EgisonPattern (..)- , Arg (..)- , Index (..)- , InnerExpr (..)- , BindingExpr (..)- , MatchClause (..)- , PatternDef (..)- , LoopRange (..)- , PrimitivePatPattern (..)- , PrimitiveDataPattern (..)+ -- * Egison values+ EgisonValue (..) , Matcher (..) , PrimitiveFunc (..)- , EgisonData (..)- , showTSV- , EgisonBinOp(..)- , BinOpAssoc(..)- , reservedBinops- -- * Egison values- , EgisonValue (..) , ScalarData (..) , PolyExpr (..) , TermExpr (..) , SymbolExpr (..)+ , EgisonData (..) , Tensor (..) , HasTensor (..) -- * Tensor@@ -95,16 +76,14 @@ , EgisonWHNF (..) -- * Environment , Env (..)- , Var (..) , VarWithIndices (..) , Binding (..)- , Id , nullEnv , extendEnv , refVar+ , varToVarWithIndices -- * Pattern matching , Match- , PMMode (..) , MatchingTree (..) , MatchingState (..) , PatternBinding (..)@@ -155,12 +134,6 @@ , isCollection' , isArray' , isHash'- , readUTF8File- , stringToVar- , stringToVarExpr- , varToVarWithIndices- , EgisonOpts (..)- , defaultOption ) where import Prelude hiding (foldr, mappend, mconcat)@@ -178,7 +151,6 @@ import qualified Data.Array as Array import Data.Foldable (foldr, toList)-import Data.Hashable (Hashable) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap import Data.IORef@@ -190,234 +162,14 @@ import Data.List (any, delete, elem, elemIndex, find, findIndex, intercalate, partition, splitAt, (\\))-import Data.List.Split (splitOn) import Data.Text (Text)-import qualified Data.Text as T import Data.Ratio import System.IO import System.IO.Unsafe (unsafePerformIO) -import GHC.Generics (Generic)------- Expressions-----data EgisonTopExpr =- Define Var EgisonExpr- | Redefine Var EgisonExpr- | Test EgisonExpr- | Execute EgisonExpr- -- temporary : we will replace load to import and export- | LoadFile String- | Load String- deriving (Show, Eq)--data EgisonExpr =- CharExpr Char- | StringExpr Text- | BoolExpr Bool- | IntegerExpr Integer- | FloatExpr Double- | VarExpr Var- | FreshVarExpr- | IndexedExpr Bool EgisonExpr [Index EgisonExpr] -- True -> delete old index and append new one- | SubrefsExpr Bool EgisonExpr EgisonExpr- | SuprefsExpr Bool EgisonExpr EgisonExpr- | UserrefsExpr Bool EgisonExpr EgisonExpr- | PowerExpr EgisonExpr EgisonExpr -- TODO: delete this in v4.0.0- | InductiveDataExpr String [EgisonExpr]- | TupleExpr [EgisonExpr]- | CollectionExpr [InnerExpr] -- TODO: InnerExpr should be EgisonExpr from v4.0.0- | ArrayExpr [EgisonExpr]- | HashExpr [(EgisonExpr, EgisonExpr)]- | VectorExpr [EgisonExpr]-- | LambdaExpr [Arg] EgisonExpr- | LambdaArgExpr [Char]- | MemoizedLambdaExpr [String] EgisonExpr- | MemoizeExpr [(EgisonExpr, EgisonExpr, EgisonExpr)] EgisonExpr- | CambdaExpr String EgisonExpr- | ProcedureExpr [String] EgisonExpr- | MacroExpr [String] EgisonExpr- | PatternFunctionExpr [String] EgisonPattern-- | IfExpr EgisonExpr EgisonExpr EgisonExpr- | LetRecExpr [BindingExpr] EgisonExpr- | LetExpr [BindingExpr] EgisonExpr- | LetStarExpr [BindingExpr] EgisonExpr- | WithSymbolsExpr [String] EgisonExpr-- | MatchExpr EgisonExpr EgisonExpr [MatchClause]- | MatchDFSExpr EgisonExpr EgisonExpr [MatchClause]- | MatchAllExpr EgisonExpr EgisonExpr [MatchClause]- | MatchAllDFSExpr EgisonExpr EgisonExpr [MatchClause]- | MatchLambdaExpr EgisonExpr [MatchClause]- | MatchAllLambdaExpr EgisonExpr [MatchClause]-- | MatcherExpr [PatternDef]- | AlgebraicDataMatcherExpr [(String, [EgisonExpr])]-- | QuoteExpr EgisonExpr- | QuoteSymbolExpr EgisonExpr- | WedgeApplyExpr EgisonExpr EgisonExpr-- | DoExpr [BindingExpr] EgisonExpr- | IoExpr EgisonExpr-- | UnaryOpExpr String EgisonExpr- | BinaryOpExpr EgisonBinOp EgisonExpr EgisonExpr-- | SeqExpr EgisonExpr EgisonExpr- | ApplyExpr EgisonExpr EgisonExpr- | CApplyExpr EgisonExpr EgisonExpr- | PartialExpr Integer EgisonExpr- | PartialVarExpr Integer-- | GenerateArrayExpr EgisonExpr (EgisonExpr, EgisonExpr)- | ArrayBoundsExpr EgisonExpr- | ArrayRefExpr EgisonExpr EgisonExpr-- | GenerateTensorExpr EgisonExpr EgisonExpr- | TensorExpr EgisonExpr EgisonExpr EgisonExpr EgisonExpr- | TensorContractExpr EgisonExpr EgisonExpr- | TensorMapExpr EgisonExpr EgisonExpr- | TensorMap2Expr EgisonExpr EgisonExpr EgisonExpr- | TransposeExpr EgisonExpr EgisonExpr- | FlipIndicesExpr EgisonExpr-- | FunctionExpr [EgisonExpr]- | SymbolicTensorExpr [EgisonExpr] EgisonExpr String-- | SomethingExpr- | UndefinedExpr- deriving (Eq)--data Arg =- ScalarArg String- | InvertedScalarArg String- | TensorArg String- deriving (Eq)--data Index a =- Subscript a- | Superscript a- | SupSubscript a- | MultiSubscript a a- | MultiSuperscript a a- | DFscript Integer Integer -- DifferentialForm- | Userscript a- | DotSubscript a- | DotSupscript a- deriving (Eq, Generic)--data InnerExpr =- ElementExpr EgisonExpr- | SubCollectionExpr EgisonExpr- deriving (Show, Eq)--type BindingExpr = ([Var], EgisonExpr)-type MatchClause = (EgisonPattern, EgisonExpr)-type PatternDef = (PrimitivePatPattern, EgisonExpr, [(PrimitiveDataPattern, EgisonExpr)])---- TODO(momohatt): AndPat and OrPat take only 2 arguments in new syntax-data EgisonPattern =- WildCard- | PatVar Var- | ValuePat EgisonExpr- | PredPat EgisonExpr- | IndexedPat EgisonPattern [EgisonExpr]- | LetPat [BindingExpr] EgisonPattern- | LaterPat EgisonPattern- | NotPat EgisonPattern- | AndPat [EgisonPattern]- | OrPat [EgisonPattern]- | TuplePat [EgisonPattern]- | InductivePat String [EgisonPattern]- | LoopPat Var LoopRange EgisonPattern EgisonPattern- | ContPat- | PApplyPat EgisonExpr [EgisonPattern]- | VarPat String- | SeqNilPat- | SeqConsPat EgisonPattern EgisonPattern- | LaterPatVar- -- For symbolic computing- | DApplyPat EgisonPattern [EgisonPattern]- | DivPat EgisonPattern EgisonPattern- | PlusPat [EgisonPattern]- | MultPat [EgisonPattern]- | PowerPat EgisonPattern EgisonPattern- deriving Eq--data LoopRange = LoopRange EgisonExpr EgisonExpr EgisonPattern- deriving Eq--data PrimitivePatPattern =- PPWildCard- | PPPatVar- | PPValuePat String- | PPInductivePat String [PrimitivePatPattern]- | PPTuplePat [PrimitivePatPattern]- deriving (Show, Eq)--data PrimitiveDataPattern =- PDWildCard- | PDPatVar String- | PDInductivePat String [PrimitiveDataPattern]- | PDTuplePat [PrimitiveDataPattern]- | PDEmptyPat- | PDConsPat PrimitiveDataPattern PrimitiveDataPattern- | PDSnocPat PrimitiveDataPattern PrimitiveDataPattern- | PDConstantPat EgisonExpr- deriving (Show, Eq)--data EgisonBinOp- = EgisonBinOp { repr :: String -- syntastic representation- , func :: String -- semantics- , priority :: Int- , assoc :: BinOpAssoc- , isWedge :: Bool -- True if operator is prefixed with '!'- }- deriving (Eq, Ord)--data BinOpAssoc- = LeftAssoc- | RightAssoc- | NonAssoc- deriving (Eq, Ord)--instance Show EgisonBinOp where- show op = repr op--instance Show BinOpAssoc where- show LeftAssoc = "infixl"- show RightAssoc = "infixr"- show NonAssoc = "infix"--reservedBinops :: [EgisonBinOp]-reservedBinops =- [ makeBinOp "^" "**" 8 LeftAssoc- , makeBinOp "*" "*" 7 LeftAssoc- , makeBinOp "/" "/" 7 LeftAssoc- , makeBinOp "%" "remainder" 7 LeftAssoc- , makeBinOp "+" "+" 6 LeftAssoc- , makeBinOp "-" "-" 6 LeftAssoc- , makeBinOp "++" "append" 5 RightAssoc- , makeBinOp ":" "cons" 5 RightAssoc- , makeBinOp "==" "eq?" 4 LeftAssoc- , makeBinOp "<=" "lte?" 4 LeftAssoc- , makeBinOp ">=" "gte?" 4 LeftAssoc- , makeBinOp "<" "lt?" 4 LeftAssoc- , makeBinOp ">" "gt?" 4 LeftAssoc- , makeBinOp "&&" "and" 3 RightAssoc- , makeBinOp "||" "or" 2 RightAssoc- ]- where- makeBinOp r f p a =- EgisonBinOp { repr = r, func = f, priority = p, assoc = a, isWedge = False }-+import Language.Egison.AST -- -- Values@@ -454,6 +206,10 @@ | Undefined | EOF +type Matcher = EgisonValue++type PrimitiveFunc = WHNFData -> EgisonM WHNFData+ -- -- Scalar and Tensor Types --@@ -475,6 +231,8 @@ | FunctionData (Maybe EgisonValue) [EgisonValue] [EgisonValue] [Index ScalarData] -- fnname argnames args indices deriving (Eq) +type Id = String+ instance Eq PolyExpr where (Plus []) == (Plus []) = True (Plus (x:xs)) == (Plus ys) =@@ -1224,78 +982,46 @@ (hs, tms) = splitAt m hms -- [] [i] ms = tail tms -- [] in (hs, ms, ts) -- [] [] []+ -- -- -- -type Matcher = EgisonValue--type PrimitiveFunc = WHNFData -> EgisonM WHNFData--instance Show EgisonExpr where- show (CharExpr c) = "c#" ++ [c]- show (StringExpr str) = "\"" ++ T.unpack str ++ "\""- show (BoolExpr True) = "#t"- show (BoolExpr False) = "#f"- show (IntegerExpr n) = show n- show (FloatExpr x) = show x- show (VarExpr name) = show name- show (PartialVarExpr n) = "%" ++ show n- show (FunctionExpr args) = "(function [" ++ unwords (map show args) ++ "])"- show (IndexedExpr True expr idxs) = show expr ++ concatMap show idxs- show (IndexedExpr False expr idxs) = show expr ++ "..." ++ concatMap show idxs- show (TupleExpr exprs) = "[" ++ unwords (map show exprs) ++ "]"- show (CollectionExpr ls) = "{" ++ unwords (map show ls) ++ "}"-- show (UnaryOpExpr op e) = op ++ " " ++ show e- show (BinaryOpExpr op e1 e2) = "(" ++ show e1 ++ " " ++ show op ++ " " ++ show e2 ++ ")"-- show (QuoteExpr e) = "'" ++ show e- show (QuoteSymbolExpr e) = "`" ++ show e-- show (ApplyExpr fn (TupleExpr [])) = "(" ++ show fn ++ ")"- show (ApplyExpr fn (TupleExpr args)) = "(" ++ show fn ++ " " ++ unwords (map show args) ++ ")"- show (ApplyExpr fn arg) = "(" ++ show fn ++ " " ++ show arg ++ ")"- show (VectorExpr xs) = "[| " ++ unwords (map show xs) ++ " |]"- show (WithSymbolsExpr xs e) = "(withSymbols {" ++ unwords (map show xs) ++ "} " ++ show e ++ ")"- show _ = "(not supported)"- instance Show EgisonValue where- show (Char c) = "c#" ++ [c]- show (String str) = "\"" ++ T.unpack str ++ "\""- show (Bool True) = "#t"- show (Bool False) = "#f"+ show (Char c) = '\'' : c : "'"+ show (String str) = show str+ show (Bool True) = "True"+ show (Bool False) = "False" show (ScalarData mExpr) = show mExpr--- show (TensorData (Scalar x)) = "invalid scalar:" ++ show x- show (TensorData (Tensor [_] xs js)) = "[| " ++ unwords (map show (V.toList xs)) ++ " |]" ++ concatMap show js+ show (TensorData (Tensor [_] xs js)) = "[| " ++ intercalate ", " (map show (V.toList xs)) ++ " |]" ++ concatMap show js show (TensorData (Tensor [0, 0] _ js)) = "[| [| |] |]" ++ concatMap show js- show (TensorData (Tensor [i, j] xs js)) = "[| " ++ f (fromIntegral j) (V.toList xs) ++ "|]" ++ concatMap show js- where- f j [] = ""- f j xs = "[| " ++ unwords (map show (take j xs)) ++ " |] " ++ f j (drop j xs)- show (TensorData (Tensor ns xs js)) = "(tensor {" ++ unwords (map show ns) ++ "} {" ++ unwords (map show (V.toList xs)) ++ "} )" ++ concatMap show js+ show (TensorData (Tensor [i, j] xs js)) = "[| " ++ intercalate ", " (f (fromIntegral j) (V.toList xs)) ++ " |]" ++ concatMap show js+ where+ f j [] = []+ f j xs = ["[| " ++ intercalate ", " (map show (take j xs)) ++ " |]"] ++ f j (drop j xs)+ show (TensorData (Tensor ns xs js)) = "(tensor [" ++ intercalate ", " (map show ns) ++ "] [" ++ intercalate ", " (map show (V.toList xs)) ++ "] )" ++ concatMap show js show (Float x) = show x- show (InductiveData name []) = "<" ++ name ++ ">"- show (InductiveData name vals) = "<" ++ name ++ " " ++ unwords (map show vals) ++ ">"- show (Tuple vals) = "[" ++ unwords (map show vals) ++ "]"- show (Collection vals) = if Sq.null vals- then "{}"- else "{" ++ unwords (map show (toList vals)) ++ "}"- show (Array vals) = "(|" ++ unwords (map show $ Array.elems vals) ++ "|)"- show (IntHash hash) = "{|" ++ unwords (map (\(key, val) -> "[" ++ show key ++ " " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}"- show (CharHash hash) = "{|" ++ unwords (map (\(key, val) -> "[" ++ show key ++ " " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}"- show (StrHash hash) = "{|" ++ unwords (map (\(key, val) -> "[\"" ++ T.unpack key ++ "\" " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}"+ show (InductiveData name vals) = name ++ concatMap ((' ':) . show') vals+ where+ show' x | isAtomic x = show x+ | otherwise = "(" ++ show x ++ ")"+ show (Tuple vals) = "(" ++ intercalate ", " (map show vals) ++ ")"+ show (Collection vals) = "[" ++ intercalate ", " (map show (toList vals)) ++ "]"+ show (Array vals) = "(| " ++ intercalate ", " (map show $ Array.elems vals) ++ " |)"+ show (IntHash hash) = "{|" ++ intercalate ", " (map (\(key, val) -> "[" ++ show key ++ ", " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}"+ show (CharHash hash) = "{|" ++ intercalate ", " (map (\(key, val) -> "[" ++ show key ++ ", " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}"+ show (StrHash hash) = "{|" ++ intercalate ", " (map (\(key, val) -> "[" ++ show key ++ ", " ++ show val ++ "]") $ HashMap.toList hash) ++ "|}" show UserMatcher{} = "#<user-matcher>"- show (Func Nothing _ args _) = "(lambda [" ++ unwords (map show args) ++ "] ...)"+ show (Func Nothing _ args _) = "(lambda [" ++ intercalate ", " (map show args) ++ "] ...)" show (Func (Just name) _ _ _) = show name show (PartialFunc _ n expr) = show n ++ "#" ++ show expr show (CFunc Nothing _ name _) = "(cambda " ++ name ++ " ...)" show (CFunc (Just name) _ _ _) = show name- show (MemoizedFunc Nothing _ _ _ names _) = "(memoized-lambda [" ++ unwords names ++ "] ...)"+ show (MemoizedFunc Nothing _ _ _ names _) = "(memoized-lambda [" ++ intercalate ", " names ++ "] ...)" show (MemoizedFunc (Just name) _ _ _ names _) = show name- show (Proc Nothing _ names _) = "(procedure [" ++ unwords names ++ "] ...)"+ show (Proc Nothing _ names _) = "(procedure [" ++ intercalate ", " names ++ "] ...)" show (Proc (Just name) _ _ _) = name- show (Macro names _) = "(macro [" ++ unwords names ++ "] ...)"+ show (Macro names _) = "(macro [" ++ intercalate ", " names ++ "] ...)" show PatternFunc{} = "#<pattern-function>" show (PrimitiveFunc name _) = "#<primitive-function " ++ name ++ ">" show (IOFunc _) = "#<io-function>"@@ -1306,25 +1032,30 @@ show World = "#<world>" show EOF = "#<eof>" -instance Show Arg where- show (ScalarArg name) = "$" ++ name- show (InvertedScalarArg name) = "*$" ++ name- show (TensorArg name) = "%" ++ name+-- False if we have to put parenthesis around it to make it an atomic expression.+isAtomic :: EgisonValue -> Bool+isAtomic (InductiveData _ []) = True+isAtomic (InductiveData _ _) = False+isAtomic (ScalarData (Div (Plus [Term _ []]) (Plus [Term 1 []]))) = True+isAtomic (ScalarData _) = False+isAtomic _ = True instance Show ScalarData where show (Div p1 (Plus [Term 1 []])) = show p1- show (Div p1 p2) = "(/ " ++ show p1 ++ " " ++ show p2 ++ ")"+ show (Div p1 p2) = show' p1 ++ " / " ++ show' p2+ where+ show' :: PolyExpr -> String+ show' p@(Plus [_]) = show p+ show' p = "(" ++ show p ++ ")" instance Show PolyExpr where show (Plus []) = "0"- show (Plus [t]) = show t- show (Plus ts) = "(+ " ++ unwords (map show ts) ++ ")"+ show (Plus ts) = intercalate " + " (map show ts) instance Show TermExpr where show (Term a []) = show a- show (Term 1 [x]) = showPoweredSymbol x- show (Term 1 xs) = "(* " ++ unwords (map showPoweredSymbol xs) ++ ")"- show (Term a xs) = "(* " ++ show a ++ " " ++ unwords (map showPoweredSymbol xs) ++ ")"+ show (Term 1 xs) = intercalate " * " (map showPoweredSymbol xs)+ show (Term a xs) = intercalate " * " (show a : map showPoweredSymbol xs) showPoweredSymbol :: (SymbolExpr, Integer) -> String showPoweredSymbol (x, 1) = show x@@ -1339,11 +1070,6 @@ show (FunctionData Nothing argnames args js) = "(functionData [" ++ unwords (map show argnames) ++ "])" ++ concatMap show js show (FunctionData (Just name) argnames args js) = show name ++ concatMap show js -showTSV :: EgisonValue -> String-showTSV (Tuple (val:vals)) = foldl (\r x -> r ++ "\t" ++ x) (show val) (map show vals)-showTSV (Collection vals) = intercalate "\t" (map show (toList vals))-showTSV val = show val- instance Eq EgisonValue where (Char c) == (Char c') = c == c' (String str) == (String str') = str == str'@@ -1367,45 +1093,6 @@ (Macro xs1 expr1) == (Macro xs2 expr2) = (xs1 == xs2) && (expr1 == expr2) _ == _ = False -instance Show EgisonPattern where- show WildCard = "_"- show (PatVar var) = "$" ++ show var- show (ValuePat expr) = "," ++ show expr- show (PredPat expr) = "?" ++ show expr- show (IndexedPat pat exprs) = show pat ++ concatMap (("_" ++) . show) exprs- show (LetPat bexprs pat) = "(let {" ++ unwords (map (\(vars, expr) -> "[" ++ showVarsHelper vars ++ " " ++ show expr ++ "]") bexprs) ++- "} " ++ show pat ++ ")"- where showVarsHelper [] = ""- showVarsHelper [v] = "$" ++ show v- showVarsHelper vs = "[" ++ unwords (map (("$" ++) . show) vs) ++ "]"- show (LaterPat pat) = "(later " ++ show pat ++ ")"- show (NotPat pat) = "!" ++ show pat- show (AndPat pats) = "(&" ++ concatMap ((" " ++) . show) pats ++ ")"- show (OrPat pats) = "(|" ++ concatMap ((" " ++) . show) pats ++ ")"- show (TuplePat pats) = "[" ++ unwords (map show pats) ++ "]"- show (InductivePat name pats) = "<" ++ name ++ concatMap ((" " ++) . show) pats ++ ">"- show (LoopPat var range pat endPat) = "(loop $" ++ unwords [show var, show range, show pat, show endPat] ++ ")"- show ContPat = "..."- show (PApplyPat expr pats) = "(" ++ unwords (show expr : map show pats) ++ ")"- show (VarPat name) = name- show SeqNilPat = "{}"- show (SeqConsPat pat pat') = "{" ++ show pat ++ showSeqPatHelper pat' ++ "}"- where showSeqPatHelper SeqNilPat = ""- showSeqPatHelper (SeqConsPat pat pat') = " " ++ show pat ++ showSeqPatHelper pat'- showSeqPatHelper pat = " " ++ show pat- show LaterPatVar = "#"-- show (DApplyPat pat pats) = "(" ++ unwords (show pat : map show pats) ++ ")"- show (DivPat pat pat') = "(/ " ++ show pat ++ " " ++ show pat' ++ ")"- show (PlusPat pats) = "(+" ++ concatMap ((" " ++) . show) pats- show (MultPat pats) = "(*" ++ concatMap ((" " ++) . show) pats- show (PowerPat pat pat') = "(" ++ show pat ++ " ^ " ++ show pat' ++ ")"--instance Show LoopRange where- show (LoopRange start (ApplyExpr (VarExpr (Var ["from"] [])) (ApplyExpr _ (TupleExpr (x:_)))) endPat) =- "[" ++ show start ++ " (from " ++ show x ++ ") " ++ show endPat ++ "]"- show (LoopRange start ends endPat) = "[" ++ show start ++ " " ++ show ends ++ " " ++ show endPat ++ "]"- -- -- Egison data and Haskell data --@@ -1451,7 +1138,7 @@ fromEgison (Port h) = return h fromEgison val = throwError =<< TypeMismatch "port" (Value val) <$> getFuncNameStack -instance (EgisonData a) => EgisonData [a] where+instance EgisonData a => EgisonData [a] where toEgison xs = Collection $ Sq.fromList (map toEgison xs) fromEgison (Collection seq) = mapM fromEgison (toList seq) fromEgison val = throwError =<< TypeMismatch "collection" (Value val) <$> getFuncNameStack@@ -1536,7 +1223,7 @@ -- -- Extract data from WHNF ---class (EgisonData a) => EgisonWHNF a where+class EgisonData a => EgisonWHNF a where toWHNF :: a -> WHNFData fromWHNF :: WHNFData -> EgisonM a toWHNF = Value . toEgison@@ -1577,65 +1264,32 @@ data Env = Env [HashMap Var ObjectRef] (Maybe VarWithIndices) deriving (Show) -data Var = Var [String] [Index ()]- deriving (Eq, Generic)- data VarWithIndices = VarWithIndices [String] [Index String] deriving (Eq) -instance Hashable (Index ())-instance Hashable Var- type Binding = (Var, ObjectRef) -type Id = String--instance Show Var where- show (Var xs is) = intercalate "." xs ++ concatMap show is--instance Show VarWithIndices where- show (VarWithIndices xs is) = intercalate "." xs ++ concatMap show is--instance Show (Index ()) where- show (Superscript ()) = "~"- show (Subscript ()) = "_"- show (SupSubscript ()) = "~_"- show (DFscript _ _) = ""- show (Userscript _) = "|"--instance Show (Index String) where- show (Superscript s) = "~" ++ s- show (Subscript s) = "_" ++ s- show (SupSubscript s) = "~_" ++ s- show (DFscript _ _) = ""- show (Userscript i) = "|" ++ show i--instance Show (Index EgisonExpr) where- show (Superscript i) = "~" ++ show i- show (Subscript i) = "_" ++ show i- show (SupSubscript i) = "~_" ++ show i- show (DFscript _ _) = ""- show (Userscript i) = "|" ++ show i- instance Show (Index ScalarData) where show (Superscript i) = "~" ++ show i show (Subscript i) = "_" ++ show i show (SupSubscript i) = "~_" ++ show i show (DFscript _ _) = "" show (Userscript i) = "|" ++ show i+instance Show VarWithIndices where+ show (VarWithIndices xs is) = intercalate "." xs ++ concatMap show is instance Show (Index EgisonValue) where show (Superscript i) = case i of- ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "~[" ++ show i ++ "]"- _ -> "~" ++ show i+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "~[" ++ show i ++ "]"+ _ -> "~" ++ show i show (Subscript i) = case i of- ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ show i ++ "]"- _ -> "_" ++ show i+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ show i ++ "]"+ _ -> "_" ++ show i show (SupSubscript i) = "~_" ++ show i show (DFscript i j) = "_d" ++ show i ++ show j show (Userscript i) = case i of- ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ show i ++ "]"- _ -> "|" ++ show i+ ScalarData (Div (Plus [Term 1 [(Symbol id name (a:indices), 1)]]) (Plus [Term 1 []])) -> "_[" ++ show i ++ "]"+ _ -> "|" ++ show i nullEnv :: Env nullEnv = Env [] Nothing@@ -1646,15 +1300,20 @@ refVar :: Env -> Var -> Maybe ObjectRef refVar (Env env _) var = msum $ map (HashMap.lookup var) env +varToVarWithIndices :: Var -> VarWithIndices+varToVarWithIndices (Var xs is) = VarWithIndices xs $ map f is+ where+ f :: Index () -> Index String+ f (Superscript ()) = Superscript ""+ f (Subscript ()) = Subscript ""+ f (SupSubscript ()) = SupSubscript ""+ -- -- Pattern Match -- type Match = [Binding] -data PMMode = BFSMode | DFSMode- deriving (Show)- data MatchingState = MState Env [LoopPatContext] [SeqPatContext] [Binding] [MatchingTree] instance Show MatchingState where@@ -1691,7 +1350,6 @@ | NotImplemented String CallStack | Assertion String CallStack | Parser String- | ParserUnexpectedEOF | EgisonBug String CallStack | MatchFailure String CallStack | Default String@@ -1714,7 +1372,6 @@ show (NotImplemented message stack) = "Not implemented: " ++ message ++ showTrace stack show (Assertion message stack) = "Assertion failed: " ++ message ++ showTrace stack show (Parser err) = "Parse error at: " ++ err- show ParserUnexpectedEOF = "Parser error: unexpected end of input" show (EgisonBug message stack) = "Egison Error: " ++ message ++ showTrace stack show (MatchFailure currentFunc stack) = "Failed pattern match in: " ++ currentFunc ++ showTrace stack show (Default message) = "Error: " ++ message@@ -1855,6 +1512,9 @@ runFresh :: RuntimeState -> Fresh a -> (a, RuntimeState) runFresh seed m = runIdentity $ flip runStateT seed $ unFreshT m +--+-- MList+-- type MatchM = MaybeT EgisonM @@ -1899,7 +1559,9 @@ mfor :: Monad m => MList m a -> (a -> m b) -> m (MList m b) mfor = flip mmap +-- -- Typing+-- isBool :: EgisonValue -> Bool isBool (Bool _) = True@@ -1985,50 +1647,3 @@ isHash' (Intermediate (IIntHash _)) = return $ Value $ Bool True isHash' (Intermediate (IStrHash _)) = return $ Value $ Bool True isHash' _ = return $ Value $ Bool False--readUTF8File :: FilePath -> IO String-readUTF8File name = do- h <- openFile name ReadMode- hSetEncoding h utf8- hGetContents h--stringToVar :: String -> Var-stringToVar name = Var (splitOn "." name) []--stringToVarExpr :: String -> EgisonExpr-stringToVarExpr = VarExpr . stringToVar--varToVarWithIndices :: Var -> VarWithIndices-varToVarWithIndices (Var xs is) = VarWithIndices xs $ map f is- where- f :: Index () -> Index String- f (Superscript ()) = Superscript ""- f (Subscript ()) = Subscript ""- f (SupSubscript ()) = SupSubscript ""------- options-----data EgisonOpts = EgisonOpts {- optExecFile :: Maybe (String, [String]),- optShowVersion :: Bool,- optEvalString :: Maybe String,- optExecuteString :: Maybe String,- optFieldInfo :: [(String, String)],- optLoadLibs :: [String],- optLoadFiles :: [String],- optSubstituteString :: Maybe String,- optMapTsvInput :: Maybe String,- optFilterTsvInput :: Maybe String,- optTsvOutput :: Bool,- optNoIO :: Bool,- optShowBanner :: Bool,- optTestOnly :: Bool,- optPrompt :: String,- optMathExpr :: Maybe String,- optSExpr :: Bool- }--defaultOption :: EgisonOpts-defaultOption = EgisonOpts Nothing False Nothing Nothing [] [] [] Nothing Nothing Nothing False False True False "> " Nothing True
hs-src/Language/Egison/Util.hs view
@@ -17,9 +17,10 @@ import System.Console.Haskeline.History (addHistoryUnlessConsecutiveDupe) import Text.Regex.TDFA ((=~)) +import Language.Egison.AST+import Language.Egison.CmdOptions import Language.Egison.Parser as Parser import Language.Egison.ParserNonS as ParserNonS-import Language.Egison.Types -- |Get Egison expression from the prompt. We can handle multiline input. getEgisonExpr :: EgisonOpts -> InputT IO (Maybe (String, EgisonTopExpr))
hs-src/Tool/translator.hs view
@@ -10,7 +10,7 @@ import Data.Text.Prettyprint.Doc.Render.Text (putDoc) import System.Environment (getArgs) -import Language.Egison.Types+import Language.Egison.AST import Language.Egison.Parser import Language.Egison.Pretty @@ -52,16 +52,14 @@ toNonS (IfExpr x y z) = IfExpr (toNonS x) (toNonS y) (toNonS z) toNonS (LetRecExpr xs y) = LetRecExpr (map toNonS xs) (toNonS y)- toNonS (LetExpr xs y) = LetExpr (map toNonS xs) (toNonS y)- toNonS (LetStarExpr xs y) = LetStarExpr (map toNonS xs) (toNonS y)+ toNonS (LetExpr xs y) = LetRecExpr (map toNonS xs) (toNonS y)+ toNonS (LetStarExpr xs y) = LetRecExpr (map toNonS xs) (toNonS y) toNonS (WithSymbolsExpr xs y) = WithSymbolsExpr xs (toNonS y) - toNonS (MatchExpr x y zs) = MatchExpr (toNonS x) (toNonS y) (map toNonS zs)- toNonS (MatchDFSExpr x y zs) = MatchDFSExpr (toNonS x) (toNonS y) (map toNonS zs)- toNonS (MatchAllExpr x y zs) = MatchAllExpr (toNonS x) (toNonS y) (map toNonS zs)- toNonS (MatchAllDFSExpr x y zs) = MatchAllDFSExpr (toNonS x) (toNonS y) (map toNonS zs)- toNonS (MatchLambdaExpr x ys) = MatchLambdaExpr (toNonS x) (map toNonS ys)- toNonS (MatchAllLambdaExpr x ys) = MatchAllLambdaExpr (toNonS x) (map toNonS ys)+ toNonS (MatchExpr pmmode x y zs) = MatchExpr pmmode (toNonS x) (toNonS y) (map toNonS zs)+ toNonS (MatchAllExpr pmmode x y zs) = MatchAllExpr pmmode (toNonS x) (toNonS y) (map toNonS zs)+ toNonS (MatchLambdaExpr x ys) = MatchLambdaExpr (toNonS x) (map toNonS ys)+ toNonS (MatchAllLambdaExpr x ys) = MatchAllLambdaExpr (toNonS x) (map toNonS ys) toNonS (MatcherExpr xs) = MatcherExpr (map toNonS xs) @@ -72,10 +70,12 @@ toNonS (DoExpr xs y) = DoExpr (map toNonS xs) (toNonS y) toNonS (IoExpr x) = IoExpr (toNonS x) - toNonS (ApplyExpr x@(VarExpr (Var [f] [])) (TupleExpr [y, z])) =- case find (\op -> repr op == f) reservedBinops of- Just op -> BinaryOpExpr op (toNonS y) (toNonS z)- Nothing -> ApplyExpr x (TupleExpr [toNonS y, toNonS z])+ toNonS (ApplyExpr x@(VarExpr (Var [f] [])) (TupleExpr (y:ys)))+ | any (\op -> repr op == f) reservedBinops =+ foldl (\acc x -> BinaryOpExpr op acc (toNonS x)) (toNonS y) ys+ where+ op = fromJust $ find (\op -> repr op == f) reservedBinops+ toNonS (ApplyExpr x y) = ApplyExpr (toNonS x) (toNonS y) toNonS x = x
+ lib/core/sexpr.egi view
@@ -0,0 +1,6 @@+(define $unorderedPair unordered-pair)+(define $takeAndDrop take-and-drop)+(define $takeWhile take-while)+(define $dropWhile drop-while)+(define $deleteFirst delete-first)+(define $deleteFirst/m delete-first/m)
+ nons-test/test/dp.egi view
@@ -0,0 +1,47 @@+literal := integer++deleteLiteral l cnf :=+ map (\matchAll as multiset integer with+ | (!#l & $x) :: _ -> x)+ cnf++deleteClausesWith l cnf :=+ matchAll cnf as multiset (multiset integer) with+ | (!(#l :: _) & $c) :: _ -> c++assignTrue l cnf :=+ deleteLiteral (neg l) (deleteClausesWith l cnf)++resolveOn v cnf :=+ matchAll cnf as multiset (multiset integer) with+ | {(#v :: (@ & $xs)) :: (#(neg v) :: (@ & $ys)) :: _,+ !($l :: _, #(neg l) :: _)}+ -> unique (xs ++ ys)++dp vars cnf :=+ match (vars, cnf) as (multiset literal, multiset (multiset literal)) with+ -- satisfiable+ | (_, []) -> True+ -- unsatisfiable+ | (_, [] :: _) -> False+ -- 1-literal rule+ | (_, (($l :: []) :: _))+ -> dp (delete (abs l) vars) (assignTrue l cnf)+ -- pure literal rule (positive)+ | ($v :: $vs, !((#(neg v) :: _) :: _))+ -> dp vs (assignTrue v cnf)+ -- pure literal rule (negative)+ | ($v :: $vs, !((#v :: _) :: _))+ -> dp vs (assignTrue (neg v) cnf)+ -- otherwise+ | ($v :: $vs, _)+ -> dp vs (resolveOn v cnf +++ deleteClausesWith v (deleteClausesWith (neg v) cnf))++dp [1] [[1]] -- True+dp [1] [[1],[-1]] -- False+dp [1,2,3] [[1,2],[-1,3],[1,-3]] -- True+dp [1,2] [[1,2],[-1,-2],[1,-2]] -- True+dp [1,2] [[1,2],[-1,-2],[1,-2],[-1,2]] -- False+dp [1,2,3,4,5] [[-1,-2,3],[-1,-2,-3],[1,2,3,4],[-4,-2,3],[5,1,2,-3],[-3,1,-5],[1,-2,3,4],[1,-2,-3,5]] -- True+dp [1,2] [[-1,-2],[1]] -- True
nons-test/test/lib/core/base.egi view
@@ -35,9 +35,7 @@ assertEqual "compose - case 2" ((compose (fst, snd, fst)) ((1, (2, 3)), 4)) 2 --- assertEqual("eq?/m",--- eq?/m(integer, 1, 1),--- True)+assertEqual "eq?/m" (eq?/m integer 1 1) True -- -- Booleans@@ -53,3 +51,12 @@ assertEqual "not" [not True, not False] [False, True]++--+-- Unordered-Pair+--++assertEqual "unorderedPair matcher"+ (match (1, 2) as unorderedPair integer with+ | (#2, $x) -> x)+ 1
nons-test/test/lib/core/order.egi view
@@ -14,22 +14,22 @@ (min [20, 5]) 5 --- assertEqual "min/fn"--- (min/fn compare [10, 20, 5, 20, 30])--- 5+assertEqual "min/fn"+ (min/fn compare [10, 20, 5, 20, 30])+ 5 assertEqual "max" (max [5, 30]) 30 --- assertEqual "max/fn"--- (max/fn compare [10, 20, 5, 20, 30])--- 30+assertEqual "max/fn"+ (max/fn compare [10, 20, 5, 20, 30])+ 30 assertEqual "sort" (sort [10, 20, 5, 20, 30]) [5, 10, 20, 20, 30] --- assertEqual "sort/fn"--- (sort/fn compare [10, 20, 5, 20, 30])--- [5, 10, 20, 20, 30]+assertEqual "sort/fn"+ (sort/fn compare [10, 20, 5, 20, 30])+ [5, 10, 20, 20, 30]
+ nons-test/test/poker.egi view
@@ -0,0 +1,39 @@+suit := algebraicDataMatcher+ | spade+ | heart+ | club+ | diamond++card := algebraicDataMatcher+ | card suit (mod 13)++poker cs :=+ match cs as multiset card with+ | card $s $n :: card #s #(n-1) :: card #s #(n-2) :: card #s #(n-3) :: card #s #(n-4) :: _+ -> "Straight flush"+ | card _ $n :: card _ #n :: card _ #n :: card _ #n :: _ :: []+ -> "Four of a kind"+ | card _ $m :: card _ #m :: card _ #m :: card _ $n :: card _ #n :: []+ -> "Full house"+ | card $s _ :: card #s _ :: card #s _ :: card #s _ :: card #s _ :: []+ -> "Flush"+ | card _ $n :: card _ #(n-1) :: card _ #(n-2) :: card _ #(n-3) :: card _ #(n-4) :: []+ -> "Straight"+ | card _ $n :: card _ #n :: card _ #n :: _ :: _ :: []+ -> "Three of a kind"+ | card _ $m :: card _ #m :: card _ $n :: card _ #n :: _ :: []+ -> "Two pair"+ | card _ $n :: card _ #n :: _ :: _ :: _ :: []+ -> "One pair"+ | _ :: _ :: _ :: _ :: _ :: [] -> "Nothing"+++poker [Card Spade 5, Card Spade 6, Card Spade 7, Card Spade 8, Card Spade 9] -- "Straight flush"+poker [Card Spade 5, Card Diamond 5, Card Spade 7, Card Club 5, Card Heart 5] -- "Four of a kind"+poker [Card Spade 5, Card Diamond 5, Card Spade 7, Card Club 5, Card Heart 7] -- "Full house"+poker [Card Spade 5, Card Spade 6, Card Spade 7, Card Spade 13, Card Spade 9] -- "Flush"+poker [Card Spade 5, Card Club 6, Card Spade 7, Card Spade 8, Card Spade 9] -- "Straight"+poker [Card Spade 5, Card Diamond 5, Card Spade 7, Card Club 5, Card Heart 8] -- "Three of a kind"+poker [Card Spade 5, Card Diamond 10, Card Spade 7, Card Club 5, Card Heart 10] -- "Two pair"+poker [Card Spade 5, Card Diamond 10, Card Spade 7, Card Club 5, Card Heart 8] -- "One pair"+poker [Card Spade 5, Card Spade 6, Card Spade 7, Card Spade 8, Card Diamond 11] -- "Nothing"
nons-test/test/primitive.egi view
@@ -128,7 +128,7 @@ assertEqual "show" (show 3) "3" assertEqual "show" (show 3.14159) "3.14159"-assertEqual "show" (show [1, 2]) "{1 2}"+assertEqual "show" (show [1, 2]) "[1, 2]" assertEqual "show" (show "Hello world!") "\"Hello world!\"" -- TODO: show-tsv@@ -164,7 +164,7 @@ assertEqual "array?" (array? (| 1, 2, 3 |)) True assertEqual "hash?" (hash? {| |}) True-assertEqual "hash?" (hash? {| [1, 2] |}) True+assertEqual "hash?" (hash? {| (1, 2) |}) True -- TODO: Add a test case where tensor? returns True assertEqual "tensor?" (tensor? 1) False
nons-test/test/syntax.egi view
@@ -51,20 +51,20 @@ False assertEqual "let binding"- (let t = (1, 2)- (x, y) = t+ (let t := (1, 2)+ (x, y) := t in x + y) 3 assertEqual "let binding"- (let x = 1- y = x + 1+ (let x := 1+ y := x + 1 in y) 2 assertEqual "mutual recursion"- (let even? n = if n == 0 then True else odd? (n - 1)- odd? n = if n == 0 then False else even? (n - 1)+ (let even? n := if n = 0 then True else odd? (n - 1)+ odd? n := if n = 0 then False else even? (n - 1) in even? 10) True @@ -86,32 +86,40 @@ assertEqual "point free expr" ((10 - ) 1) 9 assertEqual "not point free expr" (- 2) (1 - 3) --- findFactor = memoizedLambda+-- findFactor := memoizedLambda -- n -> match takeWhile (<= floor (sqrt (itof n))) primes as list integer with--- | _ ++ (?(\m -> divisor? n m) && $x) : _ -> x+-- | _ ++ (?(\m -> divisor? n m) & $x) :: _ -> x -- | _ -> n -- assertEqual "memoized lambda" -- (map findFactor [1..10]) -- [1, 2, 3, 2, 5, 2, 7, 2, 3, 2] -twinPrimes =+twinPrimes := matchAll primes as list integer with- | _ ++ $p : #(p + 2) : _ -> (p, p + 2)+ | _ ++ $p :: #(p + 2) :: _ -> (p, p + 2) assertEqual "twin primes" (take 10 twinPrimes) [(3, 5), (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61), (71, 73), (101, 103), (107, 109)] -someFunction x y z =+primeTriplets :=+ matchAll primes as list integer with+ | _ ++ $p :: ((#(p + 2) | #(p + 4)) & $m) :: #(p + 6) :: _ -> (p, m, p + 6)++assertEqual "prime triplets"+ (take 10 primeTriplets)+ [(5, 7, 11), (7, 11, 13), (11, 13, 17), (13, 17, 19), (17, 19, 23), (37, 41, 43), (41, 43, 47), (67, 71, 73), (97, 101, 103), (101, 103, 107)]++someFunction x y z := x + y * z assertEqual "function definition" (someFunction 1 2 3) 7 -gcd m n =+gcd m n := if (m >= n) then- if (n == 0) then m+ if (n = 0) then m else gcd n (m % n) else gcd n m @@ -131,39 +139,39 @@ assertEqual "match-all" (matchAll [1, 2, 3] as multiset integer with- | $x : _ -> x)+ | $x :: _ -> x) [1, 2, 3] assertEqual "match-all-multi" (matchAll [1, 2, 3] as multiset integer with- | $x : #(x + 1) : _ -> [x, x + 1]- | $x : #(x + 2) : _ -> [x, x + 2])+ | $x :: #(x + 1) :: _ -> [x, x + 1]+ | $x :: #(x + 2) :: _ -> [x, x + 2]) [[1, 2], [2, 3], [1, 3]] assertEqual "match-lambda" ((\match as list integer with | [] -> 0- | $x : _ -> x) [1, 2, 3])+ | $x :: _ -> x) [1, 2, 3]) 1 assertEqual "match-all-lambda" ((\matchAll as list something with- | _ ++ $x : _ -> x) [1, 2, 3])+ | _ ++ $x :: _ -> x) [1, 2, 3]) [1, 2, 3] assertEqual "match-all-lambda-multi" ((\matchAll as multiset something with- | $x : #(x + 1) : _ -> [x, x + 1]- | $x : #(x + 2) : _ -> [x, x + 2]) [1, 2, 3])+ | $x :: #(x + 1) :: _ -> [x, x + 1]+ | $x :: #(x + 2) :: _ -> [x, x + 2]) [1, 2, 3]) [[1, 2], [2, 3], [1, 3]] assert "nested pattern match" (match [1, 2, 3] as list integer with- | #2 : $x -> match x as multiset integer with+ | #2 :: $x -> match x as multiset integer with | _ -> False- | #1 : $x -> match x as multiset integer with- | #1 : _ -> False- | #2 : _ -> True)+ | #1 :: $x -> match x as multiset integer with+ | #1 :: _ -> False+ | #2 :: _ -> True) assertEqual "pattern variable" (match 1 as something with $x -> x)@@ -177,20 +185,20 @@ assert "and pattern" (match [1, 2, 3] as list integer with- | #1 : _ && snoc #3 _ -> True)+ | #1 :: _ & snoc #3 _ -> True) assert "and pattern" (match [1, 2, 3] as list integer with- | #1 : _ && #3 : _ -> False+ | #1 :: _ & #3 :: _ -> False | _ -> True) assert "or pattern" (match [1, 2, 3] as list integer with- | snoc #1 _ || snoc #3 _ -> True)+ | snoc #1 _ | snoc #3 _ -> True) assert "or pattern" (match [1, 2, 3] as list integer with- | #2 : _ || #1 : _ -> True)+ | #2 :: _ | #1 :: _ -> True) assert "not pattern" (match 1 as integer with@@ -199,66 +207,66 @@ assertEqual "not pattern" (matchAll [1, 2, 2, 3, 3, 3] as multiset integer with- | $n : !(#n : _) -> n)+ | $n :: !(#n :: _) -> n) [1] assert "predicate pattern" (match [1, 2, 3] as list integer with- | ?(== 1) : _ -> True)+ | ?(= 1) :: _ -> True) assert "predicate pattern" (match [1, 2, 3] as list integer with- | ?(== 2) : _ -> False+ | ?(= 2) :: _ -> False | _ -> True) assertEqual "indexed pattern variable" (match 23 as mod 10 with | $a_1 -> a)- {| [1, 23] |}+ {| (1, 23) |} assert "loop pattern" (match [3, 2, 1] as list integer with | loop $i (1, [3], _)- | snoc #i ...- | [] -> True)+ (snoc #i ...)+ [] -> True) assertEqual "loop pattern" (match [1..10] as list integer with | loop $i (1, $n)- | #i : ...- | [] -> n)+ (#i :: ...)+ [] -> n) 10 assert "loop pattern" (match [3, 2, 1] as list integer with | loop $i (1, [3], _)- | snoc #i ...- | [] -> True)+ (snoc #i ...)+ [] -> True) assertEqual "double loop pattern" (match [[1, 2, 3], [4, 5, 6], [7, 8, 9]] as (list (list integer)) with | loop $i (1, [3], _)- | ((loop $j (1, [3], _)- | $n_i_j : ...- | []) : ...)- | [] -> n)- {| [1, {| [1, 1], [2, 2], [3, 3] |}],- [2, {| [1, 4], [2, 5], [3, 6] |}],- [3, {| [1, 7], [2, 8], [3, 9] |}] |}+ ((loop $j (1, [3], _)+ ($n_i_j :: ...)+ []) :: ...)+ [] -> n)+ {| (1, {| (1, 1), (2, 2), (3, 3) |}),+ (2, {| (1, 4), (2, 5), (3, 6) |}),+ (3, {| (1, 7), (2, 8), (3, 9) |}) |} assertEqual "let pattern" (match [1, 2, 3] as list integer with- | let a = 42 in _ -> a)+ | let a := 42 in _ -> a) 42 assertEqual "let pattern" (match [1, 2, 3] as list integer with- | $a : (let x = a in $xs) -> [x, xs])+ | $a :: (let x := a in $xs) -> [x, xs]) [1, [2, 3]] assertEqual "let pattern" (match [1, 2, 3] as list integer with- | $a && (let n = length a in _) -> [a, n])+ | $a & (let n := length a in _) -> [a, n]) [[1, 2, 3], 3] assertEqual "tuple pattern"@@ -268,44 +276,48 @@ assertEqual "tuple pattern" (matchAll [(1, 1), (2, 2)] as multiset (integer, integer) with- | ($x, #x) : _ -> x)+ | ($x, #x) :: _ -> x) [1, 2] -- assertEqual "pattern function call"--- (let twin = \pat1 pat2 => (~pat1 && $x) : #x : ~pat2 in+-- (let twin := \pat1 pat2 => (~pat1 & $x) :: #x :: ~pat2 in -- match [1, 1, 1, 2, 3] as list integer with -- | twin $n $ns -> [n, ns]) -- [1, [1, 2, 3]] -- assertEqual "recursive pattern function call"--- (let repeat = \pat => [] || (~pat && $x) : (repeat x) in+-- (let repeat := \pat => [] | (~pat & $x) :: (repeat x) in -- match [1, 1, 1, 1] as list integer with -- | repeat $n -> n) -- 1 -- assertEqual "loop pattern in pattern function"--- let comb n = \p =>--- loop $i (1, n, _) _ ++ ~p_i : ... | _+-- let comb n := \p =>+-- loop $i (1, n, _) (_ ++ ~p_i :: ...) _ -- in -- matchAll [1, 2, 3, 4, 5] as (list integer) with -- | (comb 2) $n -> n--- [{|[1, 1], [2, 2]|}, {|[1, 1], [2, 3]|}, {|[1, 2], [2, 3]|}, {|[1, 1], [2, 4]|}, {|[1, 2], [2, 4]|}, {|[1, 3], [2, 4]|}, {|[1, 1], [2, 5]|}, {|[1, 2], [2, 5]|}, {|[1, 3], [2, 5]|}, {|[1, 4], [2, 5]|}]+-- [{|(1, 1), (2, 2)|}, {|(1, 1), (2, 3)|},+-- {|(1, 2), (2, 3)|}, {|(1, 1), (2, 4)|},+-- {|(1, 2), (2, 4)|}, {|(1, 3), (2, 4)|},+-- {|(1, 1), (2, 5)|}, {|(1, 2), (2, 5)|},+-- {|(1, 3), (2, 5)|}, {|(1, 4), (2, 5)|}] assertEqual "pairs of 2, natural numbers" (take 10 (matchAll nats as set integer with- | $m : $n : _ -> [m, n]))+ | $m :: $n :: _ -> [m, n])) [[1, 1], [1, 2], [2, 1], [1, 3], [2, 2], [3, 1], [1, 4], [2, 3], [3, 2], [4, 1]] assertEqual "pairs of 2, different natural numbers" (take 10 (matchAll nats as list integer with- | _ ++ $m : _ ++ $n : _ -> [m, n]))+ | _ ++ $m :: _ ++ $n :: _ -> [m, n])) [[1, 2], [1, 3], [2, 3], [1, 4], [2, 4], [3, 4], [1, 5], [2, 5], [3, 5], [4, 5]] -tree a = algebraicDataMatcher+tree a := algebraicDataMatcher | leaf | node (tree a) a (tree a) -treeInsert n t =+treeInsert n t := match t as tree integer with | leaf -> Node Leaf n Leaf | node $t1 $m $t2 -> match (compare n m) as ordering with@@ -313,7 +325,7 @@ | equal -> Node t1 n t2 | greater -> Node t1 m (treeInsert n t2) -treeMember? n t =+treeMember? n t := match t as tree integer with | leaf -> False | node $t1 $m $t2 -> match (compare n m) as ordering with@@ -322,13 +334,13 @@ | greater -> treeMember? n t2 assertEqual "tree set using algebraic-data-matcher"- (let t = foldr treeInsert Leaf [4, 1, 2, 4, 3]+ (let t := foldr treeInsert Leaf [4, 1, 2, 4, 3] in [treeMember? 1 t, treeMember? 0 t]) [True, False] assert "sequential pattern" (match [2,3,1,4,5] as list integer with- { @ : @ : $x : _,+ { @ :: @ :: $x :: _, (#(x + 1), @), #(x + 2)} -> True) @@ -361,28 +373,21 @@ -- assertEqual "hash-literal"- {| [1, 11], [2, 12], [3, 13], [4, 14], [5, 15], |}- {| [1, 11], [2, 12], [3, 13], [4, 14], [5, 15], |}+ {| (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), |}+ {| (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), |} assertEqual "empty hash-literal" {| |} {| |} assertEqual "hash access"- {| [1, 11], [2, 12], [3, 13], [4, 14], [5, 15], |}_3+ {| (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), |}_3 13 -- -- Partial Application ----- assertEqual "partial application '$'"--- ($ + $)(1, 2)--- 3 ----- assertEqual "partial application '$' with index"--- ($2-$1)(1, 2)--- 1--- -- assertEqual "partial application '#'" -- 2#(10 * %1 + %2)(1, 2) -- 12@@ -391,13 +396,13 @@ -- take(10, 1#[%1, @(%0(%1 * 2))](2)) -- [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] -f *x *y = x + y+f *x *y := x + y assertEqual "double inverted index" (f [|1, 2, 3|]_i [|10, 20, 30|]_j) [| [| 11, 21, 31, |], [| 12, 22, 32, |], [| 13, 23, 33, |], |]~i~j -g x *y = x + y+g x *y := x + y assertEqual "single inverted index" (g [|1, 2, 3|]_i [|10, 20, 30|]_j)@@ -407,54 +412,54 @@ -- matcherExpr, macroExpr -- -list a = matcher+list a := matcher | [] as () with | [] -> [()] | _ -> []- | $ : $ as (a, list a) with- | $x : $xs -> [(x, xs)]- | _ -> []+ | $ :: $ as (a, list a) with+ | $x :: $xs -> [(x, xs)]+ | _ -> [] | snoc $ $ as (a, list a) with | snoc $xs $x -> [(x, xs)] | _ -> []- | join _ $ as (list a) with+ | _ ++ $ as (list a) with | $tgt -> matchAll tgt as list a with- | loop $i (1, _) | _ : ... | $rs -> rs- | join $ $ as (list a, list a) with+ | loop $i (1, _) (_ :: ...) $rs -> rs+ | $ ++ $ as (list a, list a) with | $tgt -> matchAll tgt as list a with- | loop $i (1, $n) $xa_i : ... | $rs ->- (foldr (\%i %r -> xa_i : r) [] [1..n], rs)+ | loop $i (1, $n) ($xa_i :: ...) $rs ->+ (foldr (\%i %r -> xa_i :: r) [] [1..n], rs) | nioj $ $ as (list a, list a) with | $tgt -> matchAll tgt as list a with- | loop $i (1, $n) snoc $xa_i ... | $rs ->+ | loop $i (1, $n) (snoc $xa_i ...) $rs -> (foldr (\%i %r -> r ++ [xa_i]) [] [1..n], rs) | #$val as () with- | $tgt -> if val == tgt then [()] else []+ | $tgt -> if val = tgt then [()] else [] | $ as something with | $tgt -> [tgt] -multiset a = matcher+multiset a := matcher | [] as () with | $tgt -> match tgt as (mutiset a) with | [] -> [()] | _ -> []- | $ : $ as (a, multiset a) with+ | $ :: $ as (a, multiset a) with | $tgt -> matchAll tgt as list a with- | $hs ++ $x : $ts -> (x, hs ++ ts)+ | $hs ++ $x :: $ts -> (x, hs ++ ts) | #$val as () with | $tgt -> match (val, tgt) as (list a, multiset a) with | ([], []) -> [()]- | ($x : $xs, #x : #xs) -> [()]+ | ($x :: $xs, #x :: #xs) -> [()] | (_, _) -> [] | $ as something with | $tgt -> [tgt] assertEqual "matcher definition" (matchAll [1, 2, 3] as multiset integer with- | $x : _ -> x)+ | $x :: _ -> x) [1, 2, 3] -nishiwakiIf =+nishiwakiIf := macro b e1 e2 -> car (matchAll b as (matcher | $ as something with@@ -464,4 +469,4 @@ assertEqual "case 1" (nishiwakiIf True 1 2) 1 assertEqual "case 2" (nishiwakiIf False 1 2) 2-assertEqual "case 3" (nishiwakiIf (1 == 1) 1 2) 1+assertEqual "case 3" (nishiwakiIf (1 = 1) 1 2) 1
sample/mahjong.egi view
@@ -60,14 +60,18 @@ ;; ;; Demonstration code ;;-(test (complete? {<Hnr <Haku>> <Hnr <Haku>>- <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>- <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>- <Num <Pin> 2> <Num <Pin> 3> <Num <Pin> 4>- <Num <Sou> 6> <Num <Sou> 6> <Num <Sou> 6>}))+(assert-equal "mahjong 1"+ (complete? {<Hnr <Haku>> <Hnr <Haku>>+ <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>+ <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>+ <Num <Pin> 2> <Num <Pin> 3> <Num <Pin> 4>+ <Num <Sou> 6> <Num <Sou> 6> <Num <Sou> 6>})+ #t) -(test (complete? {<Hnr <Haku>> <Hnr <Haku>>- <Num <Pin> 1> <Num <Pin> 3> <Num <Pin> 4>- <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>- <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>- <Num <Sou> 6> <Num <Sou> 6> <Num <Sou> 6>}))+(assert-equal "mahjong 2"+ (complete? {<Hnr <Haku>> <Hnr <Haku>>+ <Num <Pin> 1> <Num <Pin> 3> <Num <Pin> 4>+ <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>+ <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>+ <Num <Sou> 6> <Num <Sou> 6> <Num <Sou> 6>})+ #f)
sample/math/others/mobius-transformation.egi view
@@ -20,5 +20,6 @@ (lambda [$z] (+ (/ a c) z))) -(f4 (f3 (f2 (f1 z))))-;(/ (+ (* a z) b) (+ (* c z) d))+(assert-equal "mobius transformation"+ (f4 (f3 (f2 (f1 z))))+ (/ (+ (* a z) b) (+ (* c z) d)))
sample/poker-hands-with-joker.egi view
@@ -94,27 +94,34 @@ ;; ;; Demonstration code ;;-(test (poker-hands {<Card <Club> 12>- <Card <Club> 10>- <Joker>- <Card <Club> 1>- <Card <Club> 11>}))--(test (poker-hands {<Card <Diamond> 1>- <Card <Club> 2>- <Joker>- <Card <Heart> 1>- <Card <Diamond> 2>}))+(assert-equal "poker-hands-with-joker 1"+ (poker-hands {<Card <Club> 12>+ <Card <Club> 10>+ <Joker>+ <Card <Club> 1>+ <Card <Club> 11>})+ <Straight-Flush>) -(test (poker-hands {<Card <Diamond> 4>- <Card <Club> 2>- <Joker>- <Card <Heart> 1>- <Card <Diamond> 3>}))+(assert-equal "poker-hands-with-joker 1"+ (poker-hands {<Card <Diamond> 1>+ <Card <Club> 2>+ <Joker>+ <Card <Heart> 1>+ <Card <Diamond> 2>})+ <Full-House>) -(test (poker-hands {<Card <Diamond> 4>- <Card <Club> 10>- <Joker>- <Card <Heart> 1>- <Card <Diamond> 3>}))+(assert-equal "poker-hands-with-joker 1"+ (poker-hands {<Card <Diamond> 4>+ <Card <Club> 2>+ <Joker>+ <Card <Heart> 1>+ <Card <Diamond> 3>})+ <Straight>) +(assert-equal "poker-hands-with-joker 1"+ (poker-hands {<Card <Diamond> 4>+ <Card <Club> 10>+ <Joker>+ <Card <Heart> 1>+ <Card <Diamond> 3>})+ <One-Pair>)
sample/poker-hands.egi view
@@ -88,27 +88,34 @@ ;; ;; Demonstration code ;;-(test (poker-hands {<Card <Club> 12>- <Card <Club> 10>- <Card <Club> 13>- <Card <Club> 1>- <Card <Club> 11>}))--(test (poker-hands {<Card <Diamond> 1>- <Card <Club> 2>- <Card <Club> 1>- <Card <Heart> 1>- <Card <Diamond> 2>}))+(assert-equal "poker hands 1"+ (poker-hands {<Card <Club> 12>+ <Card <Club> 10>+ <Card <Club> 13>+ <Card <Club> 1>+ <Card <Club> 11>})+ "Straight flush") -(test (poker-hands {<Card <Diamond> 4>- <Card <Club> 2>- <Card <Club> 5>- <Card <Heart> 1>- <Card <Diamond> 3>}))+(assert-equal "poker hands 2"+ (poker-hands {<Card <Diamond> 1>+ <Card <Club> 2>+ <Card <Club> 1>+ <Card <Heart> 1>+ <Card <Diamond> 2>})+ "Full house") -(test (poker-hands {<Card <Diamond> 4>- <Card <Club> 10>- <Card <Club> 5>- <Card <Heart> 1>- <Card <Diamond> 3>}))+(assert-equal "poker hands 3"+ (poker-hands {<Card <Diamond> 4>+ <Card <Club> 2>+ <Card <Club> 5>+ <Card <Heart> 1>+ <Card <Diamond> 3>})+ "Straight") +(assert-equal "poker hands 4"+ (poker-hands {<Card <Diamond> 4>+ <Card <Club> 10>+ <Card <Club> 5>+ <Card <Heart> 1>+ <Card <Diamond> 3>})+ "Nothing")
sample/primes.egi view
@@ -11,7 +11,9 @@ [p (+ p 2)]])) ;; Enumerate the first 10 twin primes-(take 10 twin-primes)+(assert-equal "first 10 twin prime"+ (take 10 twin-primes)+ {[3 5] [5 7] [11 13] [17 19] [29 31] [41 43] [59 61] [71 73] [101 103] [107 109]}) ;; Extract all prime-triplets from the infinite list of prime numbers with pattern-matching! (define $prime-triplets@@ -22,5 +24,6 @@ [p m (+ p 6)]])) ;; Enumerate the first 10 prime triplets-(take 10 prime-triplets)-+(assert-equal "first 10 prime triplets"+ (take 10 prime-triplets)+ {[5 7 11] [7 11 13] [11 13 17] [13 17 19] [17 19 23] [37 41 43] [41 43 47] [67 71 73] [97 101 103] [101 103 107]})
test/Test.hs view
@@ -15,8 +15,10 @@ import Language.Egison import Language.Egison.Core+import Language.Egison.CmdOptions import qualified Language.Egison.Parser as Parser import qualified Language.Egison.ParserNonS as ParserNonS+import Language.Egison.Pretty import Language.Egison.Primitives import Language.Egison.Types @@ -40,6 +42,11 @@ , "test/lib/core/collection.egi" , "test/lib/core/order.egi" , "test/lib/core/number.egi"++ , "sample/mahjong.egi"+ , "sample/poker-hands-with-joker.egi"+ , "sample/poker-hands.egi"+ , "sample/primes.egi" ] unitNonSTestCases :: [FilePath]@@ -52,11 +59,7 @@ sampleTestCases :: [FilePath] sampleTestCases =- [ "test/answer/sample/poker-hands-with-joker.egi"- , "test/answer/sample/primes.egi"- , "test/answer/sample/mahjong.egi"- , "test/answer/sample/poker-hands.egi"- , "test/answer/sample/math/geometry/riemann-curvature-tensor-of-S2.egi"+ [ "test/answer/sample/math/geometry/riemann-curvature-tensor-of-S2.egi" , "test/answer/sample/math/number/17th-root-of-unity.egi" ] @@ -102,10 +105,10 @@ f :: [String] -> [(EgisonExpr, EgisonValue)] -> String f answers ls = g answers ls 0 g x y i = let (e, v) = unzip y in- if (x !! i) == show (v !! i)+ if (x !! i) == prettyS (v !! i) then (if i < (length y - 1) then g x y (i + 1) else "")- else "failed " ++ show (e !! i) ++ "\n expected: " ++ (x !! i) ++ "\n but found: " ++ show (v !! i)+ else "failed " ++ show (e !! i) ++ "\n expected: " ++ (x !! i) ++ "\n but found: " ++ prettyS (v !! i) collectDefsAndTests :: EgisonTopExpr -> ([(Var, EgisonExpr)], [EgisonExpr]) -> ([(Var, EgisonExpr)], [EgisonExpr]) collectDefsAndTests (Define name expr) (bindings, tests) =
− test/answer/sample/mahjong.egi
@@ -1,2 +0,0 @@-#t-#f
− test/answer/sample/poker-hands-with-joker.egi
@@ -1,4 +0,0 @@-<Straight-Flush>-<Full-House>-<Straight>-<One-Pair>
− test/answer/sample/poker-hands.egi
@@ -1,4 +0,0 @@-"Straight flush"-"Full house"-"Straight"-"Nothing"
− test/answer/sample/primes.egi
@@ -1,2 +0,0 @@-{[3 5] [5 7] [11 13] [17 19] [29 31] [41 43] [59 61] [71 73] [101 103] [107 109]}-{[5 7 11] [7 11 13] [11 13 17] [13 17 19] [17 19 23] [37 41 43] [41 43 47] [67 71 73] [97 101 103] [101 103 107]}
test/lib/math/tensor.egi view
@@ -77,9 +77,9 @@ [[_ _] 0]}) {3 3})]} (show (with-symbols {i j} (d/d g_i_j x))))- "[| [| g_1_1|x 0 0 |] [| 0 g_2_2|x 0 |] [| 0 0 g_3_3|x |] |]")+ "[| [| g_1_1|x, 0, 0 |], [| 0, g_2_2|x, 0 |], [| 0, 0, g_3_3|x |] |]") (assert-equal "define tensor having value of function expr" (letrec {[$g__ [| [| (function [x y z]) 0 0 |] [| 0 (function [x y z]) 0 |] [| 0 0 (function [x y z]) |] |]]} (show (with-symbols {i j} (d/d g_i_j x))))- "[| [| g_1_1|x 0 0 |] [| 0 g_2_2|x 0 |] [| 0 0 g_3_3|x |] |]")+ "[| [| g_1_1|x, 0, 0 |], [| 0, g_2_2|x, 0 |], [| 0, 0, g_3_3|x |] |]")