egison 4.1.2 → 4.1.3
raw patch · 85 files changed
+1448/−1065 lines, 85 filesdep −arraydep −ghcdep −ghc-pathsdep ~basedep ~containersdep ~directorysetup-changed
Dependencies removed: array, ghc, ghc-paths, split
Dependency ranges changed: base, containers, directory, hashable, haskeline, megaparsec, mtl, optparse-applicative, parsec, parser-combinators, prettyprinter, process, random, regex-tdfa, sweet-egison, text, transformers, unicode-show, unordered-containers, vector
Files
- Changelog.md +22/−0
- Setup.hs +1/−1
- egison.cabal +26/−40
- hs-src/Interpreter/egison.hs +13/−7
- hs-src/Language/Egison.hs +3/−3
- hs-src/Language/Egison/AST.hs +22/−15
- hs-src/Language/Egison/CmdOptions.hs +1/−1
- hs-src/Language/Egison/Completion.hs +6/−6
- hs-src/Language/Egison/Core.hs +129/−120
- hs-src/Language/Egison/Data.hs +71/−75
- hs-src/Language/Egison/Data/Collection.hs +11/−12
- hs-src/Language/Egison/Data/Utils.hs +65/−12
- hs-src/Language/Egison/Desugar.hs +117/−69
- hs-src/Language/Egison/Eval.hs +14/−8
- hs-src/Language/Egison/EvalState.hs +7/−5
- hs-src/Language/Egison/IExpr.hs +30/−14
- hs-src/Language/Egison/MList.hs +1/−1
- hs-src/Language/Egison/Match.hs +3/−3
- hs-src/Language/Egison/Math.hs +1/−1
- hs-src/Language/Egison/Math/Arith.hs +2/−2
- hs-src/Language/Egison/Math/Expr.hs +19/−18
- hs-src/Language/Egison/Math/Normalize.hs +2/−2
- hs-src/Language/Egison/Math/Rewrite.hs +14/−10
- hs-src/Language/Egison/Parser.hs +8/−8
- hs-src/Language/Egison/Parser/NonS.hs +57/−15
- hs-src/Language/Egison/Parser/SExpr.hs +32/−25
- hs-src/Language/Egison/Pretty.hs +40/−42
- hs-src/Language/Egison/PrettyMath/AST.hs +27/−13
- hs-src/Language/Egison/PrettyMath/AsciiMath.hs +7/−7
- hs-src/Language/Egison/PrettyMath/Latex.hs +8/−8
- hs-src/Language/Egison/PrettyMath/Mathematica.hs +7/−7
- hs-src/Language/Egison/PrettyMath/Maxima.hs +8/−8
- hs-src/Language/Egison/Primitives.hs +10/−12
- hs-src/Language/Egison/Primitives/Arith.hs +13/−15
- hs-src/Language/Egison/Primitives/IO.hs +2/−3
- hs-src/Language/Egison/Primitives/String.hs +2/−2
- hs-src/Language/Egison/Primitives/Types.hs +2/−5
- hs-src/Language/Egison/Primitives/Utils.hs +10/−13
- hs-src/Language/Egison/RState.hs +3/−4
- hs-src/Language/Egison/Tensor.hs +15/−22
- hs-src/Tool/translator.hs +11/−11
- lib/core/assoc.egi +16/−46
- lib/core/base.egi +2/−2
- lib/core/collection.egi +3/−1
- lib/core/number.egi +3/−3
- lib/core/order.egi +5/−5
- lib/core/shell.egi +14/−23
- lib/core/sort.egi +10/−9
- lib/math/algebra/equations.egi +2/−2
- lib/math/algebra/inverse.egi +5/−5
- lib/math/algebra/matrix.egi +18/−17
- lib/math/algebra/root.egi +5/−5
- lib/math/algebra/tensor.egi +3/−3
- lib/math/analysis/derivative.egi +12/−12
- lib/math/analysis/integral.egi +4/−4
- lib/math/common/arithmetic.egi +7/−7
- lib/math/common/functions.egi +13/−15
- lib/math/expression.egi +11/−8
- lib/math/geometry/3d-euclidean-space.egi +3/−3
- lib/math/geometry/4d-euclidean-space.egi +3/−3
- lib/math/geometry/differential-form.egi +4/−0
- lib/math/geometry/minkowski-space.egi +4/−4
- lib/math/normalize.egi +1/−1
- sample/math/geometry/riemann-curvature-tensor-of-S2.egi +1/−1
- sample/math/geometry/riemann-curvature-tensor-of-S5-non-sym.egi +1/−1
- sample/math/geometry/riemann-curvature-tensor-of-S5.egi +1/−1
- sample/math/geometry/riemann-curvature-tensor-of-T2-non-sym.egi +14/−14
- sample/math/geometry/riemann-curvature-tensor-of-T2.egi +14/−14
- sample/math/geometry/thurston-non-sym.egi +18/−18
- sample/math/geometry/thurston.egi +24/−20
- sample/math/number/5th-root-of-unity.egi +53/−0
- sample/math/number/7th-root-of-unity.egi +51/−0
- sample/math/number/tribonacci.egi +5/−5
- sample/sat/dp.egi +11/−12
- test/CLITest.hs +88/−0
- test/OptionsTest.hs +0/−84
- test/Test.hs +3/−0
- test/lib/core/assoc.egi +4/−29
- test/lib/core/io.egi +51/−0
- test/lib/core/number.egi +2/−2
- test/lib/core/order.egi +38/−31
- test/lib/core/random.egi +50/−0
- test/lib/core/shell.egi +14/−0
- test/lib/core/sort.egi +11/−0
- test/lib/math/tensor.egi +4/−10
Changelog.md view
@@ -1,6 +1,28 @@ # Changelog ## Latest+### New Features+* Added binary function notation for arbitrary 2-ary functions. ([#260](https://github.com/egison/egison/pull/260))+```hs+> let mod x y := x % y in 103 `mod` 10+3+```++### Backward-incompatible Changes+* Swapped the notation for `QuoteExpr` and `QuoteSymbolExpr`. ([#262](https://github.com/egison/egison/issues/262))+```hs+> `(a + b) + `(a + b) -- QuoteExpr, which prevents (a + b) from unpacking+2 * '(a + b)+> 'exp x -- QuoteSymbolExpr+exp x+```+* Changed the specification of `generateTensor` so that the generation function takes indices as a collection. ([#267](https://github.com/egison/egison/pull/267))++## 4.1.2+* Nothing changed (bumped version of `sweet-egison` package)++## 4.1.1+* Fix compilation issue with GHC 8.10 ([#248](https://github.com/egison/egison/issues/248)) ## 4.1.0 ### New Features
Setup.hs view
@@ -1,5 +1,5 @@ #!/usr/bin/env runhaskell -import Distribution.Simple+import Distribution.Simple main = defaultMain
egison.cabal view
@@ -1,5 +1,5 @@ Name: egison-Version: 4.1.2+Version: 4.1.3 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.@@ -84,30 +84,26 @@ Library default-language: Haskell2010 Build-Depends:- base >= 4.7 && < 5- , array- , random- , containers- , unordered-containers- , haskeline- , transformers- , mtl >=2.2.1- , parsec >= 3.0- , megaparsec >= 7.0.0- , parser-combinators- , directory- , ghc- , ghc-paths- , text- , regex-tdfa- , process- , vector- , split- , hashable- , optparse-applicative- , prettyprinter- , unicode-show- , sweet-egison >= 0.1.1.3+ base >= 4.8 && < 5+ , random == 1.*+ , containers == 0.6.*+ , unordered-containers >= 0.1.0.0 && < 0.3+ , haskeline >= 0.7 && < 0.9+ , transformers >= 0.4 && < 0.6+ , mtl >= 2.2.2 && < 3.0+ , parsec >= 3.0+ , megaparsec >= 7.0.0 && < 12.0+ , parser-combinators >= 1.0 && < 2.0+ , directory >= 1.3.0+ , text >= 0.2 && < 1.3+ , regex-tdfa >= 1.2.0+ , process >= 1.0 && < 2.0+ , vector == 0.12.*+ , hashable >= 1.0 && < 2.0+ , optparse-applicative >= 0.14 && < 0.20+ , prettyprinter >= 1.0 && < 2.0+ , unicode-show == 0.1.*+ , sweet-egison == 0.1.1.3 if !impl(ghc > 8.0) Build-Depends: fail Hs-Source-Dirs: hs-src@@ -160,7 +156,7 @@ Main-Is: Test.hs Build-Depends: egison- , base >= 4.0 && < 5+ , base >= 4.8 && < 5 , transformers , mtl , Glob@@ -176,10 +172,10 @@ default-language: Haskell2010 Type: exitcode-stdio-1.0 Hs-Source-Dirs: test- Main-Is: OptionsTest.hs+ Main-Is: CLITest.hs Build-Depends: egison- , base >= 4.0 && < 5+ , base >= 4.8 && < 5 , process , HUnit , test-framework@@ -195,7 +191,7 @@ Main-Is: Benchmark.hs Build-Depends: egison- , base >= 4.0 && < 5+ , base >= 4.8 && < 5 , criterion >= 0.5 , transformers Other-modules: Paths_egison@@ -208,22 +204,13 @@ Build-depends: egison , base >= 4.0 && < 5- , array- , containers , exceptions- , unordered-containers , haskeline- , transformers , mtl- , parsec >= 3.1 , directory- , ghc- , ghc-paths , filepath , text- , process , regex-tdfa- , vector , optparse-applicative if !impl(ghc > 8.0) Build-Depends: semigroups@@ -237,8 +224,7 @@ Main-is: translator.hs Build-depends: egison- , base >= 4.0 && < 5+ , base >= 4.8 && < 5 , prettyprinter- , split Hs-Source-Dirs: hs-src/Tool ghc-options: -Wall -Wno-name-shadowing
hs-src/Interpreter/egison.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE LambdaCase #-} module Main where @@ -12,8 +12,7 @@ import Data.Version -import System.Console.Haskeline (InputT, getInputLine, getHistory, putHistory,- runInputT, Settings (..))+import System.Console.Haskeline (InputT, Settings (..), getHistory, getInputLine, putHistory, runInputT) import System.Console.Haskeline.History (addHistoryUnlessConsecutiveDupe) import System.Directory (getHomeDirectory) import System.Exit (exitFailure, exitSuccess)@@ -31,7 +30,7 @@ isInValidMathOption :: EgisonOpts -> Bool isInValidMathOption EgisonOpts{ optMathExpr = Just lang } = lang `notElem` ["asciimath", "latex", "mathematica", "maxima", "haskell"]-isInValidMathOption EgisonOpts{ optMathExpr = Nothing } = False+isInValidMathOption EgisonOpts{ optMathExpr = Nothing } = False runWithOptions :: EgisonOpts -> IO () runWithOptions opts | isInValidMathOption opts =@@ -46,7 +45,7 @@ coreEnv <- initialEnv mEnv <- fromEvalT $ evalTopExprs coreEnv $ map Load (optLoadLibs opts) ++ map LoadFile (optLoadFiles opts) case mEnv of- Left err -> liftIO $ print err+ Left err -> liftIO $ print err Right env -> handleOption env opts handleOption :: Env -> EgisonOpts -> RuntimeM ()@@ -133,7 +132,7 @@ Just topExpr -> do result <- fromEvalT (evalTopExprStr env topExpr) case result of- Left err -> liftIO (print err) >> repl env+ Left err -> liftIO (print err) >> repl env Right (Just str, env') -> liftIO (putStrLn str) >> repl env' Right (Nothing, env') -> repl env' )@@ -162,7 +161,7 @@ history <- getHistory putHistory $ addHistoryUnlessConsecutiveDupe line history let input = prev ++ line- parsedExpr <- lift $ parseTopExpr input+ parsedExpr <- lift $ parseTopExpr (replaceNewLine input) case parsedExpr of Left err | err =~ "unexpected end of input" -> getEgisonExpr' (input ++ "\n")@@ -172,3 +171,10 @@ Right topExpr -> do -- outputStr $ show topExpr return $ Just topExpr++replaceNewLine :: String -> String+replaceNewLine input =+ let (before, _, after) = input =~ "#newline" :: (String, String, String) in+ case after of+ "" -> before+ _ -> before ++ "\n" ++ replaceNewLine after
hs-src/Language/Egison.hs view
@@ -20,11 +20,11 @@ , version ) where -import Control.Monad.Reader (asks, local)+import Control.Monad.Reader (asks, local) import Control.Monad.State import Data.Version-import qualified Paths_egison as P+import qualified Paths_egison as P import Language.Egison.AST import Language.Egison.CmdOptions@@ -59,10 +59,10 @@ [ "lib/core/base.egi" -- Defines (&&) (||) , "lib/math/common/arithmetic.egi" -- Defines (+) (-) (*) (/) (+') (-') (*') (/') , "lib/math/algebra/tensor.egi" -- Defines (.) (.')+ , "lib/core/collection.egi" -- Defines (++) for patterns , "lib/math/expression.egi" -- Defines (+) (*) (/) (^) for patterns , "lib/core/assoc.egi"- , "lib/core/collection.egi" , "lib/core/io.egi" , "lib/core/maybe.egi" , "lib/core/number.egi"
hs-src/Language/Egison/AST.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE DeriveTraversable #-} {- | Module : Language.Egison.AST@@ -33,11 +32,12 @@ , reservedPatternOp , findOpFrom , stringToVarWithIndices+ , extractNameFromVarWithIndices ) where -import Data.List (find)-import Data.Maybe (fromJust)-import Data.Text (Text)+import Data.List (find)+import Data.Maybe (fromJust)+import Data.Text (Text) data TopExpr = Define VarWithIndices Expr@@ -75,7 +75,7 @@ | VectorExpr [Expr] | LambdaExpr [Arg ArgPattern] Expr- | LambdaExpr' [Arg String] Expr+ | LambdaExpr' [Arg VarWithIndices] Expr | MemoizedLambdaExpr [String] Expr | CambdaExpr String Expr | PatternFunctionExpr [String] Pattern@@ -107,6 +107,8 @@ | ApplyExpr Expr [Expr] | CApplyExpr Expr Expr | AnonParamFuncExpr Integer Expr+ | AnonTupleParamFuncExpr Integer Expr+ | AnonListParamFuncExpr Integer Expr | AnonParamExpr Integer | GenerateTensorExpr Expr Expr@@ -121,7 +123,7 @@ deriving Show data VarWithIndices = VarWithIndices String [VarIndex]- deriving Show+ deriving (Show, Eq) data Arg a = ScalarArg a@@ -131,21 +133,23 @@ data ArgPattern = APWildCard- | APPatVar String+ | APPatVar VarWithIndices | APInductivePat String [Arg ArgPattern] | APTuplePat [Arg ArgPattern] | APEmptyPat- | APConsPat (Arg ArgPattern) (Arg ArgPattern)- | APSnocPat (Arg ArgPattern) (Arg ArgPattern)+ | APConsPat (Arg ArgPattern) ArgPattern+ | APSnocPat ArgPattern (Arg ArgPattern) deriving Show data VarIndex = VSubscript String | VSuperscript String+ | VMultiSubscript String Integer String -- _(a_1)..._(a_n) -> VMultiSubscript "a" 1 "n"+ | VMultiSuperscript String Integer String -- ~(a_1)...~(a_n) -> VMultiSuperscript "a" 1 "n" | VGroupScripts [VarIndex] | VSymmScripts [VarIndex] | VAntiSymmScripts [VarIndex]- deriving Show+ deriving (Show, Eq) data IndexExpr a = Subscript a@@ -256,8 +260,7 @@ reservedPatternOp :: [Op] reservedPatternOp =- [ Op "::" 5 InfixR False -- cons (desugared)- , Op "++" 5 InfixR False -- join (desugared)+ [ Op "::" 5 InfixR False -- required for desugaring collection pattern , Op "&" 3 InfixR False , Op "|" 2 InfixR False ]@@ -265,8 +268,12 @@ findOpFrom :: String -> [Op] -> Op findOpFrom op table = fromJust $ find ((== op) . repr) table +makeApply :: String -> [Expr] -> Expr+makeApply func args = ApplyExpr (VarExpr func) args+ stringToVarWithIndices :: String -> VarWithIndices stringToVarWithIndices name = VarWithIndices name [] -makeApply :: String -> [Expr] -> Expr-makeApply func args = ApplyExpr (VarExpr func) args+extractNameFromVarWithIndices :: VarWithIndices -> String+extractNameFromVarWithIndices (VarWithIndices name _) = name+
hs-src/Language/Egison/CmdOptions.hs view
@@ -15,7 +15,7 @@ import Data.List (intercalate) import Data.Maybe (maybeToList) import Options.Applicative-import qualified Text.Parsec as P+import qualified Text.Parsec as P data EgisonOpts = EgisonOpts { optExecFile :: Maybe (String, [String]),
hs-src/Language/Egison/Completion.hs view
@@ -15,7 +15,7 @@ import Language.Egison.Data (Env (..)) import Language.Egison.IExpr (Var (..))-import Language.Egison.Parser.NonS (upperReservedWords, lowerReservedWords)+import Language.Egison.Parser.NonS (lowerReservedWords, upperReservedWords) -- |Complete Egison keywords completeEgison :: Monad m => Env -> CompletionFunc m@@ -52,12 +52,12 @@ closeParen str = closeParen' 0 $ removeCharAndStringLiteral str removeCharAndStringLiteral :: String -> String-removeCharAndStringLiteral [] = []-removeCharAndStringLiteral ('"':'\\':str) = '"':'\\':removeCharAndStringLiteral str-removeCharAndStringLiteral ('"':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral [] = []+removeCharAndStringLiteral ('"':'\\':str) = '"':'\\':removeCharAndStringLiteral str+removeCharAndStringLiteral ('"':str) = removeCharAndStringLiteral' str removeCharAndStringLiteral ('\'':'\\':str) = '\'':'\\':removeCharAndStringLiteral str-removeCharAndStringLiteral ('\'':str) = removeCharAndStringLiteral' str-removeCharAndStringLiteral (c:str) = c:removeCharAndStringLiteral str+removeCharAndStringLiteral ('\'':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral (c:str) = c:removeCharAndStringLiteral str removeCharAndStringLiteral' :: String -> String removeCharAndStringLiteral' [] = []
hs-src/Language/Egison/Core.hs view
@@ -1,7 +1,7 @@-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ViewPatterns #-} {- | Module : Language.Egison.Core@@ -22,36 +22,35 @@ , patternMatch ) where -import Prelude hiding (mapM, mappend, mconcat)+import Prelude hiding (mapM, mappend, mconcat) import Control.Arrow-import Control.Monad.Except (throwError)-import Control.Monad.State hiding (mapM, join)+import Control.Monad.Except (throwError)+import Control.Monad.State hiding (join, mapM) import Control.Monad.Trans.Maybe -import Data.Char (isUpper)-import Data.Foldable (toList)+import Data.Char (isUpper)+import Data.Foldable (toList) import Data.IORef-import Data.List (partition)+import Data.List (partition) import Data.Maybe-import qualified Data.Sequence as Sq-import Data.Traversable (mapM)+import qualified Data.Sequence as Sq+import Data.Traversable (mapM) -import qualified Data.HashMap.Lazy as HL-import qualified Data.Vector as V+import qualified Data.HashMap.Lazy as HL+import qualified Data.Vector as V import Language.Egison.Data import Language.Egison.Data.Collection import Language.Egison.Data.Utils-import Language.Egison.EvalState (MonadEval(..), mLabelFuncName)+import Language.Egison.EvalState (MonadEval (..), mLabelFuncName) import Language.Egison.IExpr+import Language.Egison.MList import Language.Egison.Match import Language.Egison.Math-import Language.Egison.MList import Language.Egison.RState import Language.Egison.Tensor - evalConstant :: ConstantExpr -> EgisonValue evalConstant (CharExpr c) = Char c evalConstant (StringExpr s) = toEgison s@@ -68,14 +67,14 @@ whnf <- evalExprShallow env expr case whnf of Value (ScalarData s) -> return . Value . ScalarData $ SingleTerm 1 [(Quote s, 1)]- _ -> throwError =<< TypeMismatch "scalar in quote" whnf <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "scalar in quote" whnf) evalExprShallow env (IQuoteSymbolExpr expr) = do whnf <- evalExprShallow env expr case whnf of- Value (Func (Just name) _ _ _) -> return . Value $ symbolScalarData "" name- Value (ScalarData _) -> return whnf- _ -> throwError =<< TypeMismatch "value in quote-function" whnf <$> getFuncNameStack+ Value (Func (Just (Var name [])) _ _ _) -> return . Value $ symbolScalarData "" name+ Value (ScalarData _) -> return whnf+ _ -> throwErrorWithTrace (TypeMismatch "value in quote-function" whnf) evalExprShallow env (IVarExpr name) = case refVar env (Var name []) of@@ -107,35 +106,19 @@ innersSeq <- liftIO $ newIORef $ Sq.fromList [ISubCollection xs', ISubCollection ys'] return $ ICollection innersSeq -evalExprShallow env@(Env frame maybe_vwi) (IVectorExpr exprs) = do+evalExprShallow env (IVectorExpr exprs) = do let n = toInteger (length exprs)- whnfs <- zipWithM evalWithIndex exprs [1..]+ whnfs <- mapM (evalExprShallow env) exprs case whnfs of ITensor Tensor{}:_ ->- zipWithM f whnfs [1..] >>= tConcat' >>= fromTensor+ mapM f whnfs >>= tConcat' >>= fromTensor _ -> makeITensorFromWHNF [n] whnfs where- evalWithIndex :: IExpr -> Integer -> EvalM WHNFData- evalWithIndex expr index = evalExprShallow env' expr- where- env' = case maybe_vwi of- Nothing -> env- Just (name, indices) ->- Env frame (Just (name, zipWith changeIndex indices [toEgison index]))- f (ITensor (Tensor ns xs indices)) i = do- xs <- mapM evalRef xs- let xs' = V.zipWith g xs $ V.fromList (map (\ms -> map toEgison (i:ms)) $ enumTensorIndices ns)- xs' <- mapM newEvaluatedObjectRef xs'- return $ Tensor ns xs' indices- f x _ = Scalar <$> newEvaluatedObjectRef x- g (Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1)]]) p))) ms =- Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn' argnames args js, 1)]]) p))- where- fn' = case maybe_vwi of- Nothing -> fn- Just (name, indices) ->- symbolScalarData' (name ++ concatMap show (zipWith changeIndex indices ms))- g x _ = x+ f (ITensor (Tensor ns xs indices)) = do+ xs' <- mapM evalRef xs+ xs'' <- mapM newEvaluatedObjectRef xs'+ return $ Tensor ns xs'' indices+ f x = Scalar <$> newEvaluatedObjectRef x evalExprShallow env (ITensorExpr nsExpr xsExpr) = do nsWhnf <- evalExprShallow env nsExpr@@ -144,7 +127,7 @@ xs <- collectionToRefs xsWhnf >>= fromMList >>= mapM evalRef if product ns == toInteger (length xs) then makeITensorFromWHNF ns xs- else throwError =<< InconsistentTensorShape <$> getFuncNameStack+ else throwErrorWithTrace InconsistentTensorShape evalExprShallow env (IHashExpr assocs) = do let (keyExprs, exprs) = unzip assocs@@ -168,22 +151,27 @@ ScalarData _ -> IntKey <$> fromEgison val Char c -> return (CharKey c) String str -> return (StrKey str)- _ -> throwError =<< TypeMismatch "integer or string" (Value val) <$> getFuncNameStack- makeHashKey whnf = throwError =<< TypeMismatch "integer or string" whnf <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "integer or string" (Value val))+ makeHashKey whnf = throwErrorWithTrace (TypeMismatch "integer or string" whnf) -evalExprShallow env (IIndexedExpr override expr indices) = do+evalExprShallow env@(Env fs _) (IIndexedExpr override expr indices) = do -- Tensor or hash- tensor <- case expr of- IVarExpr xs -> do- let mObjRef = refVar env (Var xs (map (const () <$>) indices))+ whnf <- case expr of+ IVarExpr v -> do+ let mObjRef = refVar env (Var v (map (fmap (const Nothing)) indices)) case mObjRef of Just objRef -> evalRef objRef Nothing -> evalExprShallow env expr _ -> evalExprShallow env expr- case tensor of+ case whnf of Value (ScalarData (SingleTerm 1 [(Symbol id name js', 1)])) -> do js2 <- mapM evalIndexToScalar indices return $ Value (ScalarData (SingleTerm 1 [(Symbol id name (js' ++ js2), 1)]))+ Value (Func v@(Just (Var fnName is)) env args body) -> do+ js <- mapM evalIndex indices+ frame <- pmIndices is js+ let env' = extendEnv env frame+ return $ Value (Func v env' args body) Value (TensorData t@Tensor{}) -> do js <- mapM evalIndex indices Value <$> refTensorWithOverride override js t@@ -192,7 +180,7 @@ refTensorWithOverride override js t _ -> do js <- mapM evalIndex indices- refHash tensor (map extractIndex js)+ refHash whnf (map extractIndex js) where evalIndex :: Index IExpr -> EvalM (Index EgisonValue) evalIndex index = traverse (evalExprDeep env) index@@ -204,7 +192,7 @@ js <- map Sub <$> (evalExprDeep env jsExpr >>= collectionToList) tensor <- case expr of IVarExpr xs -> do- let mObjRef = refVar env (Var xs (map (\_ -> Sub ()) js))+ let mObjRef = refVar env (Var xs (map (\_ -> Sub Nothing) js)) case mObjRef of Just objRef -> evalRef objRef Nothing -> evalExprShallow env expr@@ -213,13 +201,13 @@ Value (ScalarData _) -> return tensor Value (TensorData t@Tensor{}) -> Value <$> refTensorWithOverride override js t ITensor t@Tensor{} -> refTensorWithOverride override js t- _ -> throwError =<< NotImplemented "subrefs" <$> getFuncNameStack+ _ -> throwErrorWithTrace (NotImplemented "subrefs") evalExprShallow env (ISuprefsExpr override expr jsExpr) = do js <- map Sup <$> (evalExprDeep env jsExpr >>= collectionToList) tensor <- case expr of IVarExpr xs -> do- let mObjRef = refVar env (Var xs (map (\_ -> Sup ()) js))+ let mObjRef = refVar env (Var xs (map (\_ -> Sup Nothing) js)) case mObjRef of Just objRef -> evalRef objRef Nothing -> evalExprShallow env expr@@ -228,7 +216,7 @@ Value (ScalarData _) -> return tensor Value (TensorData t@Tensor{}) -> Value <$> refTensorWithOverride override js t ITensor t@Tensor{} -> refTensorWithOverride override js t- _ -> throwError =<< NotImplemented "suprefs" <$> getFuncNameStack+ _ -> throwErrorWithTrace (NotImplemented "suprefs") evalExprShallow env (IUserrefsExpr _ expr jsExpr) = do val <- evalExprDeep env expr@@ -236,12 +224,16 @@ case val of ScalarData (SingleTerm 1 [(Symbol id name is, 1)]) -> return $ Value (ScalarData (SingleTerm 1 [(Symbol id name (is ++ js), 1)]))- ScalarData (SingleTerm 1 [(FunctionData name argnames args is, 1)]) ->- return $ Value (ScalarData (SingleTerm 1 [(FunctionData name argnames args (is ++ js), 1)]))- _ -> throwError =<< NotImplemented "user-refs" <$> getFuncNameStack+ ScalarData (SingleTerm 1 [(FunctionData sym argnames args, 1)]) ->+ case sym of+ SingleTerm 1 [(Symbol id name is, 1)] -> do+ let sym' = SingleTerm 1 [(Symbol id name (is ++ js), 1)]+ return $ Value (ScalarData (SingleTerm 1 [(FunctionData sym' argnames args, 1)]))+ _ -> throwErrorWithTrace (NotImplemented "user-refs")+ _ -> throwErrorWithTrace (NotImplemented "user-refs") -evalExprShallow env (ILambdaExpr fnname names expr) = do- return . Value $ Func fnname env names expr+evalExprShallow env (ILambdaExpr vwi names expr) = do+ return . Value $ Func vwi env names expr evalExprShallow env (IMemoizedLambdaExpr names body) = do hashRef <- liftIO $ newIORef HL.empty@@ -255,7 +247,15 @@ evalExprShallow env@(Env _ (Just (name, is))) (IFunctionExpr args) = do args' <- mapM (evalExprDeep env . IVarExpr) args >>= mapM extractScalar- return . Value $ ScalarData (SingleTerm 1 [(FunctionData (symbolScalarData' (name ++ concatMap show is)) (map symbolScalarData' args) args' [], 1)])+ is' <- mapM unwrapMaybeFromIndex is+ return . Value $ ScalarData (SingleTerm 1 [(FunctionData (SingleTerm 1 [(Symbol "" name is', 1)]) (map symbolScalarData' args) args', 1)])+ where+ unwrapMaybeFromIndex :: Index (Maybe ScalarData) -> EvalM (Index ScalarData) -- Maybe we can refactor this function+-- unwrapMaybeFromIndex = return . (fmap fromJust)+ unwrapMaybeFromIndex (Sub Nothing) = throwError $ Default "function symbol can be used only with generateTensor"+ unwrapMaybeFromIndex (Sup Nothing) = throwError $ Default "function symbol can be used only with generateTensor"+ unwrapMaybeFromIndex (Sub (Just i)) = return (Sub i)+ unwrapMaybeFromIndex (Sup (Just i)) = return (Sup i) evalExprShallow env (IIfExpr test expr expr') = do test <- evalExprDeep env test >>= fromEgison@@ -267,7 +267,7 @@ where extractBindings :: IBindingExpr -> EvalM [Binding] extractBindings (PDPatVar var, expr) =- makeBindings [var] . (:[]) <$> newThunkRef (memorizeVarInEnv env var) expr+ newThunkRef (memorizeVarInEnv env var) expr >>= makeBindings [var] . (:[]) extractBindings (pdp, expr) = do thunk <- newThunkRef env expr bindPrimitiveDataPattern pdp thunk@@ -314,7 +314,7 @@ evalExprShallow env (IDoExpr bindings expr) = return $ Value $ IOFunc $ do let body = foldr genLet (IApplyExpr expr [IVarExpr "#1"]) bindings- applyObj env (Value $ Func Nothing env ["#1"] body) [WHNF (Value World)]+ applyObj env (Value $ Func Nothing env [stringToVar "#1"] body) [WHNF (Value World)] where genLet (names, expr) expr' = ILetExpr [(PDTuplePat (map PDPatVar [stringToVar "#1", stringToVar "#2"]), IApplyExpr expr [IVarExpr "#1"])] $@@ -405,14 +405,17 @@ evalExprShallow env (IGenerateTensorExpr fnExpr shapeExpr) = do shape <- evalExprDeep env shapeExpr >>= collectionToList ns <- mapM fromEgison shape :: EvalM Shape- xs <- mapM (indexToWHNF env . map toEgison) (enumTensorIndices ns)+ xs <- mapM (evalWithIndex env . map (\n -> SingleTerm n [])) (enumTensorIndices ns) return $ newITensor ns xs where- indexToWHNF :: Env -> [EgisonValue] {- index -} -> EvalM ObjectRef- indexToWHNF (Env frame maybe_vwi) ms = do+ evalWithIndex :: Env -> [ScalarData] {- index -} -> EvalM ObjectRef+ evalWithIndex env@(Env frame maybe_vwi) ms = do let env' = maybe env (\(name, indices) -> Env frame $ Just (name, zipWith changeIndex indices ms)) maybe_vwi fn <- evalExprShallow env' fnExpr- newApplyObjThunkRef env fn (map (WHNF . Value) ms)+ newApplyObjThunkRef env fn [WHNF (Value (Collection (Sq.fromList (map ScalarData ms))))]+ changeIndex :: Index (Maybe a) -> a -> Index (Maybe a) -- Maybe we can refactor this function+ changeIndex (Sup Nothing) m = Sup (Just m)+ changeIndex (Sub Nothing) m = Sub (Just m) evalExprShallow env (ITensorContractExpr tExpr) = do whnf <- evalExprShallow env tExpr@@ -472,7 +475,7 @@ newApplyThunkRef env fn [x, y]) t2 >>= fromTensor _ -> applyObj env fn [WHNF whnf1, WHNF whnf2] -evalExprShallow _ expr = throwError =<< NotImplemented ("evalExprShallow for " ++ show expr) <$> getFuncNameStack+evalExprShallow _ expr = throwErrorWithTrace (NotImplemented ("evalExprShallow for " ++ show expr)) evalExprDeep :: Env -> IExpr -> EvalM EgisonValue evalExprDeep env expr = evalExprShallow env expr >>= evalWHNF@@ -492,7 +495,7 @@ return val evalMemoizedFunc- :: (IORef (HL.HashMap [Integer] WHNFData)) -> Env -> [String] -> IExpr+ :: IORef (HL.HashMap [Integer] WHNFData) -> Env -> [String] -> IExpr -> [EgisonValue] -> EvalM WHNFData evalMemoizedFunc hashRef env names body args = do indices <- mapM fromEgison args@@ -500,7 +503,7 @@ case HL.lookup indices hash of Just whnf -> return whnf Nothing -> do- whnf <- applyObj env (Value (Func Nothing env names body)) (map (WHNF . Value) args)+ whnf <- applyObj env (Value (Func Nothing env (map stringToVar names) body)) (map (WHNF . Value) args) liftIO $ modifyIORef hashRef (HL.insert indices whnf) return whnf @@ -563,13 +566,16 @@ applyRef env' (Value (Func mFuncName env names body)) refs = mLabelFuncName mFuncName $ if | length names == length refs -> do- evalExprShallow (extendEnv env (makeBindings' names refs)) body+ frame <- makeBindings names refs+ evalExprShallow (extendEnv env frame) body | length names > length refs -> do -- Currying let (bound, rest) = splitAt (length refs) names- return . Value $ Func mFuncName (extendEnv env (makeBindings' bound refs)) rest body+ frame <- makeBindings bound refs+ return . Value $ Func mFuncName (extendEnv env frame) rest body | otherwise -> do let (used, rest) = splitAt (length names) refs- func <- evalExprShallow (extendEnv env (makeBindings' names used)) body+ frame <- makeBindings names used+ func <- evalExprShallow (extendEnv env frame) body applyRef env' func rest applyRef _ (Value (CFunc env name body)) refs = do seqRef <- liftIO . newIORef $ Sq.fromList (map IElement refs)@@ -585,14 +591,14 @@ args <- mapM evalRef refs case args of [Value World] -> m- arg : _ -> throwError =<< TypeMismatch "world" arg <$> getFuncNameStack+ arg : _ -> throwErrorWithTrace (TypeMismatch "world" arg) applyRef _ (Value (ScalarData fn@(SingleTerm 1 [(Symbol{}, 1)]))) refs = do args <- mapM (\ref -> evalRef ref >>= evalWHNF) refs mExprs <- mapM (\arg -> case arg of ScalarData _ -> extractScalar arg- _ -> throwError =<< EgisonBug "to use undefined functions, you have to use ScalarData args" <$> getFuncNameStack) args+ _ -> throwErrorWithTrace (EgisonBug "to use undefined functions, you have to use ScalarData args")) args return (Value (ScalarData (SingleTerm 1 [(Apply fn mExprs, 1)])))-applyRef _ whnf _ = throwError =<< TypeMismatch "function" whnf <$> getFuncNameStack+applyRef _ whnf _ = throwErrorWithTrace (TypeMismatch "function" whnf) applyObj :: Env -> WHNFData -> [Object] -> EvalM WHNFData applyObj env fn args = do@@ -609,7 +615,7 @@ IIntHash hash -> irefHash hash ICharHash hash -> irefHash hash IStrHash hash -> irefHash hash- _ -> throwError =<< TypeMismatch "hash" val <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "hash" val) where refHash' hash = do key <- fromEgison index@@ -623,20 +629,6 @@ Just ref -> evalRef ref >>= flip refHash indices Nothing -> return $ Value Undefined -updateHash :: [Integer] -> WHNFData -> WHNFData -> EvalM WHNFData-updateHash [index] tgt (IIntHash hash) = do- targetRef <- newEvaluatedObjectRef tgt- return . IIntHash $ HL.insert index targetRef hash-updateHash (index:indices) tgt (IIntHash hash) = do- val <- maybe (return $ IIntHash HL.empty) evalRef $ HL.lookup index hash- ref <- updateHash indices tgt val >>= newEvaluatedObjectRef- return . IIntHash $ HL.insert index ref hash-updateHash indices tgt (Value (IntHash hash)) = do- let keys = HL.keys hash- vals <- mapM (newEvaluatedObjectRef . Value) $ HL.elems hash- updateHash indices tgt (IIntHash $ HL.fromList $ zip keys vals)-updateHash _ _ v = throwError $ Default $ "expected hash value: " ++ show v- subst :: (Eq a) => a -> b -> [(a, b)] -> [(a, b)] subst k nv ((k', v'):xs) | k == k' = (k', nv):subst k nv xs | otherwise = (k', v'):subst k nv xs@@ -672,7 +664,7 @@ -- Modify |env'| for some cases let env'' = case pd of PDPatVar var -> memorizeVarInEnv env' var- _ -> env'+ _ -> env' thunk <- newThunkRef env'' expr binds <- bindPrimitiveDataPattern pd thunk forM_ binds $ \(var, objref) -> do@@ -684,7 +676,7 @@ memorizeVarInEnv :: Env -> Var -> Env memorizeVarInEnv (Env frame _) (Var var is) =- Env frame (Just (var, map (fmap (const "")) is))+ Env frame (Just (var, map (fmap (\_ -> Nothing)) is)) -- -- Pattern Match@@ -704,14 +696,14 @@ } processMStatesAllDFS :: MList EvalM MatchingState -> EvalM (MList EvalM Match)-processMStatesAllDFS MNil = return MNil+processMStatesAllDFS MNil = return MNil processMStatesAllDFS (MCons (MState _ _ [] bindings []) ms) = MCons bindings . processMStatesAllDFS <$> ms-processMStatesAllDFS (MCons mstate ms) = processMState mstate >>= (`mappend` ms) >>= processMStatesAllDFS+processMStatesAllDFS (MCons mstate ms) = processMState mstate >>= (`mappend` ms) >>= processMStatesAllDFS processMStatesAllDFSForall :: MList EvalM MatchingState -> EvalM (MList EvalM MatchingState)-processMStatesAllDFSForall MNil = return MNil+processMStatesAllDFSForall MNil = return MNil processMStatesAllDFSForall (MCons mstate@(MState _ _ (ForallPatContext _ _ : _) _ []) ms) = MCons mstate . processMStatesAllDFSForall <$> ms-processMStatesAllDFSForall (MCons mstate ms) = processMState mstate >>= (`mappend` ms) >>= processMStatesAllDFSForall+processMStatesAllDFSForall (MCons mstate ms) = processMState mstate >>= (`mappend` ms) >>= processMStatesAllDFSForall processMStatesAll :: [MList EvalM MatchingState] -> EvalM (MList EvalM Match) processMStatesAll [] = return MNil@@ -720,7 +712,7 @@ mappend (fromList matches) $ processMStatesAll streams' processMStates :: MList EvalM MatchingState -> EvalM [MList EvalM MatchingState]-processMStates MNil = return []+processMStates MNil = return [] processMStates (MCons state stream) = (\x y -> [x, y]) <$> processMState state <*> stream extractMatches :: [MList EvalM MatchingState] -> EvalM ([Match], [MList EvalM MatchingState])@@ -735,7 +727,7 @@ gatherBindings :: MatchingState -> Maybe [Binding] gatherBindings MState{ seqPatCtx = [], mStateBindings = b, mTrees = [] } = return b-gatherBindings _ = Nothing+gatherBindings _ = Nothing processMState :: MatchingState -> EvalM (MList EvalM MatchingState) processMState state | nullMState state = processMState' state@@ -754,11 +746,11 @@ processMStatesAllDFSForall (msingleton (MState e' l' (ForallPatContext [] []:s') b' [MAtom p2 tgt' mat']))) states b <- mAny (\case MNil -> return True- _ -> return False) statess'+ _ -> return False) statess' if b then return MNil -- else return MNil- else do nstatess <- mmap (\states' -> mmap (\(MState e' l' (ForallPatContext [] []:s') b' []) -> return $ MState e' l' s' b' trees) states') statess'+ else do nstatess <- mmap (mmap (\(MState e' l' (ForallPatContext [] []:s') b' []) -> return $ MState e' l' s' b' trees)) statess' mconcat nstatess _ -> processMState' state where@@ -772,7 +764,7 @@ where (f, state1, state2) = splitMState state' processMState' :: MatchingState -> EvalM (MList EvalM MatchingState)---processMState' MState{ seqPatCtx = [], mTrees = [] } = throwError =<< EgisonBug "should not reach here (empty matching-state)" <$> getFuncNameStack+--processMState' MState{ seqPatCtx = [], mTrees = [] } = throwErrorWithTrace (EgisonBug "should not reach here (empty matching-state)") processMState' mstate@MState{ seqPatCtx = [], mTrees = [] } = return . msingleton $ mstate -- for forall pattern used in matchAll (not matchAllDFS) -- Sequential patterns and forall pattern@@ -786,7 +778,7 @@ return . msingleton $ mstate -- Matching Nodes---processMState' MState{ mTrees = MNode _ MState{ mStateBindings = [], mTrees = [] }:_ } = throwError =<< EgisonBug "should not reach here (empty matching-node)" <$> getFuncNameStack+--processMState' MState{ mTrees = MNode _ MState{ mStateBindings = [], mTrees = [] }:_ } = throwErrorWithTrace (EgisonBug "should not reach here (empty matching-node)") processMState' mstate@MState{ mTrees = MNode _ MState{ seqPatCtx = [], mTrees = [] }:trees } = return . msingleton $ mstate { mTrees = trees } processMState' ms1@MState{ mTrees = MNode penv ms2@MState{ mTrees = MAtom (IVarPat name) target matcher:trees' }:trees } =@@ -795,7 +787,7 @@ case trees' of [] -> return . msingleton $ ms1 { mTrees = MAtom pattern target matcher:trees } _ -> return . msingleton $ ms1 { mTrees = MAtom pattern target matcher:MNode penv (ms2 { mTrees = trees' }):trees }- Nothing -> throwError =<< UnboundVariable name <$> getFuncNameStack+ Nothing -> throwErrorWithTrace (UnboundVariable name) processMState' ms1@(MState _ _ _ bindings (MNode penv ms2@(MState env' loops' _ _ (MAtom (IIndexedPat (IVarPat name) indices) target matcher:trees')):trees)) = case lookup name penv of@@ -806,7 +798,7 @@ case trees' of [] -> return . msingleton $ ms1 { mTrees = MAtom pattern' target matcher:trees } _ -> return . msingleton $ ms1 { mTrees = MAtom pattern' target matcher:MNode penv (ms2 { mTrees = trees' }):trees }- Nothing -> throwError =<< UnboundVariable name <$> getFuncNameStack+ Nothing -> throwErrorWithTrace (UnboundVariable name) processMState' mstate@MState{ mTrees = MNode penv state:trees } = processMState' state >>= mmap (\state' -> case state' of@@ -828,7 +820,7 @@ _ -> processMState' (mstate { mTrees = MAtom (IInductivePat name args) target matcher:trees }) - INotPat _ -> throwError =<< EgisonBug "should not reach here (not-pattern)" <$> getFuncNameStack+ INotPat _ -> throwErrorWithTrace (EgisonBug "should not reach here (not-pattern)") IVarPat _ -> throwError $ Default $ "cannot use variable except in pattern function:" ++ show pattern ILetPat bindings' pattern' -> do@@ -851,7 +843,7 @@ Value (PatternFunc env'' names expr) -> return . msingleton $ mstate { mTrees = MNode penv (MState env'' [] [] [] [MAtom expr target matcher]) : trees } where penv = zip names args- _ -> throwError =<< TypeMismatch "pattern constructor" func' <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "pattern constructor" func') IDApplyPat func args -> return . msingleton $ mstate { mTrees = MAtom (IInductivePat "apply" [func, toListPat args]) target matcher:trees }@@ -895,7 +887,7 @@ mstate { loopPatCtx = LoopPatContext (name, nextNumRef) cdrEndsRef endPat pat pat':loops', mTrees = MAtom pat target matcher:trees }] | otherwise -> fromList [mstate { loopPatCtx = LoopPatContext (name, nextNumRef) endsRef endPat pat pat':loops', mTrees = MAtom pat target matcher:trees }]- ISeqNilPat -> throwError =<< EgisonBug "should not reach here (seq nil pattern)" <$> getFuncNameStack+ ISeqNilPat -> throwErrorWithTrace (EgisonBug "should not reach here (seq nil pattern)") ISeqConsPat pattern pattern' -> return . msingleton $ MState env loops (SeqPatContext trees pattern' [] []:seqs) bindings [MAtom pattern target matcher] ILaterPatVar -> case seqs of@@ -934,8 +926,8 @@ IIndexedPat _ _ -> return . msingleton $ mstate { mTrees = MAtom pattern target Something:trees } ITuplePat patterns -> do targets <- tupleToListWHNF target- when (length patterns /= length targets) $ throwError =<< TupleLength (length patterns) (length targets) <$> getFuncNameStack- when (length patterns /= length matchers) $ throwError =<< TupleLength (length patterns) (length matchers) <$> getFuncNameStack+ when (length patterns /= length targets) $ throwErrorWithTrace (TupleLength (length patterns) (length targets))+ when (length patterns /= length matchers) $ throwErrorWithTrace (TupleLength (length patterns) (length matchers)) let trees' = zipWith3 MAtom patterns targets matchers ++ trees return . msingleton $ mstate { mTrees = trees' } _ -> throwError $ Default $ "should not reach here. matcher: " ++ show matcher ++ ", pattern: " ++ show pattern@@ -960,16 +952,16 @@ obj <- evalRef ref >>= updateHash indices target >>= newEvaluatedObjectRef return . msingleton $ mstate { mStateBindings = subst name obj bindings, mTrees = trees } Nothing -> do- obj <- updateHash indices target (IIntHash (HL.empty)) >>= newEvaluatedObjectRef+ obj <- updateHash indices target (IIntHash HL.empty) >>= newEvaluatedObjectRef return . msingleton $ mstate { mStateBindings = (name,obj):bindings, mTrees = trees } IIndexedPat pattern _ -> throwError $ Default ("invalid indexed-pattern: " ++ show pattern) ITuplePat patterns -> do targets <- tupleToListWHNF target- when (length patterns /= length targets) $ throwError =<< TupleLength (length patterns) (length targets) <$> getFuncNameStack+ when (length patterns /= length targets) $ throwErrorWithTrace (TupleLength (length patterns) (length targets)) let trees' = zipWith3 MAtom patterns targets (map (const Something) patterns) ++ trees return . msingleton $ mstate { mTrees = trees' } _ -> throwError $ Default $ "something can only match with a pattern variable. not: " ++ show pattern- _ -> throwError =<< EgisonBug ("should not reach here. matcher: " ++ show matcher ++ ", pattern: " ++ show pattern) <$> getFuncNameStack+ _ -> throwErrorWithTrace (EgisonBug ("should not reach here. matcher: " ++ show matcher ++ ", pattern: " ++ show pattern)) inductiveMatch :: Env -> IPattern -> WHNFData -> Matcher -> EvalM ([IPattern], MList EvalM ObjectRef, [Matcher])@@ -997,7 +989,7 @@ evalExprShallow env expr >>= collectionToRefs _ -> cont failPPPatternMatch = throwError (Default "failed primitive pattern pattern match")- failPDPatternMatch = throwError =<< PrimitiveMatchFailure <$> getFuncNameStack+ failPDPatternMatch = throwErrorWithTrace PrimitiveMatchFailure primitivePatPatternMatch :: Env -> PrimitivePatPattern -> IPattern -> MatchM ([IPattern], [Binding])@@ -1020,7 +1012,7 @@ bindPrimitiveDataPattern pdp ref = do r <- runMaybeT $ primitiveDataPatternMatch pdp ref case r of- Nothing -> throwError =<< PrimitiveMatchFailure <$> getFuncNameStack+ Nothing -> throwErrorWithTrace PrimitiveMatchFailure Just binding -> return binding primitiveDataPatternMatch :: IPrimitiveDataPattern -> ObjectRef -> MatchM [Binding]@@ -1062,7 +1054,7 @@ whnf <- lift $ evalRef ref case whnf of Value val | val == evalConstant expr -> return []- _ -> matchFail+ _ -> matchFail extendEnvForNonLinearPatterns :: Env -> [Binding] -> [LoopPatContext] -> Env extendEnvForNonLinearPatterns env bindings loops = extendEnv env $ bindings ++ map (\(LoopPatContext (name, ref) _ _ _ _) -> (stringToVar name, ref)) loops@@ -1075,7 +1067,7 @@ whnfs <- mapM evalRef refs ms <- mapM evalMatcherWHNF whnfs return $ Tuple ms-evalMatcherWHNF whnf = throwError =<< TypeMismatch "matcher" whnf <$> getFuncNameStack+evalMatcherWHNF whnf = throwErrorWithTrace (TypeMismatch "matcher" whnf) -- -- Util@@ -1098,3 +1090,20 @@ tref js' (Tensor ns xs js') >>= tContract' >>= fromTensor where js' = if override then js else is ++ js++makeBindings :: [Var] -> [ObjectRef] -> EvalM [Binding]+makeBindings vs refs = zipWithM makeBinding vs refs >>= return . concat+ where+ makeBinding :: Var -> ObjectRef -> EvalM [Binding]+ makeBinding v@(Var _ []) ref = return [(v, ref)]+ makeBinding v@(Var name is) ref = do+ val <- evalRefDeep ref+ case val of+ TensorData (Tensor _ _ js) -> do+ frame <- pmIndices is js+ return ((v, ref) : frame)+ _ -> throwErrorWithTrace (TypeMismatch "tensor" (Value val))++makeBindings' :: [String] -> [ObjectRef] -> [Binding]+makeBindings' xs = zip (map stringToVar xs)+
hs-src/Language/Egison/Data.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE QuasiQuotes #-} {- | Module : Language.Egison.Data@@ -42,6 +41,7 @@ , refVar -- * Errors , EgisonError (..)+ , throwErrorWithTrace -- * Monads , EvalM , fromEvalM@@ -50,20 +50,20 @@ import Control.Exception -import Control.Monad.Except hiding (join)+import Control.Monad.Except hiding (join) import Control.Monad.Trans.State.Strict -import Data.Foldable (toList)-import Data.HashMap.Strict (HashMap)-import qualified Data.HashMap.Strict as HashMap+import Data.Foldable (toList)+import Data.HashMap.Strict (HashMap)+import qualified Data.HashMap.Strict as HashMap import Data.IORef-import Data.Sequence (Seq)-import qualified Data.Sequence as Sq-import qualified Data.Vector as V+import Data.Sequence (Seq)+import qualified Data.Sequence as Sq+import qualified Data.Vector as V -import Data.List (intercalate)-import Data.Text (Text)-import Text.Show.Unicode (ushow)+import Data.List (intercalate)+import Data.Text (Text)+import Text.Show.Unicode (ushow) import Data.Ratio import System.IO@@ -93,7 +93,7 @@ | CharHash (HashMap Char EgisonValue) | StrHash (HashMap Text EgisonValue) | UserMatcher Env [IPatternDef]- | Func (Maybe String) Env [String] IExpr+ | Func (Maybe Var) Env [Var] IExpr | CFunc Env String IExpr | MemoizedFunc (IORef (HashMap [Integer] WHNFData)) Env [String] IExpr | PatternFunc Env [String] IPattern@@ -157,15 +157,13 @@ f js = Collection (Sq.fromList (map scalarIndexToEgison js)) symbolExprToEgison (Apply fn mExprs, n) = Tuple [InductiveData "Apply" [ScalarData fn, Collection (Sq.fromList (map mathExprToEgison mExprs))], toEgison n] symbolExprToEgison (Quote mExpr, n) = Tuple [InductiveData "Quote" [mathExprToEgison mExpr], toEgison n]-symbolExprToEgison (FunctionData name argnames args js, n) =- Tuple [InductiveData "Function" [ScalarData name, Collection (Sq.fromList (map ScalarData argnames)), Collection (Sq.fromList (map ScalarData args)), f js], toEgison n]- where- f js = Collection (Sq.fromList (map scalarIndexToEgison js))+symbolExprToEgison (FunctionData name argnames args, n) =+ Tuple [InductiveData "Function" [ScalarData name, Collection (Sq.fromList (map ScalarData argnames)), Collection (Sq.fromList (map ScalarData args))], toEgison n] scalarIndexToEgison :: Index ScalarData -> EgisonValue-scalarIndexToEgison (Sup k) = InductiveData "Sup" [ScalarData k]-scalarIndexToEgison (Sub k) = InductiveData "Sub" [ScalarData k]-scalarIndexToEgison (User k) = InductiveData "User" [ScalarData k]+scalarIndexToEgison (Sup k) = InductiveData "Sup" [ScalarData k]+scalarIndexToEgison (Sub k) = InductiveData "Sub" [ScalarData k]+scalarIndexToEgison (User k) = InductiveData "User" [ScalarData k] -- Implementation of 'toMathExpr' (Primitive function) egisonToScalarData :: EgisonValue -> EvalM ScalarData@@ -186,15 +184,15 @@ egisonToScalarData s1@(InductiveData "Function" _) = do s1' <- egisonToSymbolExpr (Tuple [s1, toEgison (1 :: Integer)]) return $ SingleTerm 1 [s1']-egisonToScalarData val = throwError =<< TypeMismatch "math expression" (Value val) <$> getFuncNameStack+egisonToScalarData val = throwErrorWithTrace (TypeMismatch "math expression" (Value val)) egisonToPolyExpr :: EgisonValue -> EvalM PolyExpr egisonToPolyExpr (InductiveData "Plus" [Collection ts]) = Plus <$> mapM egisonToTermExpr (toList ts)-egisonToPolyExpr val = throwError =<< TypeMismatch "math poly expression" (Value val) <$> getFuncNameStack+egisonToPolyExpr val = throwErrorWithTrace (TypeMismatch "math poly expression" (Value val)) egisonToTermExpr :: EgisonValue -> EvalM TermExpr egisonToTermExpr (InductiveData "Term" [n, Collection ts]) = Term <$> fromEgison n <*> mapM egisonToSymbolExpr (toList ts)-egisonToTermExpr val = throwError =<< TypeMismatch "math term expression" (Value val) <$> getFuncNameStack+egisonToTermExpr val = throwErrorWithTrace (TypeMismatch "math term expression" (Value val)) egisonToSymbolExpr :: EgisonValue -> EvalM (SymbolExpr, Integer) egisonToSymbolExpr (Tuple [InductiveData "Symbol" [x, Collection seq], n]) = do@@ -213,22 +211,20 @@ mExpr' <- egisonToScalarData mExpr n' <- fromEgison n return (Quote mExpr', n')-egisonToSymbolExpr (Tuple [InductiveData "Function" [name, Collection argnames, Collection args, Collection seq], n]) = do+egisonToSymbolExpr (Tuple [InductiveData "Function" [name, Collection argnames, Collection args], n]) = do name' <- extractScalar name argnames' <- mapM extractScalar (toList argnames) args' <- mapM extractScalar (toList args)- let js = toList seq- js' <- mapM egisonToScalarIndex js n' <- fromEgison n- return (FunctionData name' argnames' args' js', n')-egisonToSymbolExpr val = throwError =<< TypeMismatch "math symbol expression" (Value val) <$> getFuncNameStack+ return (FunctionData name' argnames' args', n')+egisonToSymbolExpr val = throwErrorWithTrace (TypeMismatch "math symbol expression" (Value val)) egisonToScalarIndex :: EgisonValue -> EvalM (Index ScalarData) egisonToScalarIndex j = case j of InductiveData "Sup" [ScalarData k] -> return (Sup k) InductiveData "Sub" [ScalarData k] -> return (Sub k) InductiveData "User" [ScalarData k] -> return (User k)- _ -> throwError =<< TypeMismatch "math symbol expression" (Value j) <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "math symbol expression" (Value j)) -- -- ExtractScalar@@ -236,7 +232,7 @@ extractScalar :: EgisonValue -> EvalM ScalarData extractScalar (ScalarData mExpr) = return mExpr-extractScalar val = throwError =<< TypeMismatch "math expression" (Value val) <$> getFuncNameStack+extractScalar val = throwErrorWithTrace (TypeMismatch "math expression" (Value val)) -- New-syntax version of EgisonValue pretty printer. -- TODO(momohatt): Don't make it a show instance of EgisonValue.@@ -281,25 +277,25 @@ isAtomic :: EgisonValue -> Bool isAtomic (InductiveData _ []) = True isAtomic (InductiveData _ _) = False-isAtomic (ScalarData m) = isAtom m-isAtomic _ = True+isAtomic (ScalarData m) = isAtom m+isAtomic _ = True instance Eq EgisonValue where- (Char c) == (Char c') = c == c'- (String str) == (String str') = str == str'- (Bool b) == (Bool b') = b == b'- (ScalarData x) == (ScalarData y) = x == y+ (Char c) == (Char c') = c == c'+ (String str) == (String str') = str == str'+ (Bool b) == (Bool b') = b == b'+ (ScalarData x) == (ScalarData y) = x == y (TensorData (Tensor js xs _)) == (TensorData (Tensor js' xs' _)) = js == js' && xs == xs'- (Float x) == (Float x') = x == x'- (InductiveData name vals) == (InductiveData name' vals') = name == name' && vals == vals'- (Tuple vals) == (Tuple vals') = vals == vals'- (Collection vals) == (Collection vals') = vals == vals'- (IntHash vals) == (IntHash vals') = vals == vals'- (CharHash vals) == (CharHash vals') = vals == vals'- (StrHash vals) == (StrHash vals') = vals == vals'+ (Float x) == (Float x') = x == x'+ (InductiveData name vals) == (InductiveData name' vals') = name == name' && vals == vals'+ (Tuple vals) == (Tuple vals') = vals == vals'+ (Collection vals) == (Collection vals') = vals == vals'+ (IntHash vals) == (IntHash vals') = vals == vals'+ (CharHash vals) == (CharHash vals') = vals == vals'+ (StrHash vals) == (StrHash vals') = vals == vals' -- Temporary: searching a better solution- (Func (Just name1) _ _ _) == (Func (Just name2) _ _ _) = name1 == name2- _ == _ = False+ (Func (Just name1) _ _ _) == (Func (Just name2) _ _ _) = name1 == name2+ _ == _ = False -- -- Egison data and Haskell data@@ -311,55 +307,55 @@ instance EgisonData Char where toEgison = Char fromEgison (Char c) = return c- fromEgison val = throwError =<< TypeMismatch "char" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "char" (Value val)) instance EgisonData Text where toEgison = String fromEgison (String str) = return str- fromEgison val = throwError =<< TypeMismatch "string" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "string" (Value val)) instance EgisonData Bool where toEgison = Bool fromEgison (Bool b) = return b- fromEgison val = throwError =<< TypeMismatch "bool" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "bool" (Value val)) instance EgisonData Integer where toEgison 0 = ScalarData (Div (Plus []) (Plus [Term 1 []])) toEgison i = ScalarData (SingleTerm i []) fromEgison (ScalarData (Div (Plus []) (Plus [Term 1 []]))) = return 0- fromEgison (ScalarData (SingleTerm x [])) = return x- fromEgison val = throwError =<< TypeMismatch "integer" (Value val) <$> getFuncNameStack+ fromEgison (ScalarData (SingleTerm x [])) = return x+ fromEgison val = throwErrorWithTrace (TypeMismatch "integer" (Value val)) instance EgisonData Rational where toEgison r = ScalarData $ mathNormalize' (Div (Plus [Term (numerator r) []]) (Plus [Term (denominator r) []]))- fromEgison (ScalarData (Div (Plus []) _)) = return 0+ fromEgison (ScalarData (Div (Plus []) _)) = return 0 fromEgison (ScalarData (Div (Plus [Term x []]) (Plus [Term y []]))) = return (x % y)- fromEgison val = throwError =<< TypeMismatch "rational" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "rational" (Value val)) instance EgisonData Double where toEgison f = Float f fromEgison (Float f) = return f- fromEgison val = throwError =<< TypeMismatch "float" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "float" (Value val)) instance EgisonData Handle where toEgison = Port fromEgison (Port h) = return h- fromEgison val = throwError =<< TypeMismatch "port" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "port" (Value val)) 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+ fromEgison val = throwErrorWithTrace (TypeMismatch "collection" (Value val)) instance EgisonData () where toEgison () = Tuple [] fromEgison (Tuple []) = return ()- fromEgison val = throwError =<< TypeMismatch "zero element tuple" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "zero element tuple" (Value val)) instance (EgisonData a, EgisonData b) => EgisonData (a, b) where toEgison (x, y) = Tuple [toEgison x, toEgison y] fromEgison (Tuple [x, y]) = liftM2 (,) (fromEgison x) (fromEgison y)- fromEgison val = throwError =<< TypeMismatch "two elements tuple" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "two elements tuple" (Value val)) instance (EgisonData a, EgisonData b, EgisonData c) => EgisonData (a, b, c) where toEgison (x, y, z) = Tuple [toEgison x, toEgison y, toEgison z]@@ -368,7 +364,7 @@ y' <- fromEgison y z' <- fromEgison z return (x', y', z')- fromEgison val = throwError =<< TypeMismatch "two elements tuple" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "two elements tuple" (Value val)) instance (EgisonData a, EgisonData b, EgisonData c, EgisonData d) => EgisonData (a, b, c, d) where toEgison (x, y, z, w) = Tuple [toEgison x, toEgison y, toEgison z, toEgison w]@@ -378,12 +374,12 @@ z' <- fromEgison z w' <- fromEgison w return (x', y', z', w')- fromEgison val = throwError =<< TypeMismatch "two elements tuple" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "two elements tuple" (Value val)) instance EgisonData (IORef EgisonValue) where toEgison = RefBox fromEgison (RefBox ref) = return ref- fromEgison val = throwError =<< TypeMismatch "ioRef" (Value val) <$> getFuncNameStack+ fromEgison val = throwErrorWithTrace (TypeMismatch "ioRef" (Value val)) -- -- Internal Data@@ -411,15 +407,15 @@ | ISubCollection ObjectRef instance Show WHNFData where- show (Value val) = show val- show (IInductiveData name _) = "<" ++ name ++ " ...>"- show (ITuple _) = "(...)"- show (ICollection _) = "[...]"- show (IIntHash _) = "{|...|}"- show (ICharHash _) = "{|...|}"- show (IStrHash _) = "{|...|}"+ show (Value val) = show val+ show (IInductiveData name _) = "<" ++ name ++ " ...>"+ show (ITuple _) = "(...)"+ show (ICollection _) = "[...]"+ show (IIntHash _) = "{|...|}"+ show (ICharHash _) = "{|...|}"+ show (IStrHash _) = "{|...|}" show (ITensor (Tensor ns xs _)) = "[|" ++ show (length ns) ++ show (V.length xs) ++ "|]"- show (ITensor (Scalar _)) = "scalar"+ show (ITensor (Scalar _)) = "scalar" instance Show Object where show (Thunk _) = "#<thunk>"@@ -432,21 +428,21 @@ -- Environment -- -data Env = Env [HashMap Var ObjectRef] (Maybe (String, [Index String]))+data Env = Env [HashMap Var ObjectRef] (Maybe (String, [Index (Maybe ScalarData)])) type Binding = (Var, ObjectRef) instance {-# OVERLAPPING #-} Show (Index EgisonValue) where show (Sup i) = case i of ScalarData (SingleTerm 1 [(Symbol _ _ (_:_), 1)]) -> "~[" ++ show i ++ "]"- _ -> "~" ++ show i+ _ -> "~" ++ show i show (Sub i) = case i of ScalarData (SingleTerm 1 [(Symbol _ _ (_:_), 1)]) -> "_[" ++ show i ++ "]"- _ -> "_" ++ show i+ _ -> "_" ++ show i show (SupSub i) = "~_" ++ show i show (User i) = case i of ScalarData (SingleTerm 1 [(Symbol _ _ (_:_), 1)]) -> "_[" ++ show i ++ "]"- _ -> "|" ++ show i+ _ -> "|" ++ show i show (DF i j) = "_d" ++ show i ++ show j nullEnv :: Env@@ -466,7 +462,7 @@ -- Errors -- -type CallStack = [String]+type CallStack = [Var] data EgisonError = UnboundVariable String CallStack@@ -505,7 +501,7 @@ show (Default message) = "Error: " ++ message showTrace :: CallStack -> String-showTrace stack = "\n stack trace: " ++ intercalate ", " stack+showTrace stack = "\n stack trace: " ++ intercalate ", " (map show stack) instance Exception EgisonError @@ -517,8 +513,8 @@ type EvalM = EvalT RuntimeM -instance {-# OVERLAPPING #-} MonadFail EvalM where- fail msg = throwError =<< EgisonBug msg <$> getFuncNameStack+throwErrorWithTrace :: (CallStack -> EgisonError) -> EvalM a+throwErrorWithTrace e = throwError . e =<< getFuncNameStack instance MonadRuntime EvalM where fresh = lift $ lift fresh
hs-src/Language/Egison/Data/Collection.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TupleSections #-} {- | Module : Language.Egison.Data.Collection@@ -18,26 +18,25 @@ , makeICollection ) where -import Control.Monad.Except (throwError, lift, liftIO)-import Control.Monad.Trans.Maybe (runMaybeT)+import Control.Monad.Except (lift, liftIO)+import Control.Monad.Trans.Maybe (runMaybeT) -import Data.Foldable (toList)+import Data.Foldable (toList) import Data.IORef-import Data.Maybe (fromJust)-import Data.Sequence (Seq, ViewL (..), ViewR (..), (><))-import qualified Data.Sequence as Sq+import Data.Maybe (fromJust)+import Data.Sequence (Seq, ViewL (..), ViewR (..), (><))+import qualified Data.Sequence as Sq import Language.Egison.Data import Language.Egison.Data.Utils-import Language.Egison.EvalState (MonadEval(..))-import Language.Egison.Match import Language.Egison.MList+import Language.Egison.Match expandCollection :: WHNFData -> EvalM (Seq Inner) expandCollection (Value (Collection vals)) = mapM (fmap IElement . newEvaluatedObjectRef . Value) vals expandCollection (ICollection innersRef) = liftIO $ readIORef innersRef-expandCollection val = throwError =<< TypeMismatch "collection" val <$> getFuncNameStack+expandCollection val = throwErrorWithTrace (TypeMismatch "collection" val) isEmptyCollection :: WHNFData -> EvalM Bool isEmptyCollection (Value (Collection col)) = return $ Sq.null col@@ -104,11 +103,11 @@ (head, tail) <- fromJust <$> runMaybeT (unconsCollection whnf) tail' <- evalRef tail return $ MCons head (collectionToRefs tail')-collectionToRefs whnf = throwError =<< TypeMismatch "collection" whnf <$> getFuncNameStack+collectionToRefs whnf = throwErrorWithTrace (TypeMismatch "collection" whnf) collectionToList :: EgisonValue -> EvalM [EgisonValue] collectionToList (Collection sq) = return $ toList sq-collectionToList val = throwError =<< TypeMismatch "collection" (Value val) <$> getFuncNameStack+collectionToList val = throwErrorWithTrace (TypeMismatch "collection" (Value val)) makeICollection :: [WHNFData] -> EvalM WHNFData makeICollection xs = do
hs-src/Language/Egison/Data/Utils.hs view
@@ -10,21 +10,24 @@ , evalObj , writeObjectRef , newEvaluatedObjectRef- , makeBindings- , makeBindings' , tupleToRefs , tupleToListWHNF , tupleToList , makeTuple , makeITuple+ , pmIndices+ , updateHash ) where +import Control.Monad import Control.Monad.State (liftIO)+import Control.Monad.Except (throwError) import Data.IORef+import qualified Data.HashMap.Lazy as HL import Language.Egison.Data-import Language.Egison.IExpr (Var, stringToVar)+import Language.Egison.IExpr evalRef :: ObjectRef -> EvalM WHNFData@@ -38,7 +41,7 @@ return val evalObj :: Object -> EvalM WHNFData-evalObj (WHNF val) = return val+evalObj (WHNF val) = return val evalObj (Thunk thunk) = thunk writeObjectRef :: ObjectRef -> WHNFData -> EvalM ()@@ -47,16 +50,10 @@ newEvaluatedObjectRef :: WHNFData -> EvalM ObjectRef newEvaluatedObjectRef = liftIO . newIORef . WHNF -makeBindings :: [Var] -> [ObjectRef] -> [Binding]-makeBindings = zip--makeBindings' :: [String] -> [ObjectRef] -> [Binding]-makeBindings' xs = zip (map stringToVar xs)- tupleToRefs :: WHNFData -> EvalM [ObjectRef]-tupleToRefs (ITuple refs) = return refs+tupleToRefs (ITuple refs) = return refs tupleToRefs (Value (Tuple vals)) = mapM (newEvaluatedObjectRef . Value) vals-tupleToRefs whnf = return <$> newEvaluatedObjectRef whnf+tupleToRefs whnf = return <$> newEvaluatedObjectRef whnf tupleToListWHNF :: WHNFData -> EvalM [WHNFData] tupleToListWHNF (ITuple refs) = mapM evalRef refs@@ -76,3 +73,59 @@ makeITuple [] = return (ITuple []) makeITuple [x] = return x makeITuple xs = ITuple <$> mapM newEvaluatedObjectRef xs++pmIndices :: [Index (Maybe Var)] -> [Index EgisonValue] -> EvalM [Binding]+pmIndices [] [] = return []+pmIndices (MultiSub (Just a) s (Just e):xs) vs = do+ let (vs1, vs2) = span isSub vs+ let l = fromIntegral (length vs1)+ eRef <- newEvaluatedObjectRef (Value (toEgison l))+ let hash = (IIntHash HL.empty)+ hash <- foldM (\hash (i, v) -> updateHash [i] v hash) hash (zip [s..(s + l - 1)] (map (\(Sub v) -> Value v) vs1)) + aRef <- newEvaluatedObjectRef hash+ bs <- pmIndices xs vs2+ return ((a, aRef) : (e, eRef) : bs)+ where+ isSub (Sub _) = True+ isSub _ = False+pmIndices (MultiSup (Just a) s (Just e):xs) vs = do+ let (vs1, vs2) = span isSup vs+ let l = fromIntegral (length vs1)+ eRef <- newEvaluatedObjectRef (Value (toEgison l))+ let hash = (IIntHash HL.empty)+ hash <- foldM (\hash (i, v) -> updateHash [i] v hash) hash (zip [s..(s + l - 1)] (map (\(Sup v) -> Value v) vs1)) + aRef <- newEvaluatedObjectRef hash+ bs <- pmIndices xs vs2+ return ((a, aRef) : (e, eRef) : bs)+ where+ isSup (Sup _) = True+ isSup _ = False++pmIndices (x:xs) (v:vs) = do+ bs <- pmIndex x v+ bs' <- pmIndices xs vs+ return (bs ++ bs')+pmIndices _ _ = throwErrorWithTrace InconsistentTensorIndex++pmIndex :: Index (Maybe Var) -> Index EgisonValue -> EvalM [Binding]+pmIndex (Sub (Just var)) (Sub val) = do+ ref <- newEvaluatedObjectRef (Value val)+ return [(var, ref)]+pmIndex (Sup (Just var)) (Sup val) = do+ ref <- newEvaluatedObjectRef (Value val)+ return [(var, ref)]+pmIndex _ _ = throwErrorWithTrace InconsistentTensorIndex++updateHash :: [Integer] -> WHNFData -> WHNFData -> EvalM WHNFData+updateHash [index] tgt (IIntHash hash) = do+ targetRef <- newEvaluatedObjectRef tgt+ return . IIntHash $ HL.insert index targetRef hash+updateHash (index:indices) tgt (IIntHash hash) = do+ val <- maybe (return $ IIntHash HL.empty) evalRef $ HL.lookup index hash+ ref <- updateHash indices tgt val >>= newEvaluatedObjectRef+ return . IIntHash $ HL.insert index ref hash+updateHash indices tgt (Value (IntHash hash)) = do+ let keys = HL.keys hash+ vals <- mapM (newEvaluatedObjectRef . Value) $ HL.elems hash+ updateHash indices tgt (IIntHash $ HL.fromList $ zip keys vals)+updateHash _ _ v = throwError $ Default $ "expected hash value: " ++ show v
hs-src/Language/Egison/Desugar.hs view
@@ -13,10 +13,10 @@ , desugarExpr ) where -import Control.Monad.Except (throwError)-import Data.Char (toUpper)-import Data.Foldable (foldrM)-import Data.List (union)+import Control.Monad.Except (throwError)+import Data.Char (toUpper)+import Data.Foldable (foldrM)+import Data.List (union) import Language.Egison.AST import Language.Egison.Data@@ -25,11 +25,6 @@ desugarTopExpr :: TopExpr -> EvalM (Maybe ITopExpr)-desugarTopExpr (Define (VarWithIndices name []) expr) = do- expr' <- desugar expr- case expr' of- ILambdaExpr Nothing args body -> return . Just $ IDefine (Var name []) (ILambdaExpr (Just name) args body)- _ -> return . Just $ IDefine (Var name []) expr' desugarTopExpr (Define vwi expr) = do (var, iexpr) <- desugarDefineWithIndices vwi expr return . Just $ IDefine var iexpr@@ -127,39 +122,51 @@ desugar (MatchAllLambdaExpr matcher clauses) = do name <- fresh- ILambdaExpr Nothing [name] <$>+ ILambdaExpr Nothing [stringToVar name] <$> desugar (MatchAllExpr BFSMode (VarExpr name) matcher clauses) desugar (MatchLambdaExpr matcher clauses) = do name <- fresh- ILambdaExpr Nothing [name] <$>+ ILambdaExpr Nothing [stringToVar name] <$> desugar (MatchExpr BFSMode (VarExpr name) matcher clauses) --- TODO: Allow nested MultiSubscript and MultiSuperscript-desugar (IndexedExpr b expr indices) =- case indices of- [MultiSubscript x y] ->- case (x, y) of- (IndexedExpr b1 e1 [n1], IndexedExpr _ _ [n2]) ->- desugarMultiScript ISubrefsExpr b1 e1 n1 n2- _ -> throwError $ Default "Index should be IndexedExpr for multi subscript"- [MultiSuperscript x y] ->- case (x, y) of- (IndexedExpr b1 e1 [n1], IndexedExpr _ _ [n2]) ->- desugarMultiScript ISuprefsExpr b1 e1 n1 n2- _ -> throwError $ Default "Index should be IndexedExpr for multi superscript"- _ -> IIndexedExpr b <$> desugar expr <*> mapM desugarIndex indices+desugar (IndexedExpr b expr indices) = do+ expr' <- desugar expr+ desugarIndexedExpr b expr' indices where- desugarMultiScript refExpr b1 e1 n1 n2 = do+ desugarIndexedExpr :: Bool -> IExpr -> [IndexExpr Expr] -> EvalM IExpr+ desugarIndexedExpr b expr' indices =+ case indices of+ [] -> return expr'+ (MultiSubscript x y:indices') ->+ case (x, y) of+ (IndexedExpr b1 e1 [n1], IndexedExpr _ _ [n2]) -> do+ expr'' <- desugarMultiScript b expr' ISubrefsExpr b1 e1 n1 n2+ desugarIndexedExpr False expr'' indices'+ _ -> throwError $ Default "Index should be IndexedExpr for multi subscript"+ (MultiSuperscript x y:indices') ->+ case (x, y) of+ (IndexedExpr b1 e1 [n1], IndexedExpr _ _ [n2]) -> do+ expr'' <- desugarMultiScript b expr' ISuprefsExpr b1 e1 n1 n2+ desugarIndexedExpr False expr'' indices'+ _ -> throwError $ Default "Index should be IndexedExpr for multi superscript"+ _ -> do+ let (is, indices') = break isMulti indices+ expr'' <- IIndexedExpr b expr' <$> mapM desugarIndex is+ desugarIndexedExpr False expr'' indices'+ desugarMultiScript b expr' refExpr b1 e1 n1 n2 = do k <- fresh n1' <- desugar (extractIndexExpr n1) n2' <- desugar (extractIndexExpr n2) e1' <- desugar e1- expr' <- desugar expr return $ refExpr b expr' (makeIApply "map"- [ILambdaExpr Nothing [k] (IIndexedExpr b1 e1' [Sub (IVarExpr k)]),+ [ILambdaExpr Nothing [stringToVar k] (IIndexedExpr b1 e1' [Sub (IVarExpr k)]), makeIApply "between" [n1', n2']])+ isMulti (MultiSubscript _ _) = True+ isMulti (MultiSuperscript _ _) = True+ isMulti _ = False + desugar (SubrefsExpr bool expr1 expr2) = ISubrefsExpr bool <$> desugar expr1 <*> desugar expr2 @@ -190,7 +197,7 @@ (args', expr') <- foldrM desugarArg ([], expr) args desugar $ LambdaExpr' args' expr' where- desugarArg :: Arg ArgPattern -> ([Arg String], Expr) -> EvalM ([Arg String], Expr)+ desugarArg :: Arg ArgPattern -> ([Arg VarWithIndices], Expr) -> EvalM ([Arg VarWithIndices], Expr) desugarArg (TensorArg x) (args, expr) = do (var, expr') <- desugarArgPat x expr return (TensorArg var : args, expr')@@ -204,50 +211,58 @@ -- Desugar argument patterns. Examples: -- \$(%x, %y) -> expr ==> \$tmp -> let (tmp1, tmp2) := tmp in (\%x %y -> expr) tmp1 tmp2 -- \(x, (y, z)) -> expr ==> \tmp -> let (tmp1, tmp2) := tmp in (\x (y, z) -> expr) tmp1 tmp2- desugarArgPat :: ArgPattern -> Expr -> EvalM (String, Expr)+ -- \%($x :: xs) -> expr ==> \%tmp -> let (tmp1 :: xs) := tmp in (\$x %xs -> expr) tmp1 tmp2+ desugarArgPat :: ArgPattern -> Expr -> EvalM (VarWithIndices, Expr) desugarArgPat APWildCard expr = do tmp <- fresh- return (tmp, LetExpr [Bind PDWildCard (VarExpr tmp)] expr)+ let tmp' = stringToVarWithIndices tmp+ return (tmp', LetExpr [Bind PDWildCard (VarExpr tmp)] expr) desugarArgPat (APPatVar var) expr = return (var, expr) desugarArgPat (APTuplePat args) expr = do tmp <- fresh+ let tmp' = stringToVarWithIndices tmp tmps <- mapM (const fresh) args- return (tmp, LetExpr [Bind (PDTuplePat (map PDPatVar tmps)) (VarExpr tmp)]- (ApplyExpr (LambdaExpr args expr) (map VarExpr tmps)))+ return (tmp', LetExpr [Bind (PDTuplePat (map PDPatVar tmps)) (VarExpr tmp)]+ (ApplyExpr (LambdaExpr args expr) (map VarExpr tmps))) desugarArgPat (APInductivePat ctor args) expr = do tmp <- fresh+ let tmp' = stringToVarWithIndices tmp tmps <- mapM (const fresh) args- return (tmp, LetExpr [Bind (PDInductivePat ctor (map PDPatVar tmps)) (VarExpr tmp)]- (ApplyExpr (LambdaExpr args expr) (map VarExpr tmps)))+ return (tmp', LetExpr [Bind (PDInductivePat ctor (map PDPatVar tmps)) (VarExpr tmp)]+ (ApplyExpr (LambdaExpr args expr) (map VarExpr tmps))) desugarArgPat APEmptyPat expr = do tmp <- fresh- return (tmp, LetExpr [Bind PDEmptyPat (VarExpr tmp)] expr)+ let tmp' = stringToVarWithIndices tmp+ return (tmp', LetExpr [Bind PDEmptyPat (VarExpr tmp)] expr) desugarArgPat (APConsPat arg1 arg2) expr = do tmp <- fresh+ let tmp' = stringToVarWithIndices tmp tmp1 <- fresh tmp2 <- fresh- return (tmp, LetExpr [Bind (PDConsPat (PDPatVar tmp1) (PDPatVar tmp2)) (VarExpr tmp)]- (ApplyExpr (LambdaExpr [arg1, arg2] expr) [VarExpr tmp1, VarExpr tmp2]))+ return (tmp', LetExpr [Bind (PDConsPat (PDPatVar tmp1) (PDPatVar tmp2)) (VarExpr tmp)]+ (ApplyExpr (LambdaExpr [arg1, TensorArg arg2] expr) [VarExpr tmp1, VarExpr tmp2])) desugarArgPat (APSnocPat arg1 arg2) expr = do tmp <- fresh+ let tmp' = stringToVarWithIndices tmp tmp1 <- fresh tmp2 <- fresh- return (tmp, LetExpr [Bind (PDSnocPat (PDPatVar tmp1) (PDPatVar tmp2)) (VarExpr tmp)]- (ApplyExpr (LambdaExpr [arg1, arg2] expr) [VarExpr tmp1, VarExpr tmp2]))+ return (tmp', LetExpr [Bind (PDSnocPat (PDPatVar tmp1) (PDPatVar tmp2)) (VarExpr tmp)]+ (ApplyExpr (LambdaExpr [TensorArg arg1, arg2] expr) [VarExpr tmp1, VarExpr tmp2])) -desugar (LambdaExpr' names expr) = do- let (args', expr') = foldr desugarInvertedArgs ([], expr) names+desugar (LambdaExpr' vwis expr) = do+ let (vwis', expr') = foldr desugarInvertedArgs ([], expr) vwis+ let args' = map varWithIndicesToVar vwis' expr' <- desugar expr' return $ ILambdaExpr Nothing args' expr' where- desugarInvertedArgs :: Arg String -> ([String], Expr) -> ([String], Expr)+ desugarInvertedArgs :: Arg VarWithIndices -> ([VarWithIndices], Expr) -> ([VarWithIndices], Expr) desugarInvertedArgs (TensorArg x) (args, expr) = (x : args, expr) desugarInvertedArgs (ScalarArg x) (args, expr) = (x : args,- TensorMapExpr (LambdaExpr' [TensorArg x] expr) (VarExpr x))+ TensorMapExpr (LambdaExpr' [TensorArg x] expr) (VarExpr (extractNameFromVarWithIndices x))) desugarInvertedArgs (InvertedScalarArg x) (args, expr) = (x : args,- TensorMapExpr (LambdaExpr' [TensorArg x] expr) (FlipIndicesExpr (VarExpr x)))+ TensorMapExpr (LambdaExpr' [TensorArg x] expr) (FlipIndicesExpr (VarExpr (extractNameFromVarWithIndices x)))) desugar (MemoizedLambdaExpr names expr) = IMemoizedLambdaExpr names <$> desugar expr@@ -308,15 +323,15 @@ desugar (SectionExpr op Nothing Nothing) = do x <- fresh y <- fresh- ILambdaExpr Nothing [x, y] <$> desugar (InfixExpr op (VarExpr x) (VarExpr y))+ ILambdaExpr Nothing [stringToVar x, stringToVar y] <$> desugar (InfixExpr op (VarExpr x) (VarExpr y)) desugar (SectionExpr op Nothing (Just expr2)) = do x <- fresh- ILambdaExpr Nothing [x] <$> desugar (InfixExpr op (VarExpr x) expr2)+ ILambdaExpr Nothing [stringToVar x] <$> desugar (InfixExpr op (VarExpr x) expr2) desugar (SectionExpr op (Just expr1) Nothing) = do y <- fresh- ILambdaExpr Nothing [y] <$> desugar (InfixExpr op expr1 (VarExpr y))+ ILambdaExpr Nothing [stringToVar y] <$> desugar (InfixExpr op expr1 (VarExpr y)) desugar SectionExpr{} = throwError $ Default "Cannot reach here: section with both arguments" @@ -362,10 +377,25 @@ desugar (AnonParamExpr n) = return $ IVarExpr ('%' : show n) desugar (AnonParamFuncExpr n expr) = do- expr' <- desugar expr- let lambda = ILambdaExpr Nothing (map (\n -> '%' : show n) [1..n]) expr'+ let args = map (\n -> stringToVarWithIndices ('%' : show n)) [1..n]+ lambda <- desugar $ LambdaExpr' (map TensorArg args) expr return $ ILetRecExpr [(PDPatVar (stringToVar "%0"), lambda)] (IVarExpr "%0") +desugar (AnonTupleParamFuncExpr 1 expr) = do+ lambda <- desugar $ LambdaExpr' [TensorArg (stringToVarWithIndices "%1")] expr+ return $ ILetRecExpr [(PDPatVar (stringToVar "%0"), lambda)] (IVarExpr "%0")+desugar (AnonTupleParamFuncExpr n expr) = do+ let args = map (\n -> stringToVarWithIndices ('%' : show n)) [1..n]+ lambda <- desugar $+ LambdaExpr [TensorArg (APTuplePat $ map (TensorArg . APPatVar) args)] expr+ return $ ILetRecExpr [(PDPatVar (stringToVar "%0"), lambda)] (IVarExpr "%0")++desugar (AnonListParamFuncExpr n expr) = do+ let args' = map (\n -> TensorArg (APPatVar (stringToVarWithIndices ('%' : show n)))) [1..n]+ let args = foldr APConsPat APEmptyPat args'+ lambda <- desugar $ LambdaExpr [TensorArg args] expr+ return $ ILetRecExpr [(PDPatVar (stringToVar "%0"), lambda)] (IVarExpr "%0")+ desugar (QuoteExpr expr) = IQuoteExpr <$> desugar expr @@ -394,20 +424,20 @@ collectNames pats = foldl union [] (map collectName pats) collectName :: Pattern -> [String]- collectName (ForallPat pat1 pat2) = collectName pat1 `union` collectName pat2- collectName (InfixPat _ pat1 pat2) = collectName pat1 `union` collectName pat2- collectName (NotPat pat) = collectName pat- collectName (AndPat pat1 pat2) = collectName pat1 `union` collectName pat2- collectName (OrPat pat1 pat2) = collectName pat1 `union` collectName pat2- collectName (TuplePat pats) = collectNames pats- collectName (InductiveOrPApplyPat _ pats) = collectNames pats- collectName (InductivePat _ pats) = collectNames pats- collectName (PApplyPat _ pats) = collectNames pats- collectName (DApplyPat _ pats) = collectNames pats+ collectName (ForallPat pat1 pat2) = collectName pat1 `union` collectName pat2+ collectName (InfixPat _ pat1 pat2) = collectName pat1 `union` collectName pat2+ collectName (NotPat pat) = collectName pat+ collectName (AndPat pat1 pat2) = collectName pat1 `union` collectName pat2+ collectName (OrPat pat1 pat2) = collectName pat1 `union` collectName pat2+ collectName (TuplePat pats) = collectNames pats+ collectName (InductiveOrPApplyPat _ pats) = collectNames pats+ collectName (InductivePat _ pats) = collectNames pats+ collectName (PApplyPat _ pats) = collectNames pats+ collectName (DApplyPat _ pats) = collectNames pats collectName (LoopPat _ (LoopRange _ _ endNumPat) pat1 pat2) = collectName endNumPat `union` collectName pat1 `union` collectName pat2- collectName (LetPat _ pat) = collectName pat- collectName (IndexedPat (PatVar var) _) = [var]- collectName _ = []+ collectName (LetPat _ pat) = collectName pat+ collectName (IndexedPat (PatVar var) _) = [var]+ collectName _ = [] makeBinding :: String -> IBindingExpr makeBinding var = (PDPatVar (stringToVar var), IHashExpr [])@@ -453,7 +483,7 @@ expr' <- desugar expr case (name, expr') of (PDPatVar var, ILambdaExpr Nothing args body) ->- return (name', ILambdaExpr (Just var) args body)+ return (name', ILambdaExpr (Just (Var var [])) args body) _ -> return (name', expr') desugarBinding (BindWithIndices vwi expr) = do (var, iexpr) <- desugarDefineWithIndices vwi expr@@ -470,6 +500,12 @@ desugarPrimitiveDataMatchClauses = mapM (\(pd, expr) -> (fmap stringToVar pd,) <$> desugar expr) desugarDefineWithIndices :: VarWithIndices -> Expr -> EvalM (Var, IExpr)+desugarDefineWithIndices var@(VarWithIndices _ _) expr@(LambdaExpr _ _) = do+ let var' = varWithIndicesToVar var+ expr' <- desugar expr+ case expr' of+ ILambdaExpr Nothing args body -> return (var', ILambdaExpr (Just var') args body)+ _ -> return (var', expr') desugarDefineWithIndices (VarWithIndices name is) expr = do let (isSubs, indexNames) = unzip $ concatMap extractSubSupIndex is expr <- if any isExtendedIndice is@@ -477,12 +513,24 @@ else return expr body <- desugar expr let indexNamesCollection = ICollectionExpr (map IVarExpr indexNames)- let is' = map (\b -> if b then Sub () else Sup ()) isSubs+ let is' = map (\b -> if b then Sub Nothing else Sup Nothing) isSubs return (Var name is', IWithSymbolsExpr indexNames (ITransposeExpr indexNamesCollection body)) +varWithIndicesToVar :: VarWithIndices -> Var+varWithIndicesToVar (VarWithIndices name is) = Var name (concatMap transVarIndex is)++transVarIndex :: VarIndex -> [Index (Maybe Var)]+transVarIndex (VSubscript x) = [Sub (Just (stringToVar x))]+transVarIndex (VSuperscript x) = [Sup (Just (stringToVar x))]+transVarIndex (VMultiSubscript x s e) = [MultiSub (Just (stringToVar x)) s (Just (stringToVar e))]+transVarIndex (VMultiSuperscript x s e) = [MultiSup (Just (stringToVar x)) s (Just (stringToVar e))]+transVarIndex (VGroupScripts xs) = concatMap transVarIndex xs+transVarIndex (VSymmScripts xs) = concatMap transVarIndex xs+transVarIndex (VAntiSymmScripts xs) = concatMap transVarIndex xs+ extractSubSupIndex :: VarIndex -> [(Bool, String)]-extractSubSupIndex (VSubscript x) = [(True, x)]-extractSubSupIndex (VSuperscript x) = [(False, x)]+extractSubSupIndex (VSubscript x) = [(True, x)]+extractSubSupIndex (VSuperscript x) = [(False, x)] extractSubSupIndex (VGroupScripts xs) = concatMap extractSubSupIndex xs extractSubSupIndex (VSymmScripts xs) = concatMap extractSubSupIndex xs extractSubSupIndex (VAntiSymmScripts xs) = concatMap extractSubSupIndex xs@@ -491,7 +539,7 @@ desugarExtendedIndices indices isSubs indexNames tensorBody = do tensorName <- fresh tensorGenExpr <- f indices (VarExpr tensorName) [] []- let indexFunctionExpr = LambdaExpr' (map TensorArg indexNames) tensorGenExpr+ let indexFunctionExpr = LambdaExpr [TensorArg $ foldr APConsPat APEmptyPat (map (TensorArg . APPatVar) (map stringToVarWithIndices indexNames))] tensorGenExpr let genTensorExpr = GenerateTensorExpr indexFunctionExpr (makeApply "tensorShape" [VarExpr tensorName]) let tensorIndices = zipWith (\isSub name -> if isSub then Subscript (VarExpr name) else Superscript (VarExpr name)) isSubs indexNames return $ LetExpr [Bind (PDPatVar tensorName) tensorBody] (IndexedExpr True genTensorExpr tensorIndices)@@ -507,7 +555,7 @@ symbols <- mapM (const fresh) isSubs let is = zipWith (\x isSub -> (if isSub then Subscript else Superscript) (VarExpr x)) symbols isSubs f indices (IndexedExpr True expr is)- (signs ++ signs') (bindings ++ bindings' ++ [Bind (foldr PDConsPat PDEmptyPat (map PDPatVar symbols)) indices'])+ (signs ++ signs') (bindings ++ bindings' ++ [Bind (foldr (PDConsPat . PDPatVar) PDEmptyPat symbols) indices']) subOrSupScripts :: VarIndex -> [Bool] subOrSupScripts VSubscript{} = [True]
hs-src/Language/Egison/Eval.hs view
@@ -15,14 +15,15 @@ , evalTopExprsNoPrint , runExpr , runTopExpr+ , runTopExprStr , runTopExprs -- * Load Egison files , loadEgisonLibrary , loadEgisonFile ) where -import Control.Monad.Except (throwError)-import Control.Monad.Reader (ask, asks)+import Control.Monad.Except (throwError)+import Control.Monad.Reader (ask, asks) import Control.Monad.State import Language.Egison.AST@@ -30,9 +31,9 @@ import Language.Egison.Core import Language.Egison.Data import Language.Egison.Desugar-import Language.Egison.EvalState (MonadEval(..))+import Language.Egison.EvalState (MonadEval (..)) import Language.Egison.IExpr-import Language.Egison.MathOutput (prettyMath)+import Language.Egison.MathOutput (prettyMath) import Language.Egison.Parser @@ -45,7 +46,7 @@ evalTopExpr env topExpr = do topExpr <- desugarTopExpr topExpr case topExpr of- Nothing -> return (Nothing, env)+ Nothing -> return (Nothing, env) Just topExpr -> evalTopExpr' env topExpr -- | Evaluate an Egison top expression.@@ -98,6 +99,11 @@ runTopExpr env input = readTopExpr input >>= evalTopExpr env +-- | Evaluate an Egison top expression. Input is a Haskell string.+runTopExprStr :: Env -> String -> EvalM (Maybe String, Env)+runTopExprStr env input =+ readTopExpr input >>= evalTopExprStr env+ -- | Evaluate Egison top expressions. Input is a Haskell string. runTopExprs :: Env -> String -> EvalM Env runTopExprs env input =@@ -144,16 +150,16 @@ env' <- recursiveBind env [(name, expr)] return (Nothing, env') evalTopExpr' env (ITest expr) = do- pushFuncName "<stdin>"+ pushFuncName (stringToVar "<stdin>") val <- evalExprDeep env expr popFuncName return (Just val, env) evalTopExpr' env (IExecute expr) = do- pushFuncName "<stdin>"+ pushFuncName (stringToVar "<stdin>") io <- evalExprShallow env expr case io of Value (IOFunc m) -> m >> popFuncName >> return (Nothing, env)- _ -> throwError =<< TypeMismatch "io" io <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "io" io) evalTopExpr' env (ILoad file) = do opts <- ask when (optNoIO opts) $ throwError (Default "No IO support")
hs-src/Language/Egison/EvalState.hs view
@@ -17,20 +17,22 @@ import Control.Monad.Except import Control.Monad.Trans.State.Strict +import Language.Egison.IExpr + newtype EvalState = EvalState -- Names of called functions for improved error message- { funcNameStack :: [String]+ { funcNameStack :: [Var] } initialEvalState :: EvalState initialEvalState = EvalState { funcNameStack = [] } class (Applicative m, Monad m) => MonadEval m where- pushFuncName :: String -> m ()- topFuncName :: m String+ pushFuncName :: Var -> m ()+ topFuncName :: m Var popFuncName :: m ()- getFuncNameStack :: m [String]+ getFuncNameStack :: m [Var] instance Monad m => MonadEval (StateT EvalState m) where pushFuncName name = do@@ -50,7 +52,7 @@ popFuncName = lift popFuncName getFuncNameStack = lift getFuncNameStack -mLabelFuncName :: MonadEval m => Maybe String -> m a -> m a+mLabelFuncName :: MonadEval m => Maybe Var -> m a -> m a mLabelFuncName Nothing m = m mLabelFuncName (Just name) m = do pushFuncName name
hs-src/Language/Egison/IExpr.hs view
@@ -1,7 +1,6 @@-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleInstances #-} {- | Module : Language.Egison.IExpr@@ -21,6 +20,7 @@ , IPrimitiveDataPattern , Var (..) , stringToVar+ , extractNameFromVar , Index (..) , extractSupOrSubIndex , extractIndex@@ -32,14 +32,10 @@ , PDPatternBase (..) ) where -import Data.Hashable (Hashable)+import Data.Hashable import GHC.Generics (Generic) -import Language.Egison.AST ( ConstantExpr (..)- , PMMode (..)- , PrimitivePatPattern (..)- , PDPatternBase (..)- )+import Language.Egison.AST (ConstantExpr (..), PDPatternBase (..), PMMode (..), PrimitivePatPattern (..)) data ITopExpr = IDefine Var IExpr@@ -63,7 +59,7 @@ | IJoinExpr IExpr IExpr | IHashExpr [(IExpr, IExpr)] | IVectorExpr [IExpr]- | ILambdaExpr (Maybe String) [String] IExpr+ | ILambdaExpr (Maybe Var) [Var] IExpr | IMemoizedLambdaExpr [String] IExpr | ICambdaExpr String IExpr | IPatternFunctionExpr [String] IPattern@@ -127,6 +123,8 @@ data Index a = Sub a | Sup a+ | MultiSub a Integer a+ | MultiSup a Integer a | SupSub a | User a | DF Integer Integer@@ -145,14 +143,32 @@ extractIndex (User x) = x extractIndex DF{} = undefined -data Var = Var String [Index ()]+data Var = Var String [Index (Maybe Var)]+ deriving (Generic, Show)++-- for eq and hashable+data Var' = Var' String [Index ()] deriving (Eq, Generic, Show) -instance Hashable (Index ())-instance Hashable Var+instance Eq Var where+ Var name (MultiSup _ _ _:_) == Var name' is' = Var name [] == Var name' is'+ Var name (MultiSub _ _ _:_) == Var name' is' = Var name [] == Var name' is'+ Var name is == Var name' (MultiSup _ _ _:_) = Var name is == Var name' []+ Var name is == Var name' (MultiSub _ _ _:_) = Var name is == Var name' []+ Var name is == Var name' is' = Var' name (map (fmap (\_ -> ())) is) == Var' name' (map (fmap (\_ -> ())) is') +instance Hashable a => Hashable (Index a)+instance Hashable Var'+instance Hashable Var where+ hashWithSalt salt (Var name (MultiSup _ _ _:_)) = hashWithSalt salt (Var' name [])+ hashWithSalt salt (Var name (MultiSub _ _ _:_)) = hashWithSalt salt (Var' name [])+ hashWithSalt salt (Var name is) = hashWithSalt salt (Var' name (map (fmap (\_ -> ())) is))+ stringToVar :: String -> Var stringToVar name = Var name []++extractNameFromVar :: Var -> String+extractNameFromVar (Var name _) = name makeIApply :: String -> [IExpr] -> IExpr makeIApply func args = IApplyExpr (IVarExpr func) args
hs-src/Language/Egison/MList.hs view
@@ -19,8 +19,8 @@ , mAny ) where -import Prelude hiding (mappend, mconcat,) import Data.Sequence (Seq)+import Prelude hiding (mappend, mconcat) data MList m a = MNil | MCons a (m (MList m a))
hs-src/Language/Egison/Match.hs view
@@ -37,7 +37,7 @@ } instance Show MatchingState where- show ms = "(MState " ++ unwords ["_", "_", "_", show (mStateBindings ms), show (mTrees ms)] ++ ")" + show ms = "(MState " ++ unwords ["_", "_", "_", show (mStateBindings ms), show (mTrees ms)] ++ ")" data MatchingTree = MAtom IPattern WHNFData Matcher@@ -53,9 +53,9 @@ | ForallPatContext [Matcher] [WHNFData] nullMState :: MatchingState -> Bool-nullMState MState{ mTrees = [] } = True+nullMState MState{ mTrees = [] } = True nullMState MState{ mTrees = MNode _ state : _ } = nullMState state-nullMState _ = False+nullMState _ = False -- -- Monads
hs-src/Language/Egison/Math.hs view
@@ -27,7 +27,7 @@ , mathNegate ) where -import Language.Egison.Math.Expr import Language.Egison.Math.Arith+import Language.Egison.Math.Expr import Language.Egison.Math.Normalize import Language.Egison.Math.Rewrite
hs-src/Language/Egison/Math/Arith.hs view
@@ -32,8 +32,8 @@ mathMult (Div m1 n1) (Div m2 n2) = mathNormalize' $ Div (mathMultPoly m1 m2) (mathMultPoly n1 n2) mathMultPoly :: PolyExpr -> PolyExpr -> PolyExpr-mathMultPoly (Plus []) (Plus _) = Plus []-mathMultPoly (Plus _) (Plus []) = Plus []+mathMultPoly (Plus []) (Plus _) = Plus []+mathMultPoly (Plus _) (Plus []) = Plus [] mathMultPoly (Plus ts1) (Plus ts2) = foldl mathPlusPoly (Plus []) (map (\(Term a xs) -> Plus (map (\(Term b ys) -> Term (a * b) (xs ++ ys)) ts2)) ts1) mathDiv :: ScalarData -> ScalarData -> ScalarData
hs-src/Language/Egison/Math/Expr.hs view
@@ -45,13 +45,13 @@ , mathNegate ) where -import Prelude hiding (foldr, mappend, mconcat)-import Data.List (intercalate)+import Data.List (intercalate)+import Prelude hiding (foldr, mappend, mconcat) -import Control.Monad ( MonadPlus(..) ) import Control.Egison+import Control.Monad (MonadPlus (..)) -import Language.Egison.IExpr (Index(..))+import Language.Egison.IExpr (Index (..)) -- -- Data@@ -76,7 +76,7 @@ = Symbol Id String [Index ScalarData] | Apply ScalarData [ScalarData] | Quote ScalarData- | FunctionData ScalarData [ScalarData] [ScalarData] [Index ScalarData] -- fnname argnames args indices+ | FunctionData ScalarData [ScalarData] [ScalarData] -- fnname argnames args deriving Eq type Id = String@@ -103,12 +103,12 @@ symbolM :: SymbolM -> p -> Eql symbolM SymbolM _ = Eql -func :: Pattern (PP ScalarData, PP [ScalarData], PP [Index ScalarData])- SymbolM SymbolExpr (ScalarData, [ScalarData], [Index ScalarData])-func _ _ (FunctionData name _ args js) = pure (name, args, js)+func :: Pattern (PP ScalarData, PP [ScalarData])+ SymbolM SymbolExpr (ScalarData, [ScalarData])+func _ _ (FunctionData name _ args) = pure (name, args) func _ _ _ = mzero-funcM :: SymbolM -> SymbolExpr -> (ScalarM, List ScalarM, Multiset Eql)-funcM SymbolM _ = (ScalarM, List ScalarM, Multiset Eql)+funcM :: SymbolM -> SymbolExpr -> (ScalarM, List ScalarM)+funcM SymbolM _ = (ScalarM, List ScalarM) apply :: Pattern (PP String, PP [ScalarData]) SymbolM SymbolExpr (String, [ScalarData]) apply _ _ (Apply (SingleSymbol (Symbol _ fn _)) args) = pure (fn, args)@@ -238,24 +238,25 @@ instance Printable SymbolExpr where isAtom Symbol{} = True isAtom (Apply _ []) = True+ isAtom Quote{} = True isAtom _ = False pretty (Symbol _ (':':':':':':_) []) = "#"- pretty (Symbol _ s []) = s- pretty (Symbol _ s js) = s ++ concatMap show js- pretty (Apply fn mExprs) = unwords (map pretty' (fn : mExprs))- pretty (Quote mExprs) = "'" ++ pretty' mExprs- pretty (FunctionData name _ _ js) = pretty name ++ concatMap show js+ pretty (Symbol _ s []) = s+ pretty (Symbol _ s js) = s ++ concatMap show js+ pretty (Apply fn mExprs) = unwords (map pretty' (fn : mExprs))+ pretty (Quote mExprs) = "`" ++ pretty' mExprs+ pretty (FunctionData name _ _) = pretty name instance Printable TermExpr where isAtom (Term _ []) = True isAtom (Term 1 [_]) = True isAtom _ = False - pretty (Term a []) = show a- pretty (Term 1 xs) = intercalate " * " (map prettyPoweredSymbol xs)+ pretty (Term a []) = show a+ pretty (Term 1 xs) = intercalate " * " (map prettyPoweredSymbol xs) pretty (Term (-1) xs) = "- " ++ intercalate " * " (map prettyPoweredSymbol xs)- pretty (Term a xs) = intercalate " * " (show a : map prettyPoweredSymbol xs)+ pretty (Term a xs) = intercalate " * " (show a : map prettyPoweredSymbol xs) prettyPoweredSymbol :: (SymbolExpr, Integer) -> String prettyPoweredSymbol (x, 1) = show x
hs-src/Language/Egison/Math/Normalize.hs view
@@ -122,7 +122,7 @@ f [] = [] f (t:ts) = match dfs (t, ts) (Pair TermM (Multiset TermM))- [ [mc| (term $a $xs, term $b ($ys & equalMonomial $sgn #xs) : $tss) ->- f (Term (sgn * a + b) ys : tss) |]+ [ [mc| (term $a $xs, term $b (equalMonomial $sgn #xs) : $tss) ->+ f (Term (sgn * a + b) xs : tss) |] , [mc| _ -> t : f ts |] ]
hs-src/Language/Egison/Math/Rewrite.hs view
@@ -164,13 +164,9 @@ let d@(Term c z) = termsGcd [Term n x, Term m y] Term n' x' = mathDivideTerm (Term n x) d Term m' y' = mathDivideTerm (Term m y) d- sqrtxy = (if x' == [] then [] else [(makeApply "sqrt" [SingleTerm 1 x'], 1)]) ++ - (if y' == [] then [] else [(makeApply "sqrt" [SingleTerm 1 y'], 1)])- in mathMult- (SingleTerm c z)- (SingleTerm- a- ((makeApply "sqrt" [SingleTerm (n' * m') []], 1) : sqrtxy ++ xss)) |]+ in case (n' * m', Term n' x', Term m' y') of+ (1, Term _ [], Term _ []) -> mathMult (SingleTerm c z) (SingleTerm a xss)+ (_, _, _) -> mathMult (SingleTerm c z) (SingleTerm a ((makeApply "sqrt" [SingleTerm (n' * m') (x' ++ y')], 1) : xss)) |] , [mc| _ -> SingleTerm a xs |] ] @@ -186,7 +182,7 @@ ] rewriteRtu :: ScalarData -> ScalarData-rewriteRtu = mapTerms f+rewriteRtu = mapTerms' g . mapTerms f where f term@(Term a xs) = match dfs xs (Multiset (Pair SymbolM Eql))@@ -194,6 +190,14 @@ Term a ((rtun, k `mod` n) : r) |] , [mc| _ -> term |] ]+ g (Term a xs) =+ match dfs xs (Multiset (Pair SymbolM Eql))+ [ [mc| (apply #"rtu" [singleTerm $n #1 []] & $rtun, ?(== n - 1)) : $mr ->+ mathMult+ (foldl mathMinus (SingleTerm (-1) []) (map (\k -> SingleTerm 1 [(rtun, k)]) [1..(n-2)]))+ (g (Term a mr)) |]+ , [mc| _ -> SingleTerm a xs |]+ ] rewriteDd :: ScalarData -> ScalarData rewriteDd (Div (Plus p1) (Plus p2)) =@@ -201,8 +205,8 @@ where rewriteDdPoly poly = match dfs poly (Multiset TermM)- [ [mc| term $a (($f & func $g $arg $js, $n) : $mr) :- term $b ((func #g #arg #js, #n) : #mr) : $pr ->+ [ [mc| term $a (($f & func $g $arg, $n) : $mr) :+ term $b ((func #g #arg, #n) : #mr) : $pr -> rewriteDdPoly (Term (a + b) ((f, n) : mr) : pr) |] , [mc| _ -> poly |] ]
hs-src/Language/Egison/Parser.hs view
@@ -20,21 +20,21 @@ , removeShebang , readUTF8File ) where- -import Control.Monad.Except (lift, liftIO, throwError)-import Control.Monad.State (unless)-import Control.Monad.Reader (asks, local) -import System.Directory (doesFileExist, getHomeDirectory)+import Control.Monad.Except (lift, liftIO, throwError)+import Control.Monad.Reader (asks, local)+import Control.Monad.State (unless)++import System.Directory (doesFileExist, getHomeDirectory) import System.IO import Language.Egison.AST import Language.Egison.CmdOptions import Language.Egison.Data+import qualified Language.Egison.Parser.NonS as NonS+import qualified Language.Egison.Parser.SExpr as SExpr import Language.Egison.RState-import qualified Language.Egison.Parser.SExpr as SExpr-import qualified Language.Egison.Parser.NonS as NonS-import Paths_egison (getDataFileName)+import Paths_egison (getDataFileName) readTopExprs :: String -> EvalM [TopExpr] readTopExprs expr = do
hs-src/Language/Egison/Parser/NonS.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE NamedFieldPuns #-} {- | Module : Language.Egison.Parser.NonS@@ -23,8 +22,9 @@ import Data.Char (isAsciiUpper, isLetter) import Data.Either (isRight)+import Data.Function (on) import Data.Functor (($>))-import Data.List (groupBy, insertBy)+import Data.List (groupBy, insertBy, sortOn) import Data.Maybe (isJust, isNothing) import Data.Text (pack) @@ -33,7 +33,7 @@ import Text.Megaparsec.Char import qualified Text.Megaparsec.Char.Lexer as L -import Language.Egison.AST hiding (Assoc(..))+import Language.Egison.AST hiding (Assoc (..)) import qualified Language.Egison.AST as E import Language.Egison.RState @@ -122,7 +122,7 @@ return (InfixDecl isPattern newop) where check :: String -> Parser String- check ('!':_) = fail $ "cannot declare infix starting with '!'"+ check ('!':_) = fail "cannot declare infix starting with '!'" check x | x `elem` reservedOp = fail $ show x ++ " cannot be a new infix" | otherwise = return x @@ -151,7 +151,7 @@ body <- exprWithoutWhere bindings <- optional (reserved "where" >> alignSome binding) return $ case bindings of- Nothing -> body+ Nothing -> body Just bindings -> LetRecExpr bindings body exprWithoutWhere :: Parser Expr@@ -186,7 +186,8 @@ makeExprTable :: [Op] -> [[Operator Parser Expr]] makeExprTable ops = -- Generate binary operator table from |ops|- map (map toOperator) (groupBy (\x y -> priority x == priority y) ops)+ reverse $ map (map snd) $ groupBy ((==) `on` fst) $ sortOn fst $+ (infixFuncOpPriority, infixFuncOperator) : map (\op -> (priority op, toOperator op)) ops where -- notFollowedBy (in unary and binary) is necessary for section expression. unary :: String -> Parser (Expr -> Expr)@@ -207,6 +208,17 @@ E.InfixN -> InfixN (binary op) E.Prefix -> Prefix (unary (repr op)) + infixFuncOperator :: Operator Parser Expr+ infixFuncOperator = InfixL $ InfixExpr <$> infixFuncOp++infixFuncOp :: Parser Op+infixFuncOp = do+ func <- try (indented >> between (symbol "`") (symbol "`") ident)+ return $ Op { repr = func, priority = infixFuncOpPriority, assoc = E.InfixL, isWedge = False }++infixFuncOpPriority :: Int+infixFuncOpPriority = 7+ ifExpr :: Parser Expr ifExpr = reserved "if" >> IfExpr <$> expr <* reserved "then" <*> expr <* reserved "else" <*> expr @@ -266,7 +278,12 @@ argPatternAtom = APWildCard <$ symbol "_" <|> APTuplePat <$> parens (sepBy arg comma)- <|> APPatVar <$> ident+ <|> collectionPattern+ <|> APPatVar <$> varWithIndicesLiteral+ where+ collectionPattern = brackets $ do+ elems <- sepBy arg comma+ return $ foldr APConsPat APEmptyPat elems letExpr :: Parser Expr letExpr = do@@ -388,7 +405,7 @@ leftSection :: Parser Expr leftSection = do ops <- gets exprOps- op <- choice $ map (infixLiteral . repr) ops+ op <- choice $ infixFuncOp : map (infixLiteral . repr) ops rarg <- optional expr case rarg of -- Disabling for now... (See issue 159)@@ -402,7 +419,7 @@ rightSection = do ops <- gets exprOps larg <- opExpr- op <- choice $ map (infixLiteral . repr) ops+ op <- choice $ infixFuncOp : map (infixLiteral . repr) ops case larg of -- InfixExpr op' _ _ -- | assoc op' /= InfixL && priority op >= priority op' ->@@ -457,7 +474,9 @@ -- Atomic expressions without index atomExpr' :: Parser Expr-atomExpr' = anonParamFuncExpr -- must come before |constantExpr|+atomExpr' = anonParamFuncExpr -- must come before |constantExpr|+ <|> anonTupleParamFuncExpr -- must come before |tupleOrParenExpr|+ <|> anonListParamFuncExpr -- must come before |collectionExpr| <|> ConstantExpr <$> constantExpr <|> FreshVarExpr <$ symbol "#" <|> VarExpr <$> ident@@ -465,8 +484,8 @@ <|> collectionExpr <|> tupleOrParenExpr <|> hashExpr- <|> QuoteExpr <$> (char '\'' >> atomExpr') -- must come after |constantExpr|- <|> QuoteSymbolExpr <$> (char '`' >> atomExpr')+ <|> QuoteExpr <$> (try (symbol "`" <* notFollowedBy ident) >> atomExpr') -- must come after |constantExpr|+ <|> QuoteSymbolExpr <$> try (char '\'' >> atomExpr') <|> AnonParamExpr <$> try (char '%' >> positiveIntegerLiteral) <?> "atomic expression" @@ -476,6 +495,16 @@ body <- atomExpr -- No space after '#' return $ AnonParamFuncExpr n body +anonTupleParamFuncExpr :: Parser Expr+anonTupleParamFuncExpr = do+ n <- try (char '(' *> L.decimal <* string ")#")+ AnonTupleParamFuncExpr n <$> atomExpr++anonListParamFuncExpr :: Parser Expr+anonListParamFuncExpr = do+ n <- try (char '[' *> L.decimal <* string "]#")+ AnonListParamFuncExpr n <$> atomExpr+ constantExpr :: Parser ConstantExpr constantExpr = numericExpr <|> BoolExpr <$> boolLiteral@@ -683,11 +712,24 @@ lexeme (VarWithIndices <$> ident' <*> some varIndex) varIndex :: Parser VarIndex-varIndex = (char '_' >> VSubscript <$> ident')- <|> (char '~' >> VSuperscript <$> ident')+varIndex = (char '_' >> subscript)+ <|> (char '~' >> supscript) <|> parens (VGroupScripts <$> some varIndex) <|> braces (VSymmScripts <$> some varIndex) <|> brackets (VAntiSymmScripts <$> some varIndex)+ where+ subscript = VSubscript <$> ident'+ <|> (do+ (n, s) <- parens $ (,) <$> ident' <*> (char '_' >> positiveIntegerLiteral)+ _ <- string "..." >> char '_'+ e <- parens $ string n >> char '_' >> ident'+ return (VMultiSubscript n s e))+ supscript = VSuperscript <$> ident'+ <|> (do+ (n, s) <- parens $ (,) <$> ident' <*> (char '_' >> positiveIntegerLiteral)+ _ <- string "..." >> char '~'+ e <- parens $ string n >> char '_' >> ident'+ return (VMultiSuperscript n s e)) patVarLiteral :: Parser String patVarLiteral = char '$' >> ident
hs-src/Language/Egison/Parser/SExpr.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE ViewPatterns #-}-{-# OPTIONS_GHC -Wno-all #-} -- Since we will soon deprecate this parser+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -Wno-all #-} -- Since we will soon deprecate this parser {- | Module : Language.Egison.Parser.SExpr@@ -18,21 +17,20 @@ , parseExpr ) where -import Control.Applicative (pure, (*>), (<$>), (<*), (<*>))-import Control.Monad.Except (throwError)-import Control.Monad.Identity (Identity)+import Control.Applicative (pure, (*>), (<$>), (<*), (<*>))+import Control.Monad.Except (throwError)+import Control.Monad.Identity (Identity) -import Data.Char (isLower, isUpper, toUpper)+import Data.Char (isLower, isUpper, toUpper) import Data.Either-import Data.Functor (($>))-import Data.List.Split (splitOn)+import Data.Functor (($>)) import Data.Ratio-import qualified Data.Set as Set-import qualified Data.Text as T+import qualified Data.Set as Set+import qualified Data.Text as T import Text.Parsec import Text.Parsec.String-import qualified Text.Parsec.Token as P+import qualified Text.Parsec.Token as P import Language.Egison.AST @@ -195,12 +193,12 @@ isElementExpr _ = False f :: [Expr] -> [InnerExpr] -> Expr- f xs [] = CollectionExpr xs- f xs [ElementExpr y] = CollectionExpr (xs ++ [y])- f [] [SubCollectionExpr y] = y- f [x] [SubCollectionExpr y] = ConsExpr x y- f xs [SubCollectionExpr y] = JoinExpr (CollectionExpr xs) y- f xs (ElementExpr y : ys) = f (xs ++ [y]) ys+ f xs [] = CollectionExpr xs+ f xs [ElementExpr y] = CollectionExpr (xs ++ [y])+ f [] [SubCollectionExpr y] = y+ f [x] [SubCollectionExpr y] = ConsExpr x y+ f xs [SubCollectionExpr y] = JoinExpr (CollectionExpr xs) y+ f xs (ElementExpr y : ys) = f (xs ++ [y]) ys f [] (SubCollectionExpr y : ys) = JoinExpr y (f [] ys) f [x] (SubCollectionExpr y : ys) = ConsExpr x (JoinExpr y (f [] ys)) f xs (SubCollectionExpr y : ys) = JoinExpr (CollectionExpr xs) (JoinExpr y (f [] ys))@@ -385,7 +383,7 @@ <|> try (TensorArg <$> (char '%' >> argPattern)) argPattern :: Parser ArgPattern-argPattern = APPatVar <$> ident+argPattern = APPatVar <$> identVarWithIndices seqExpr :: Parser Expr seqExpr = keywordSeq >> SeqExpr <$> expr <*> expr@@ -404,7 +402,7 @@ let n = toInteger (length vars) args' = f args 1 in return $ AnonParamFuncExpr n $ ApplyExpr func args'- | all (not . null) vars ->+ | not (any null vars) -> let ns = Set.fromList $ map read vars n = Set.size ns in if Set.findMin ns == 1 && Set.findMax ns == n@@ -417,9 +415,9 @@ arg = try (Right <$> expr) <|> char '$' *> (Left <$> option "" index) index = (:) <$> satisfy (\c -> '1' <= c && c <= '9') <*> many digit- f [] _ = []- f (Left _ : args) n = AnonParamExpr n : f args (n + 1)- f (Right expr : args) n = expr : f args n+ f [] _ = []+ f (Left _ : args) n = AnonParamExpr n : f args (n + 1)+ f (Right expr : args) n = expr : f args n g (Left arg) = AnonParamExpr (read arg) g (Right expr) = expr @@ -859,8 +857,17 @@ , ("rdc", "init") ] +splitOn :: Eq a => a -> [a] -> [[a]]+splitOn sep list =+ case span (/= sep) list of+ ([], []) -> []+ ([], _ : t) -> splitOn sep t+ (h, []) -> [h]+ (h, _ : t) -> h : splitOn sep t+ -- Translate identifiers for Non-S syntax toCamelCase :: String -> String+toCamelCase "-" = "-" toCamelCase "-'" = "-'" toCamelCase "f.-'" = "f.-'" toCamelCase "b.." = "b."@@ -870,8 +877,8 @@ toCamelCase (reverse -> 'm':'/':xs) = toCamelCase (reverse xs ++ "-as") toCamelCase x =- let heads:tails = splitOn "-" x+ let heads:tails = splitOn '-' x in concat $ heads : map capitalize tails where- capitalize [] = "-"+ capitalize [] = "-" capitalize (x:xs) = toUpper x : xs
hs-src/Language/Egison/Pretty.hs view
@@ -1,8 +1,6 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-orphans #-} {- |@@ -18,11 +16,11 @@ , showTSV ) where -import Data.Foldable (toList)-import Data.List (intercalate)+import Data.Foldable (toList)+import Data.List (intercalate) import Data.Text.Prettyprint.Doc import Data.Text.Prettyprint.Doc.Render.String (renderString)-import Text.Show.Unicode (ushow)+import Text.Show.Unicode (ushow) import Language.Egison.AST import Language.Egison.Data@@ -51,8 +49,8 @@ pretty (BoolExpr x) = pretty x pretty (IntegerExpr x) = pretty x pretty (FloatExpr x) = pretty x- pretty SomethingExpr = pretty "something"- pretty UndefinedExpr = pretty "undefined"+ pretty SomethingExpr = pretty "something"+ pretty UndefinedExpr = pretty "undefined" instance Pretty Expr where pretty (ConstantExpr c) = pretty c@@ -194,8 +192,8 @@ pretty (VarWithIndices xs is) = pretty xs <> hcat (map pretty is) instance Pretty VarIndex where- pretty (VSubscript x) = pretty ('_' : x)- pretty (VSuperscript x) = pretty ('~' : x)+ pretty (VSubscript x) = pretty ('_' : x)+ pretty (VSuperscript x) = pretty ('~' : x) pretty (VSymmScripts xs) = pretty '{' <> hcat (map pretty xs) <> pretty '}' pretty (VAntiSymmScripts xs) = pretty '[' <> hcat (map pretty xs) <> pretty ']' @@ -217,12 +215,12 @@ pretty _ = undefined instance (Pretty a, Complex a) => Pretty (IndexExpr a) where- pretty (Subscript i) = pretty '_' <> pretty' i- pretty (Superscript i) = pretty '~' <> pretty' i- pretty (SupSubscript i) = pretty "~_" <> pretty' i- pretty (MultiSubscript i j) = pretty '_' <> pretty' i <> pretty "..._" <> pretty' j+ pretty (Subscript i) = pretty '_' <> pretty' i+ pretty (Superscript i) = pretty '~' <> pretty' i+ pretty (SupSubscript i) = pretty "~_" <> pretty' i+ pretty (MultiSubscript i j) = pretty '_' <> pretty' i <> pretty "..._" <> pretty' j pretty (MultiSuperscript i j) = pretty '~' <> pretty' i <> pretty "...~" <> pretty' j- pretty (Userscript i) = pretty '|' <> pretty' i+ pretty (Userscript i) = pretty '|' <> pretty' i instance Pretty Pattern where pretty WildCard = pretty "_"@@ -259,9 +257,9 @@ pretty SeqNilPat = pretty "{}" pretty (SeqConsPat p1 p2) = listoid "{" "}" (f p1 p2) where- f p1 SeqNilPat = [pretty p1]+ f p1 SeqNilPat = [pretty p1] f p1 (SeqConsPat p2 p3) = pretty p1 : f p2 p3- f p1 p2 = [pretty p1, pretty p2]+ f p1 p2 = [pretty p1, pretty p2] pretty LaterPatVar = pretty "@" pretty (DApplyPat p ps) = applyLike (map pretty' (p : ps)) pretty e = pretty (show e)@@ -273,21 +271,21 @@ pretty (LoopRange from to pat) = tupled [pretty from, pretty to, pretty pat] instance Pretty PrimitivePatPattern where- pretty PPWildCard = pretty "_"- pretty PPPatVar = pretty "$"- pretty (PPValuePat x) = pretty ('#' : '$' : x)+ pretty PPWildCard = pretty "_"+ pretty PPPatVar = pretty "$"+ pretty (PPValuePat x) = pretty ('#' : '$' : x) pretty (PPInductivePat x pppats) = hsep (pretty x : map pretty pppats)- pretty (PPTuplePat pppats) = tupled (map pretty pppats)+ pretty (PPTuplePat pppats) = tupled (map pretty pppats) instance Pretty PrimitiveDataPattern where- pretty PDWildCard = pretty "_"- pretty (PDPatVar x) = pretty x+ pretty PDWildCard = pretty "_"+ pretty (PDPatVar x) = pretty x pretty (PDInductivePat x pdpats) = applyLike (pretty x : map pretty' pdpats)- pretty (PDTuplePat pdpats) = tupled (map pretty pdpats)- pretty PDEmptyPat = pretty "[]"- pretty (PDConsPat pdp1 pdp2) = pretty'' pdp1 <+> pretty "::" <+> pretty'' pdp2- pretty (PDSnocPat pdp1 pdp2) = applyLike [pretty "snoc", pretty' pdp1, pretty' pdp2]- pretty (PDConstantPat expr) = pretty expr+ pretty (PDTuplePat pdpats) = tupled (map pretty pdpats)+ pretty PDEmptyPat = pretty "[]"+ pretty (PDConsPat pdp1 pdp2) = pretty'' pdp1 <+> pretty "::" <+> pretty'' pdp2+ pretty (PDSnocPat pdp1 pdp2) = applyLike [pretty "snoc", pretty' pdp1, pretty' pdp2]+ pretty (PDConstantPat expr) = pretty expr instance Pretty Op where pretty op | isWedge op = pretty ("!" ++ repr op)@@ -338,11 +336,11 @@ isAtom TransposeExpr{} = False isAtom _ = True - isAtomOrApp ApplyExpr{} = True- isAtomOrApp e = isAtom e+ isAtomOrApp ApplyExpr{} = True+ isAtomOrApp e = isAtom e - isInfix InfixExpr{} = True- isInfix _ = False+ isInfix InfixExpr{} = True+ isInfix _ = False instance Complex a => Complex (Arg a) where isAtom (TensorArg x) = isAtom x@@ -363,11 +361,11 @@ isInfix _ = False instance Complex Pattern where- isAtom (LetPat _ _) = False+ isAtom LetPat{} = False isAtom (InductivePat _ []) = True isAtom (InductivePat _ _) = False- isAtom (InfixPat _ _ _) = False- isAtom (LoopPat _ _ _ _) = False+ isAtom InfixPat{} = False+ isAtom LoopPat{} = False isAtom (PApplyPat _ []) = True isAtom (PApplyPat _ _) = False isAtom _ = True@@ -382,8 +380,8 @@ instance Complex PrimitiveDataPattern where isAtom (PDInductivePat _ []) = True isAtom (PDInductivePat _ _) = False- isAtom (PDConsPat _ _) = False- isAtom (PDSnocPat _ _) = False+ isAtom PDConsPat{} = False+ isAtom PDSnocPat{} = False isAtom _ = True isAtomOrApp PDInductivePat{} = True@@ -404,7 +402,7 @@ -- Display "hoge" instead of "() := hoge" prettyDoBinds :: BindingExpr -> Doc ann prettyDoBinds (Bind (PDTuplePat []) expr) = pretty expr-prettyDoBinds bind = pretty "let" <+> pretty bind+prettyDoBinds bind = pretty "let" <+> pretty bind prettyMatch :: Expr -> [MatchClause] -> Doc ann prettyMatch matcher clauses =@@ -449,8 +447,8 @@ 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+showTSV (Collection vals) = intercalate "\t" (map show (toList vals))+showTSV val = show val -- -- Pretty printer for error messages
hs-src/Language/Egison/PrettyMath/AST.hs view
@@ -13,12 +13,12 @@ , parseExpr ) where -import Data.Foldable (toList)+import Data.Foldable (toList) import Text.ParserCombinators.Parsec hiding (spaces) -import qualified Language.Egison.Data as E-import qualified Language.Egison.IExpr as E-import qualified Language.Egison.Math.Expr as E+import qualified Language.Egison.Data as E+import qualified Language.Egison.IExpr as E+import qualified Language.Egison.Math.Expr as E data MathExpr = Atom String [MathIndex]@@ -49,19 +49,24 @@ toMathExpr :: a -> MathExpr instance ToMathExpr E.EgisonValue where- toMathExpr (E.ScalarData s) = toMathExpr s- toMathExpr (E.Tuple es) = Tuple (map toMathExpr es)+ toMathExpr (E.ScalarData s) = toMathExpr s+ toMathExpr (E.Tuple es) = Tuple (map toMathExpr es) toMathExpr (E.Collection es) = Collection (map toMathExpr (toList es))- toMathExpr (E.TensorData t) = toMathExpr t- toMathExpr e = Atom (show e) []+ toMathExpr (E.TensorData t) = toMathExpr t+ toMathExpr e = Atom (show e) [] instance ToMathExpr a => ToMathExpr (E.Tensor a) where- toMathExpr (E.Scalar _) = undefined- toMathExpr (E.Tensor _ xs js) = Tensor (map toMathExpr (toList xs)) (map toMathIndex js)+ toMathExpr (E.Scalar _) = undefined+ toMathExpr (E.Tensor [_] xs js) = Tensor (map toMathExpr (toList xs)) (map toMathIndex js)+ toMathExpr (E.Tensor [_, n] xs js) = Tensor (f (fromIntegral n) (map toMathExpr (toList xs))) (map toMathIndex js)+ where+ f _ [] = []+ f n xs = Tensor (take n xs) [] : f n (drop n xs)+ toMathExpr (E.Tensor _ _ _) = undefined instance ToMathExpr E.ScalarData where toMathExpr (E.Div p (E.Plus [E.Term 1 []])) = toMathExpr p- toMathExpr (E.Div p1 p2) = Div (toMathExpr p1) (toMathExpr p2)+ toMathExpr (E.Div p1 p2) = Div (toMathExpr p1) (toMathExpr p2) instance ToMathExpr E.PolyExpr where toMathExpr (E.Plus []) = Atom "0" []@@ -100,12 +105,21 @@ (Atom "^" [], [x, y]) -> Power (toMathExpr x) (toMathExpr y) _ -> Func (toMathExpr fn) (map toMathExpr mExprs) toMathExpr (E.Quote mExpr) = Quote (toMathExpr mExpr)- toMathExpr (E.FunctionData _ _ _ _) = undefined -- TODO+ toMathExpr (E.FunctionData (E.SingleTerm 1 [(E.Symbol _ s js, 1)]) _ _) = toMathExpr' js (Atom s [])+ where+ toMathExpr' [] acc = acc+ toMathExpr' (E.User x:js) (Partial e ps) =+ toMathExpr' js (Partial e (ps ++ [toMathExpr x]))+ toMathExpr' (E.User x:js) e@Atom{} =+ toMathExpr' js (Partial e [toMathExpr x])+ toMathExpr' (j:js) (Atom e is) =+ toMathExpr' js (Atom e (is ++ [toMathIndex j]))+ toMathExpr' _ _ = undefined -- TODO toMathIndex :: ToMathExpr a => E.Index a -> MathIndex toMathIndex (E.Sub x) = Sub (toMathExpr x) toMathIndex (E.Sup x) = Super (toMathExpr x)-toMathIndex _ = undefined -- TODO+toMathIndex _ = undefined -- TODO -- -- Parser
hs-src/Language/Egison/PrettyMath/AsciiMath.hs view
@@ -7,7 +7,7 @@ ( showMathExpr ) where -import Data.List (intercalate)+import Data.List (intercalate) import Language.Egison.PrettyMath.AST @@ -18,11 +18,11 @@ showMathExpr (Plus (x:xs)) = showMathExpr x ++ showMathExprForPlus xs where showMathExprForPlus :: [MathExpr] -> String- showMathExprForPlus [] = ""- showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs+ showMathExprForPlus [] = ""+ showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs showMathExprForPlus (Multiply (NegativeAtom "1":ys):xs) = " - " ++ showMathExpr (Multiply ys) ++ showMathExprForPlus xs- showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ " " ++ showMathExprForPlus xs- showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs+ showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ " " ++ showMathExprForPlus xs+ showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs showMathExpr (Multiply []) = "" showMathExpr (Multiply [x]) = showMathExpr x showMathExpr (Multiply (NegativeAtom "1":xs)) = "-" ++ showMathExpr (Multiply xs)@@ -36,14 +36,14 @@ showMathExpr (Tensor lvs mis) | null mis = "(" ++ showMathExprArg lvs ++ ")" | not (any isSub mis) = "(" ++ showMathExprArg lvs ++ ")^(" ++ showMathExprIndices mis ++ ")"- | not (any (not . isSub) mis) = "(" ++ showMathExprArg lvs ++ ")_(" ++ showMathExprIndices mis ++ ")"+ | all isSub mis = "(" ++ showMathExprArg lvs ++ ")_(" ++ showMathExprIndices mis ++ ")" | otherwise = "(" ++ showMathExprArg lvs ++ ")_(" ++ showMathExprIndices (filter isSub mis) ++ ")^(" ++ showMathExprIndices (filter (not . isSub) mis) ++ ")" showMathExpr (Tuple lvs) = "(" ++ showMathExprArg lvs ++ ")" showMathExpr (Collection lvs) = "{" ++ showMathExprArg lvs ++ "}" showMathExpr' :: MathExpr -> String showMathExpr' (Plus lvs) = "(" ++ showMathExpr (Plus lvs) ++ ")"-showMathExpr' val = showMathExpr val+showMathExpr' val = showMathExpr val showMathExprArg :: [MathExpr] -> String showMathExprArg exprs = intercalate ", " $ map showMathExpr exprs
hs-src/Language/Egison/PrettyMath/Latex.hs view
@@ -7,7 +7,7 @@ ( showMathExpr ) where -import Data.List (intercalate)+import Data.List (intercalate) import Language.Egison.PrettyMath.AST @@ -31,11 +31,11 @@ showMathExpr (Plus (x:xs)) = showMathExpr x ++ showMathExprForPlus xs where showMathExprForPlus :: [MathExpr] -> String- showMathExprForPlus [] = ""- showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs+ showMathExprForPlus [] = ""+ showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs showMathExprForPlus (Multiply (NegativeAtom "1":ys):xs) = " - " ++ showMathExpr (Multiply ys) ++ showMathExprForPlus xs- showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs- showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs+ showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs+ showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs showMathExpr (Multiply []) = "" showMathExpr (Multiply [x]) = showMathExpr x showMathExpr (Multiply (Atom "1" []:xs)) = showMathExpr (Multiply xs)@@ -74,10 +74,10 @@ showMathExprScript is = "_{" ++ concatMap showMathExprSub is ++ "}^{" ++ concatMap showMathExprSuper is ++ "}" showMathExprVectors :: [MathExpr] -> String-showMathExprVectors [] = ""+showMathExprVectors [] = "" showMathExprVectors (Tensor lvs []:r) = showMathExprArg lvs " & " ++ " \\\\ " ++ showMathExprVectors r-showMathExprVectors lvs = showMathExprArg lvs " \\\\ " ++ "\\\\ "+showMathExprVectors lvs = showMathExprArg lvs " \\\\ " ++ "\\\\ " elemCount :: Eq a => [a] -> [(a, Int)]-elemCount [] = []+elemCount [] = [] elemCount (x:xs) = (x, length (filter (== x) xs) + 1) : elemCount (filter (/= x) xs)
hs-src/Language/Egison/PrettyMath/Mathematica.hs view
@@ -7,7 +7,7 @@ ( showMathExpr ) where -import Data.List (intercalate)+import Data.List (intercalate) import Language.Egison.PrettyMath.AST @@ -20,11 +20,11 @@ showMathExpr (Plus (x:xs)) = showMathExpr x ++ showMathExprForPlus xs where showMathExprForPlus :: [MathExpr] -> String- showMathExprForPlus [] = ""- showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs+ showMathExprForPlus [] = ""+ showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs showMathExprForPlus (Multiply (NegativeAtom "1":ys):xs) = " - " ++ showMathExpr (Multiply ys) ++ showMathExprForPlus xs- showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs- showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs+ showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs+ showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs showMathExpr (Multiply []) = "" showMathExpr (Multiply [x]) = showMathExpr x showMathExpr (Multiply (Atom "1" []:xs)) = showMathExpr (Multiply xs)@@ -42,7 +42,7 @@ showMathExpr (Tensor lvs mis) | null mis = "{" ++ showMathExprArg lvs ++ "}" | not (any isSub mis) = "{" ++ showMathExprArg lvs ++ "}^(" ++ showMathExprIndices mis ++ ")"- | not (any (not . isSub) mis) = "{" ++ showMathExprArg lvs ++ "}_(" ++ showMathExprIndices mis ++ ")"+ | all isSub mis = "{" ++ showMathExprArg lvs ++ "}_(" ++ showMathExprIndices mis ++ ")" | otherwise = "{" ++ showMathExprArg lvs ++ "}_(" ++ showMathExprIndices (filter isSub mis) ++ ")^(" ++ showMathExprIndices (filter (not . isSub) mis) ++ ")" showMathExpr (Tuple xs) = "(" ++ showMathExprArg xs ++ ")" showMathExpr (Collection xs) = "{" ++ showMathExprArg xs ++ "}"@@ -50,7 +50,7 @@ showMathExpr' :: MathExpr -> String showMathExpr' (Plus xs) = "(" ++ showMathExpr (Plus xs) ++ ")"-showMathExpr' x = showMathExpr x+showMathExpr' x = showMathExpr x showMathExprs :: String -> [MathExpr] -> String showMathExprs sep exprs = intercalate sep $ map showMathExpr exprs
hs-src/Language/Egison/PrettyMath/Maxima.hs view
@@ -17,11 +17,11 @@ showMathExpr (Plus (x:xs)) = showMathExpr x ++ showMathExprForPlus xs where showMathExprForPlus :: [MathExpr] -> String- showMathExprForPlus [] = ""- showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs+ showMathExprForPlus [] = ""+ showMathExprForPlus (NegativeAtom a:xs) = " - " ++ a ++ showMathExprForPlus xs showMathExprForPlus (Multiply (NegativeAtom "1":ys):xs) = " - " ++ showMathExpr (Multiply ys) ++ showMathExprForPlus xs- showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs- showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs+ showMathExprForPlus (Multiply (NegativeAtom a:ys):xs) = " - " ++ showMathExpr (Multiply (Atom a []:ys)) ++ showMathExprForPlus xs+ showMathExprForPlus (x:xs) = " + " ++ showMathExpr x ++ showMathExprForPlus xs showMathExpr (Multiply []) = "" showMathExpr (Multiply [x]) = showMathExpr x showMathExpr (Multiply (Atom "1" []:xs)) = showMathExpr (Multiply xs)@@ -43,10 +43,10 @@ showMathExpr' :: MathExpr -> String showMathExpr' x@(Plus _) = "(" ++ showMathExpr x ++ ")"-showMathExpr' x = showMathExpr x+showMathExpr' x = showMathExpr x showMathExprArg :: [MathExpr] -> String-showMathExprArg [] = ""+showMathExprArg [] = "" showMathExprArg [Tensor _ []] = "undefined"-showMathExprArg [a] = showMathExpr a-showMathExprArg lvs = showMathExpr (head lvs) ++ ", " ++ showMathExprArg (tail lvs)+showMathExprArg [a] = showMathExpr a+showMathExprArg lvs = showMathExpr (head lvs) ++ ", " ++ showMathExprArg (tail lvs)
hs-src/Language/Egison/Primitives.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE LambdaCase #-} {- | Module : Language.Egison.Primitives@@ -17,23 +16,22 @@ import Data.IORef -import qualified Data.Sequence as Sq-import qualified Data.Vector as V+import qualified Data.Sequence as Sq+import qualified Data.Vector as V {-- -- for 'egison-sqlite' import qualified Database.SQLite3 as SQLite --} -- for 'egison-sqlite' import Language.Egison.Data-import Language.Egison.Data.Collection (makeICollection)-import Language.Egison.EvalState (MonadEval(..))-import Language.Egison.IExpr (stringToVar, Index(..))+import Language.Egison.Data.Collection (makeICollection)+import Language.Egison.IExpr (Index (..), stringToVar)+import Language.Egison.Math import Language.Egison.Primitives.Arith import Language.Egison.Primitives.IO import Language.Egison.Primitives.String import Language.Egison.Primitives.Types import Language.Egison.Primitives.Utils-import Language.Egison.Math primitiveEnv :: IO Env primitiveEnv = do@@ -122,7 +120,7 @@ return (ScalarData (SingleSymbol (Symbol id name (is ++ [Sub s])))) (ScalarData (SingleSymbol (Symbol id name is)), ScalarData s@(SingleTerm _ [])) -> return (ScalarData (SingleSymbol (Symbol id name (is ++ [Sub s]))))- _ -> throwError =<< TypeMismatch "symbol or integer" (Value fn) <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "symbol or integer" (Value fn)) addSuperscript :: String -> PrimitiveFunc addSuperscript = twoArgs $ \fn sub ->@@ -131,21 +129,21 @@ return (ScalarData (SingleSymbol (Symbol id name (is ++ [Sup s])))) (ScalarData (SingleSymbol (Symbol id name is)), ScalarData s@(SingleTerm _ [])) -> return (ScalarData (SingleSymbol (Symbol id name (is ++ [Sup s]))))- _ -> throwError =<< TypeMismatch "symbol" (Value fn) <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "symbol" (Value fn)) assert :: String -> PrimitiveFunc assert = twoArgs' $ \label test -> do test <- fromEgison test if test then return $ Bool True- else throwError =<< Assertion (show label) <$> getFuncNameStack+ else throwErrorWithTrace (Assertion (show label)) assertEqual :: String -> PrimitiveFunc assertEqual = threeArgs' $ \label actual expected -> if actual == expected then return $ Bool True- else throwError =<< Assertion- (show label ++ "\n expected: " ++ show expected ++ "\n but found: " ++ show actual) <$> getFuncNameStack+ else throwErrorWithTrace (Assertion+ (show label ++ "\n expected: " ++ show expected ++ "\n but found: " ++ show actual)) {-- -- for 'egison-sqlite' sqlite :: PrimitiveFunc
hs-src/Language/Egison/Primitives/Arith.hs view
@@ -12,11 +12,9 @@ ( primitiveArithFunctions ) where -import Control.Monad.Except import Language.Egison.Data-import Language.Egison.EvalState (MonadEval(..))-import Language.Egison.Primitives.Utils import Language.Egison.Math+import Language.Egison.Primitives.Utils primitiveArithFunctions :: [(String, EgisonValue)] primitiveArithFunctions =@@ -96,8 +94,8 @@ scalarBinaryOp mOp = twoArgs scalarBinaryOp' where scalarBinaryOp' (ScalarData m1) (ScalarData m2) = (return . ScalarData) (mOp m1 m2)- scalarBinaryOp' (ScalarData _) val = throwError =<< TypeMismatch "number" (Value val) <$> getFuncNameStack- scalarBinaryOp' val _ = throwError =<< TypeMismatch "number" (Value val) <$> getFuncNameStack+ scalarBinaryOp' (ScalarData _) val = throwErrorWithTrace (TypeMismatch "number" (Value val))+ scalarBinaryOp' val _ = throwErrorWithTrace (TypeMismatch "number" (Value val)) plus :: String -> PrimitiveFunc plus = scalarBinaryOp mathPlus@@ -115,19 +113,19 @@ numerator' = oneArg numerator'' where numerator'' (ScalarData m) = return $ ScalarData (mathNumerator m)- numerator'' val = throwError =<< TypeMismatch "rational" (Value val) <$> getFuncNameStack+ numerator'' val = throwErrorWithTrace (TypeMismatch "rational" (Value val)) denominator' :: String -> PrimitiveFunc denominator' = oneArg denominator'' where denominator'' (ScalarData m) = return $ ScalarData (mathDenominator m)- denominator'' val = throwError =<< TypeMismatch "rational" (Value val) <$> getFuncNameStack+ denominator'' val = throwErrorWithTrace (TypeMismatch "rational" (Value val)) fromScalarData :: String -> PrimitiveFunc fromScalarData = oneArg fromScalarData' where fromScalarData' (ScalarData m) = return $ mathExprToEgison m- fromScalarData' val = throwError =<< TypeMismatch "number" (Value val) <$> getFuncNameStack+ fromScalarData' val = throwErrorWithTrace (TypeMismatch "number" (Value val)) toScalarData :: String -> PrimitiveFunc toScalarData = oneArg $ \val ->@@ -137,7 +135,7 @@ symbolNormalize = oneArg $ \val -> case val of ScalarData s -> return $ ScalarData (rewriteSymbol s)- _ -> throwError =<< TypeMismatch "math expression" (Value val) <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "math expression" (Value val)) -- -- Pred@@ -154,14 +152,14 @@ r2 <- fromEgison val2 :: EvalM Rational return $ Bool (cmp r1 r2) (Float f1, Float f2) -> return $ Bool (cmp f1 f2)- (ScalarData _, _) -> throwError =<< TypeMismatch "number" (Value val2) <$> getFuncNameStack- (Float _, _) -> throwError =<< TypeMismatch "float" (Value val2) <$> getFuncNameStack- _ -> throwError =<< TypeMismatch "number" (Value val1) <$> getFuncNameStack+ (ScalarData _, _) -> throwErrorWithTrace (TypeMismatch "number" (Value val2))+ (Float _, _) -> throwErrorWithTrace (TypeMismatch "float" (Value val2))+ _ -> throwErrorWithTrace (TypeMismatch "number" (Value val1)) truncate' :: String -> PrimitiveFunc truncate' = oneArg $ \val -> numberUnaryOp' val where- numberUnaryOp' (ScalarData (Div (Plus []) _)) = return $ toEgison (0 :: Integer)+ numberUnaryOp' (ScalarData (Div (Plus []) _)) = return $ toEgison (0 :: Integer) numberUnaryOp' (ScalarData (Div (Plus [Term x []]) (Plus [Term y []]))) = return $ toEgison (quot x y)- numberUnaryOp' (Float x) = return $ toEgison (truncate x :: Integer)- numberUnaryOp' val = throwError =<< TypeMismatch "rational or float" (Value val) <$> getFuncNameStack+ numberUnaryOp' (Float x) = return $ toEgison (truncate x :: Integer)+ numberUnaryOp' val = throwErrorWithTrace (TypeMismatch "rational or float" (Value val))
hs-src/Language/Egison/Primitives/IO.hs view
@@ -22,7 +22,6 @@ import Language.Egison.Core (evalWHNF) import Language.Egison.Data-import Language.Egison.EvalState (MonadEval(..)) import Language.Egison.Primitives.Utils @@ -195,5 +194,5 @@ val <- m >>= evalWHNF case val of Tuple [_, val'] -> return $ Value val'- _ -> throwError =<< TypeMismatch "io" (Value val) <$> getFuncNameStack- io' whnf = throwError =<< TypeMismatch "io" whnf <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "io" (Value val))+ io' whnf = throwErrorWithTrace (TypeMismatch "io" whnf)
hs-src/Language/Egison/Primitives/String.hs view
@@ -55,7 +55,7 @@ str <- fromEgison val case T.uncons str of Just (c, rest) -> return $ Tuple [Char c, String rest]- Nothing -> throwError $ Default "Tried to unsnoc empty string"+ Nothing -> throwError $ Default "Tried to unsnoc empty string" lengthString :: String -> PrimitiveFunc lengthString = unaryOp (toInteger . T.length)@@ -74,7 +74,7 @@ patStr <- fromEgison pat srcStr <- fromEgison src case (T.unpack srcStr =~~ T.unpack patStr) :: (Maybe (String, String, String)) of- Nothing -> return . Collection . Sq.fromList $ []+ Nothing -> return . Collection . Sq.fromList $ [] Just (a,b,c) -> return . Collection . Sq.fromList $ [Tuple [String (T.pack a), String (T.pack b), String (T.pack c)]] regexStringCaptureGroup :: String -> PrimitiveFunc
hs-src/Language/Egison/Primitives/Types.hs view
@@ -10,13 +10,10 @@ ( primitiveTypeFunctions ) where -import Control.Monad.Except- import Data.Char (chr, ord) import Data.Ratio ((%)) import Language.Egison.Data-import Language.Egison.EvalState (MonadEval(..)) import Language.Egison.Math import Language.Egison.Primitives.Utils @@ -109,9 +106,9 @@ rationalToFloat :: String -> PrimitiveFunc rationalToFloat = oneArg $ \val -> case val of- ScalarData (Div (Plus []) _) -> return $ Float 0+ ScalarData (Div (Plus []) _) -> return $ Float 0 ScalarData (Div (Plus [Term x []]) (Plus [Term y []])) -> return $ Float (fromRational (x % y))- _ -> throwError =<< TypeMismatch "integer or rational number" (Value val) <$> getFuncNameStack+ _ -> throwErrorWithTrace (TypeMismatch "integer or rational number" (Value val)) charToInteger :: String -> PrimitiveFunc charToInteger = unaryOp ctoi
hs-src/Language/Egison/Primitives/Utils.hs view
@@ -15,12 +15,9 @@ , binaryOp ) where -import Control.Monad.Except--import qualified Data.Vector as V+import qualified Data.Vector as V import Language.Egison.Data-import Language.Egison.EvalState (MonadEval(..)) import Language.Egison.Tensor {-# INLINE noArg #-}@@ -30,7 +27,7 @@ [] -> f [Tuple []] -> f _ ->- throwError =<< ArgumentsNumPrimitive name 1 (length args) <$> getFuncNameStack+ throwErrorWithTrace (ArgumentsNumPrimitive name 1 (length args)) {-# INLINE oneArg #-} oneArg :: (EgisonValue -> EvalM EgisonValue) -> String -> PrimitiveFunc@@ -41,22 +38,22 @@ return $ TensorData (Tensor ns ds' js) [arg] -> f arg _ ->- throwError =<< ArgumentsNumPrimitive name 1 (length args) <$> getFuncNameStack+ throwErrorWithTrace (ArgumentsNumPrimitive name 1 (length args)) {-# INLINE oneArg' #-} oneArg' :: (EgisonValue -> EvalM EgisonValue) -> String -> PrimitiveFunc oneArg' f name args = case args of [arg] -> f arg- _ -> - throwError =<< ArgumentsNumPrimitive name 1 (length args) <$> getFuncNameStack+ _ ->+ throwErrorWithTrace (ArgumentsNumPrimitive name 1 (length args)) {-# INLINE twoArgs #-} twoArgs :: (EgisonValue -> EgisonValue -> EvalM EgisonValue) -> String -> PrimitiveFunc twoArgs f name args = case args of [TensorData t1@Tensor{}, TensorData t2@Tensor{}] ->- tProduct (\x y -> f x y) t1 t2 >>= fromTensor+ tProduct f t1 t2 >>= fromTensor [TensorData(Tensor ns ds js), val] -> do ds' <- V.mapM (`f` val) ds return $ TensorData (Tensor ns ds' js)@@ -65,7 +62,7 @@ return $ TensorData (Tensor ns ds' js) [val, val'] -> f val val' [val] -> return . PrimitiveFunc $ oneArg (f val) name- _ -> throwError =<< ArgumentsNumPrimitive name 2 (length args) <$> getFuncNameStack+ _ -> throwErrorWithTrace (ArgumentsNumPrimitive name 2 (length args)) {-# INLINE twoArgs' #-} twoArgs' :: (EgisonValue -> EgisonValue -> EvalM EgisonValue) -> String -> PrimitiveFunc@@ -73,7 +70,7 @@ case args of [val, val'] -> f val val' [val] -> return . PrimitiveFunc $ oneArg' (f val) name- _ -> throwError =<< ArgumentsNumPrimitive name 2 (length args) <$> getFuncNameStack+ _ -> throwErrorWithTrace (ArgumentsNumPrimitive name 2 (length args)) {-# INLINE threeArgs' #-} threeArgs' :: (EgisonValue -> EgisonValue -> EgisonValue -> EvalM EgisonValue) -> String -> PrimitiveFunc@@ -82,13 +79,13 @@ [val, val', val''] -> f val val' val'' [val, val'] -> return . PrimitiveFunc $ oneArg' (f val val') name [val] -> return . PrimitiveFunc $ twoArgs' (f val) name- _ -> throwError =<< ArgumentsNumPrimitive name 3 (length args) <$> getFuncNameStack+ _ -> throwErrorWithTrace (ArgumentsNumPrimitive name 3 (length args)) lazyOneArg :: (WHNFData -> EvalM WHNFData) -> String -> LazyPrimitiveFunc lazyOneArg f name args = case args of [arg] -> f arg- _ -> throwError =<< ArgumentsNumPrimitive name 1 (length args) <$> getFuncNameStack+ _ -> throwErrorWithTrace (ArgumentsNumPrimitive name 1 (length args)) unaryOp :: (EgisonData a, EgisonData b) => (a -> b) -> String -> PrimitiveFunc unaryOp op = oneArg $ \val -> do
hs-src/Language/Egison/RState.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-} {- | Module : Language.Egison.RState@@ -30,8 +29,8 @@ data RState = RState { indexCounter :: Int- , exprOps :: [Op]- , patternOps :: [Op]+ , exprOps :: [Op]+ , patternOps :: [Op] } initialRState :: RState
hs-src/Language/Egison/Tensor.hs view
@@ -1,8 +1,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ViewPatterns #-} {- |@@ -17,7 +16,6 @@ -- * Tensor , tref , enumTensorIndices- , changeIndex , tTranspose , tTranspose' , tFlipIndices@@ -31,19 +29,18 @@ , tConcat' ) where -import Prelude hiding (foldr, mappend, mconcat)+import Prelude hiding (foldr, mappend, mconcat) -import Control.Monad.Except hiding (join)-import qualified Data.Vector as V-import Data.List (delete, intersect, partition, (\\))+import Control.Monad.Except (mzero, throwError, zipWithM)+import Data.List (delete, intersect, partition, (\\))+import qualified Data.Vector as V import Control.Egison-import qualified Control.Egison as M+import qualified Control.Egison as M import Language.Egison.Data import Language.Egison.Data.Utils-import Language.Egison.EvalState (getFuncNameStack)-import Language.Egison.IExpr (Index(..), extractSupOrSubIndex)+import Language.Egison.IExpr (Index (..), extractSupOrSubIndex) import Language.Egison.Math import Language.Egison.RState @@ -105,26 +102,26 @@ tIntRef' i (Tensor [n] xs _) = if 0 < i && i <= n then return . Scalar $ xs V.! fromIntegral (i - 1)- else throwError =<< TensorIndexOutOfBounds i n <$> getFuncNameStack+ else throwErrorWithTrace (TensorIndexOutOfBounds i n) tIntRef' i (Tensor (n:ns) xs js) = if 0 < i && i <= n then let w = fromIntegral (product ns) ys = V.take w (V.drop (w * fromIntegral (i - 1)) xs) in return $ Tensor ns ys (cdr js)- else throwError =<< TensorIndexOutOfBounds i n <$> getFuncNameStack+ else throwErrorWithTrace (TensorIndexOutOfBounds i n) tIntRef' _ _ = throwError $ Default "More indices than the order of the tensor" tIntRef :: [Integer] -> Tensor a -> EvalM (Tensor a) tIntRef [] (Tensor [] xs _) | V.length xs == 1 = return $ Scalar (xs V.! 0)- | otherwise = throwError =<< EgisonBug "sevaral elements in scalar tensor" <$> getFuncNameStack+ | otherwise = throwErrorWithTrace (EgisonBug "sevaral elements in scalar tensor") tIntRef [] t = return t tIntRef (m:ms) t = tIntRef' m t >>= tIntRef ms tIntRef1 :: [Integer] -> Tensor a -> EvalM a tIntRef1 [] (Scalar x) = return x tIntRef1 [] (Tensor [] xs _) | V.length xs == 1 = return (xs V.! 0)-tIntRef1 [] _ = throwError =<< EgisonBug "sevaral elements in scalar tensor" <$> getFuncNameStack+tIntRef1 [] _ = throwErrorWithTrace (EgisonBug "sevaral elements in scalar tensor") tIntRef1 (m:ms) t = tIntRef' m t >>= tIntRef1 ms pattern SupOrSubIndex :: a -> Index a@@ -133,7 +130,7 @@ tref :: [Index EgisonValue] -> Tensor a -> EvalM (Tensor a) tref [] (Tensor [] xs _) | V.length xs == 1 = return $ Scalar (xs V.! 0)- | otherwise = throwError =<< EgisonBug "sevaral elements in scalar tensor" <$> getFuncNameStack+ | otherwise = throwErrorWithTrace (EgisonBug "sevaral elements in scalar tensor") tref [] t = return t tref (s@(SupOrSubIndex (ScalarData (SingleSymbol _))):ms) (Tensor (_:ns) xs js) = do let yss = split (product ns) xs@@ -162,13 +159,9 @@ -- >>> enumTensorIndices [2,2,2] -- [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]] enumTensorIndices :: Shape -> [[Integer]]-enumTensorIndices [] = [[]]+enumTensorIndices [] = [[]] enumTensorIndices (n:ns) = concatMap (\i -> map (i:) (enumTensorIndices ns)) [1..n] -changeIndex :: Index String -> EgisonValue -> Index String-changeIndex (Sup s) m = Sup (s ++ show m)-changeIndex (Sub s) m = Sub (s ++ show m)- -- transIndex [a, b, c] [c, a, b] [2, 3, 4] = [4, 2, 3] transIndex :: [Index EgisonValue] -> [Index EgisonValue] -> Shape -> EvalM Shape transIndex is js ns = do@@ -184,13 +177,13 @@ let js' = take (length is) js let ds = complementWithDF ns is ns' <- transIndex (js' ++ ds) (is ++ ds) ns- xs' <- V.fromList <$> mapM (transIndex (is ++ ds) (js' ++ ds)) (enumTensorIndices ns') >>= mapM (`tIntRef1` t)+ xs' <- mapM (transIndex (is ++ ds) (js' ++ ds)) (enumTensorIndices ns') >>= mapM (`tIntRef1` t) . V.fromList return $ Tensor ns' xs' is tTranspose' :: [EgisonValue] -> Tensor a -> EvalM (Tensor a) tTranspose' is t@(Tensor _ _ js) = case mapM (\i -> f i js) is of- Nothing -> return t+ Nothing -> return t Just is' -> tTranspose is' t where f :: EgisonValue -> [Index EgisonValue] -> Maybe (Index EgisonValue)
hs-src/Tool/translator.hs view
@@ -62,10 +62,10 @@ toNonS :: a -> a instance SyntaxElement TopExpr where- toNonS (Define x y) = Define (toNonS x) (toNonS y)- toNonS (Test x) = Test (toNonS x)- toNonS (Execute x) = Execute (toNonS x)- toNonS x = x+ toNonS (Define x y) = Define (toNonS x) (toNonS y)+ toNonS (Test x) = Test (toNonS x)+ toNonS (Execute x) = Execute (toNonS x)+ toNonS x = x instance SyntaxElement Expr where toNonS (VarExpr (lookupVarExprInfix -> Just op)) =@@ -176,15 +176,15 @@ instance SyntaxElement PrimitivePatPattern where toNonS (PPInductivePat x pps) = PPInductivePat x (map toNonS pps)- toNonS (PPTuplePat pps) = PPTuplePat (map toNonS pps)- toNonS pp = pp+ toNonS (PPTuplePat pps) = PPTuplePat (map toNonS pps)+ toNonS pp = pp instance SyntaxElement PrimitiveDataPattern where toNonS (PDInductivePat x pds) = PDInductivePat x (map toNonS pds)- toNonS (PDTuplePat pds) = PDTuplePat (map toNonS pds)- toNonS (PDConsPat pd1 pd2) = PDConsPat (toNonS pd1) (toNonS pd2)- toNonS (PDSnocPat pd1 pd2) = PDSnocPat (toNonS pd1) (toNonS pd2)- toNonS pd = pd+ toNonS (PDTuplePat pds) = PDTuplePat (map toNonS pds)+ toNonS (PDConsPat pd1 pd2) = PDConsPat (toNonS pd1) (toNonS pd2)+ toNonS (PDSnocPat pd1 pd2) = PDSnocPat (toNonS pd1) (toNonS pd2)+ toNonS pd = pd instance SyntaxElement LoopRange where toNonS (LoopRange e1 e2 p) = LoopRange (toNonS e1) (toNonS e2) (toNonS p)@@ -193,7 +193,7 @@ toNonS script = toNonS <$> script instance SyntaxElement BindingExpr where- toNonS (Bind pdp x) = Bind (toNonS pdp) (toNonS x)+ toNonS (Bind pdp x) = Bind (toNonS pdp) (toNonS x) toNonS (BindWithIndices var x) = BindWithIndices var (toNonS x) instance SyntaxElement MatchClause where
lib/core/assoc.egi view
@@ -17,36 +17,6 @@ | ($x, $n) :: $rs -> take n (repeat1 x) ++ fromAssoc rs ----- Assoc List----def assocList a :=- matcher- | [] as () with- | [] -> [()]- | _ -> []- | $ :: $ as (a, assocList a) with- | $tgt ->- match tgt as list (something, integer) with- | ($x, #1) :: $rs -> [(x, rs)]- | ($x, $n) :: $rs -> [(x, (x, n - 1) :: rs)]- | _ -> []- | ncons $ #$k $ as (a, assocList a) with- | $tgt ->- match tgt as list (something, integer) with- | ($x, #k) :: $rs -> [(x, rs)]- | ($x, ?(> k) & $n) :: $rs -> [(x, (x, n - k) :: rs)]- | _ -> []- | ncons $ $ $ as (a, integer, assocList a) with- | $tgt ->- match tgt as list (something, integer) with- | ($x, $k) :: $rs -> [(x, k, rs)]- | _ -> []- | #$val as () with- | $tgt -> if val = tgt then [()] else []- | $ as (something) with- | $tgt -> [tgt]---- -- Assoc Multiset -- def assocMultiset a :=@@ -54,41 +24,41 @@ | [] as () with | [] -> [()] | _ -> []- | #$x :: $ as (assocMultiset a) with- | $tgt ->- matchAll tgt as list (a, integer) with- | $hs ++ (#x, $n) :: $ts ->- if n = 1 then hs ++ ts else hs ++ (x, n - 1) :: ts- | $ :: $ as (a, assocMultiset a) with- | $tgt ->- matchAll tgt as list (a, integer) with- | $hs ++ ($x, $n) :: $ts ->- if n = 1 then (x, hs ++ ts) else (x, hs ++ (x, n - 1) :: ts)- | ncons #$x #$n $ as (assocMultiset a) with+ | #$x ^ #$n :: $ as (assocMultiset a) with | $tgt -> matchAll tgt as list (a, integer) with | $hs ++ (#x, ?(>= n) & $k) :: $ts -> if k - n = 0 then hs ++ ts else hs ++ (x, k - n) :: ts- | ncons $ #$n $ as (a, assocMultiset a) with+ | $ ^ #$n :: $ as (a, assocMultiset a) with | $tgt -> matchAll tgt as list (a, integer) with | $hs ++ ($x, ?(>= n) & $k) :: $ts -> if k - n = 0 then (x, hs ++ ts) else (x, hs ++ (x, k - n) :: ts)- | ncons #$x $ $ as (integer, assocMultiset a) with+ | #$x ^ $ :: $ as (integer, assocMultiset a) with | $tgt -> matchAll tgt as list (a, integer) with | $hs ++ (#x, $n) :: $ts -> (n, hs ++ ts)- | ncons $ $ $ as (a, integer, assocMultiset a) with+ | $ ^ $ :: $ as (a, integer, assocMultiset a) with | $tgt -> matchAll tgt as list (a, integer) with | $hs ++ ($x, $n) :: $ts -> (x, n, hs ++ ts)+ | #$x :: $ as (assocMultiset a) with+ | $tgt ->+ matchAll tgt as list (a, integer) with+ | $hs ++ (#x, $n) :: $ts ->+ if n = 1 then hs ++ ts else hs ++ (x, n - 1) :: ts+ | $ :: $ as (a, assocMultiset a) with+ | $tgt ->+ matchAll tgt as list (a, integer) with+ | $hs ++ ($x, $n) :: $ts ->+ if n = 1 then (x, hs ++ ts) else (x, hs ++ (x, n - 1) :: ts) | $ as (something) with | $tgt -> [tgt] def AC.intersect xs ys := matchAll (xs, ys) as (assocMultiset something, assocMultiset something) with- | (ncons $x $m _, ncons #x $n _) -> (x, min m n)+ | ($x ^ $m :: _, #x ^ $n :: _) -> (x, min m n) def AC.intersectAs a xs ys := matchAll (xs, ys) as (assocMultiset a, assocMultiset a) with- | (ncons $x $m _, ncons #x $n _) -> (x, min m n)+ | ($x ^ $m :: _, #x ^ $n :: _) -> (x, min m n)
lib/core/base.egi view
@@ -22,8 +22,8 @@ def id := 1#%1 -def fst (x, y) := x-def snd (x, y) := y+def fst (x, _) := x+def snd (_, y) := y infixr expression 0 $
lib/core/collection.egi view
@@ -4,6 +4,8 @@ -- -- +infixr pattern 5 +++ -- -- List --@@ -148,7 +150,7 @@ | [] -> True | _ -> False -def length xs := foldl 2#(%1 + 1) 0 xs+def length xs := foldl (\acc _ -> acc + 1) 0 xs def map fn xs := match xs as list something with
lib/core/number.egi view
@@ -120,7 +120,7 @@ in (q, map fst s, map fst c) def showDecimal c x :=- match (\(x, y) -> (x, take c y)) (rtod x) as (integer, list integer) with+ match (2)#(%1, take c %2) (rtod x) as (integer, list integer) with | ($q, $sc) -> foldl S.append (S.append (show q) ".") (map show sc) def showDecimal' x :=@@ -158,7 +158,7 @@ in if x = 0 then (n, []) else ( n- , map (\(_, _, z) -> z) (regularContinuedFractionOfSqrtHelper m (n / x) (1 / x)) )+ , map (3)#%3 (regularContinuedFractionOfSqrtHelper m (n / x) (1 / x)) ) def regularContinuedFractionOfSqrt' m := let n := floor (sqrt (rtof m))@@ -170,6 +170,6 @@ m (n / x) (1 / x))- in (n, map (\(_, _, x) -> x) s, map (\(_, _, x) -> x) c)+ in (n, map (3)#%3 s, map (3)#%3 c) def pi := f.pi
lib/core/order.egi view
@@ -26,8 +26,8 @@ def min $x $y := if x < y then x else y def max $x $y := if x > y then x else y -def min/fn f $xs := foldl1 2#(if f %1 %2 = Less then %1 else %2) xs-def max/fn f $xs := foldl1 2#(if f %1 %2 = Greater then %1 else %2) xs+def min/fn f $xs := foldl1 (\x y -> if f x y = Less then x else y) xs+def max/fn f $xs := foldl1 (\x y -> if f x y = Greater then x else y) xs def minimum $xs := foldl1 min xs def maximum $xs := foldl1 max xs@@ -57,7 +57,7 @@ in sort/fn f ys1 ++ ys2 ++ sort/fn f ys3 def sortStrings xs :=- sort/fn 2#(compareC (map ctoi (unpack %1)) (map ctoi (unpack %2))) xs+ sort/fn (\x y -> compareC (map ctoi (unpack x)) (map ctoi (unpack y))) xs def merge xs ys := match (xs, ys) as (list something, list something) with@@ -74,7 +74,7 @@ | (_, $y :: $tys) -> y :: merge xs tys def minimize f xs :=- foldl1 2#(if compare (f %1) (f %2) = Less then %1 else %2) xs+ foldl1 (\x y -> if compare (f x) (f y) = Less then x else y) xs def maximize f xs :=- foldl1 2#(if compare (f %1) (f %2) = Greater then %1 else %2) xs+ foldl1 (\x y -> if compare (f x) (f y) = Greater then x else y) xs
lib/core/shell.egi view
@@ -1,25 +1,16 @@+-- Get input and parse them into the format specified with sopts and copts.+-- Used in --map and --filter options. def SH.genInput sopts copts :=- if io $ isEof ()- then []- else let line := io $ readLine ()- x := TSV.parseLine sopts copts line- in seq x (x :: SH.genInput sopts copts)--def TSV.map fn showFn := do- let eof := isEof ()- if eof- then return ()- else do let line := readLine ()- print (showFn (fn (readTsv line)))- TSV.map fn showFn--def TSV.filter fn := do- let eof := isEof ()- if eof- then return ()- else do let line := readLine ()- if fn (readTsv line) then print line else return ()- TSV.filter fn+ map (TSV.parseLine sopts copts) (io (readLines ()))+ where+ -- Read multiple lines from stdin until EOF.+ readLines () := do+ let eof := isEof ()+ if eof+ then return []+ else do let line := readLine ()+ let lines := readLines ()+ return (line :: lines) def TSV.parseLine sopts copts line := readTsv (S.intercalate "\t" (fnC copts (fnS sopts (S.split "\t" line))))@@ -33,7 +24,7 @@ let (hs, ts') := splitAt (m - 1) xs (mf, ts) := uncons ts' in fnS opts' (hs ++ S.concat ["\"", mf, "\""] :: ts)- | [$m, $n] :: $opts' ->+ | [$m, $n & ?(> m)] :: $opts' -> let (hs, ts') := splitAt (m - 1) xs (ms, ts) := splitAt (n - m + 1) ts' in fnS opts' (hs ++ map (\m -> S.concat ["\"", m, "\""]) ms ++ ts)@@ -48,7 +39,7 @@ let (hs, ts') := splitAt (m - 1) xs (mf, ts) := uncons ts' in fnC opts' (hs ++ S.concat ["[", mf, "]"] :: ts)- | [$m, $n] :: $opts' ->+ | [$m, $n & ?(> m)] :: $opts' -> let (hs, ts') := splitAt (m - 1) xs (ms, ts) := splitAt (n - m + 1) ts' in fnC opts' (hs ++ S.concat ["[", S.intercalate ", " ms, "]"] :: ts)
lib/core/sort.egi view
@@ -15,17 +15,18 @@ | [$x] -> (1, x) | [$x, $y] -> if compare x y = Greater then (-1, y ++ x) else (1, x ++ y)- | _ -> io $- do let t := return (colToTensor xs)- let n := return (length xs)- let sgn := sort' 1 2 n t 1- let xs' := return (map (\i -> io $ readIORef t_i) [1..n])- return (sgn, concat xs')+ | _ ->+ io (do let t := return (colToTensor xs)+ let n := return (length xs)+ let sgn := sort' 1 2 n t 1+ let xs' := return (map (\i -> io $ readIORef t_i) [1..n])+ return (sgn, concat xs')) where colToTensor xs :=- generateTensor (\n -> io $ do let t := newIORef ()- writeIORef t (nth n xs)- return t) [length xs]+ generateTensor (\[n] -> io $+ do let t := newIORef ()+ writeIORef t (nth n xs)+ return t) [length xs] sort' i j n ts sgn := if i = n
lib/math/algebra/equations.egi view
@@ -23,7 +23,7 @@ def qF f x := match coefficients f x as list mathExpr with- | $a_0 :: $a_1 :: $a_2 :: [] -> qF' a_2 a_1 a_0+ | [$a_0, $a_1, $a_2] -> qF' a_2 a_1 a_0 def qF' a b c := ( ((- b) + sqrt (b ^ 2 - 4 * a * c)) / 2 * a@@ -41,7 +41,7 @@ def cF' a b c d := match (a, b, c, d) as (mathExpr, mathExpr, mathExpr, mathExpr) with | (#1, #0, $p, $q) ->- let (s1, s2) := (\(x, y) -> (rt 3 x, rt 3 y)) (qF' 1 (27 * q) ((-27) * p ^ 3))+ let (s1, s2) := (2)#(rt 3 %1, rt 3 %2) (qF' 1 (27 * q) ((-27) * p ^ 3)) in ( (s1 + s2) / 3 -- r1 , (w ^ 2 * s1 + w * s2) / 3 -- r2 , (w * s1 + w ^ 2 * s2) / 3) -- r3
lib/math/algebra/inverse.egi view
@@ -17,18 +17,18 @@ | _ -> inverse' t f x -- TODO: define inverse' | ?isTerm -> match f as termExpr with- | term #1 (ncons $n #x []) -> rt n t- | term _ (ncons $n #x _) ->+ | term #1 ($n ^ #x :: []) -> rt n t+ | term _ ($n ^ #x :: _) -> let a := f / x ^ n in inverse (t / a) (f / a) x- | _ -> `inverse t f x+ | _ -> 'inverse t f x | ?isPolynomial -> match coefficients x f as list mathExpr with | $c :: (loop $i (1, $n) (#0 :: ...) ($a :: [])) -> inverse ((t - c) / a) (x ^ (n + 1)) x- | _ -> `inverse t f x+ | _ -> 'inverse t f x | _ -> match f as mathExpr with | $p1 / $p2 -> inverse (p2 * t) p1 x- | _ -> `inverse t f x+ | _ -> 'inverse t f x
lib/math/algebra/matrix.egi view
@@ -13,9 +13,10 @@ def M.inverse %m := let d := M.det m in generateTensor- 2#(match m as matrix with- | cons #%2 #%1 _ $A $B $C $D ->- if isEven (%1 + %2)+ (\[i, j] ->+ match m as matrix with+ | cons #j #i _ $A $B $C $D ->+ if isEven (i + j) then M.det (M.join A B C D) / d else - (M.det (M.join A B C D) / d)) (tensorShape m)@@ -63,11 +64,11 @@ n1 := max c1 d1 n2 := max b2 d2 in generateTensor- 2#(match (%1, %2) as (integer, integer) with- | (?(<= a1), ?(<= a2)) -> A_%1_%2- | (?(<= m1), _) -> B_%1_(%2 - a2)- | (_, ?(<= m2)) -> C_(%1 - a1)_%2- | (_, _) -> D_(%1 - m1)_(%2 - m2))+ (\match as list integer with+ | [$i & ?(<= a1), $j & ?(<= a2)] -> A_i_j+ | [$i & ?(<= m1), $j] -> B_i_(j - a2)+ | [$i, $j & ?(<= m2)] -> C_(i - a1)_j+ | [$i, $j] -> D_(i - m1)_(j - m2)) [m1 + n1, m2 + n2] --@@ -140,15 +141,15 @@ match tensorShape x as list integer with | [#2, #2] -> let L := generateTensor- 2#(match compare %1 %2 as ordering with+ (\[i, j] -> match compare i j as ordering with | less -> 0 | equal -> 1- | greater -> b_%1_%2)+ | greater -> b_i_j) [2, 2] U := generateTensor- 2#(match compare %1 %2 as ordering with+ (\[i, j] -> match compare i j as ordering with | greater -> 0- | _ -> c_%1_%2)+ | _ -> c_i_j) [2, 2] m := M.* L U ret := solve@@ -159,15 +160,15 @@ in (substitute ret L, substitute ret U) | [#3, #3] -> let L := generateTensor- 2#(match compare %1 %2 as ordering with+ (\[i, j] -> match compare i j as ordering with | less -> 0 | equal -> 1- | greater -> b_%1_%2)+ | greater -> b_i_j) [3, 3] U := generateTensor- 2#(match compare %1 %2 as ordering with+ (\[i, j] -> match compare i j as ordering with | greater -> 0- | _ -> c_%1_%2)+ | _ -> c_i_j) [3, 3] m := M.* L U ret := solve@@ -188,5 +189,5 @@ -- def generateMatrixFromQuadraticExpr f xs := generateTensor- 2#(coefficient2 f (nth %1 xs) (nth %2 xs))+ (\[i, j] -> coefficient2 f (nth i xs) (nth j xs)) [length xs, length xs]
lib/math/algebra/root.egi view
@@ -44,7 +44,7 @@ let f xs := match xs as assocMultiset mathExpr with | [] -> (1, 1)- | ncons $p $k $rs ->+ | $p ^ $k :: $rs -> let (a, b) := f rs in (p ^' quotient k n *' a, p ^' (k % n) *' b) g n x :=@@ -60,8 +60,8 @@ def rt'' n x := match (n, x) as (integer, integer) with- | (#2, _) -> `sqrt x- | (_, _) -> `rt n x+ | (#2, _) -> 'sqrt x+ | (_, _) -> 'rt n x def sqrt x := if isScalar x@@ -79,5 +79,5 @@ | #2 -> -1 | #3 -> w | #4 -> i- | _ -> `rtu n- else `rtu n+ | _ -> 'rtu n+ else 'rtu n
lib/math/algebra/tensor.egi view
@@ -13,8 +13,8 @@ def scalarToTensor x ns := x * unitTensor ns -def zeroTensor ns := generateTensor (\xs -> 0) ns+def zeroTensor ns := generateTensor (\_ -> 0) ns -def (.') %t1 %t2 := sum' (contract (t1 *' t2))+def (.') %t1 %t2 := foldr (+') 0 (contract (t1 *' t2)) -def (.) %t1 %t2 := sum (contract (t1 * t2))+def (.) %t1 %t2 := foldr (+) 0 (contract (t1 * t2))
lib/math/analysis/derivative.egi view
@@ -10,25 +10,25 @@ | #x -> 1 | ?isSymbol -> 0 -- function expression- | func _ $argnames $args _ ->+ | func _ $argnames $args -> sum (map2 (\s r -> (userRefs f [s]) * ∂/∂ r x) argnames args) -- function application- | #`exp $g -> exp g * ∂/∂ g x- | #`log $g -> 1 / g * ∂/∂ g x- | #`sqrt $g -> 1 / (2 * sqrt g) * ∂/∂ g x- | #`(^) $g $h -> f * ∂/∂ (log g * h) x- | #`cos $g -> (- sin g) * ∂/∂ g x- | #`sin $g -> cos g * ∂/∂ g x- | #`arccos $g -> 1 / sqrt (1 - g ^ 2) * ∂/∂ g x+ | #'exp $g -> exp g * ∂/∂ g x+ | #'log $g -> 1 / g * ∂/∂ g x+ | #'sqrt $g -> 1 / (2 * sqrt g) * ∂/∂ g x+ | #'(^) $g $h -> f * ∂/∂ (log g * h) x+ | #'cos $g -> (- sin g) * ∂/∂ g x+ | #'sin $g -> cos g * ∂/∂ g x+ | #'arccos $g -> 1 / sqrt (1 - g ^ 2) * ∂/∂ g x | apply $g $args ->- sum (map2 2#((capply `(userRefs g [%1]) args) * ∂/∂ %2 x) nats args)+ sum (map2 (\nat arg -> (capply '(userRefs g [nat]) args) * ∂/∂ arg x) nats args) -- quote | quote $g -> let g' := ∂/∂ g x in if isMonomial g' then g' else let d := capply gcd (fromPoly g')- in d *' '(mapPoly (/' d) g')+ in d *' `(mapPoly (/' d) g') -- term (constant) | #0 -> 0 | _ * #1 -> 0@@ -55,11 +55,11 @@ def taylorExpansion $f $x $a := multivariateTaylorExpansion f [|x|] [|a|] -def maclaurinExpansion := 2#(taylorExpansion %1 %2 0)+def maclaurinExpansion f x := taylorExpansion f x 0 def multivariateTaylorExpansion $f %xs %ys := withSymbols [h]- let hs := generateTensor 1#h_%1 (tensorShape xs)+ let hs := generateTensor (\[x] -> h_x) (tensorShape xs) in map2 (*) (map 1#(1 / fact %1) nats0)
lib/math/analysis/integral.egi view
@@ -17,20 +17,20 @@ | #(^) $a #x -> a ^ x / log a | #(^) $a $y -> withSymbols [t] substitute [(t, y)] (Sd t (a ^ t * d/d (inverse t y x) t))- | #Sd $y $g -> `Sd x (`Sd y g)+ | #Sd $y $g -> 'Sd x ('Sd y g) | $f $y -> withSymbols [t] substitute [(t, y)] (Sd t (f t * d/d (inverse t y x) t)) -- term (constant) | #0 -> 0 | term $c [] -> c * x -- term (multiplication)- | mult $a (ncons $n #x $r) ->- if containSymbol x r then `Sd x f else a / (n + 1) * x ^ (n + 1) * r+ | mult $a ($n ^ #x :: $r) ->+ if containSymbol x r then 'Sd x f else a / (n + 1) * x ^ (n + 1) * r -- polynomial | poly $ts -> sum (map 1#(Sd x %1) ts) -- quotient | plus $ts / $p2 -> sum (map 1#(Sd x (%1 / p2)) ts)- | $p1 / $p2 -> if containSymbol x p2 then `Sd x f else Sd x p1 / p2+ | $p1 / $p2 -> if containSymbol x p2 then 'Sd x f else Sd x p1 / p2 def multSd x f g := let F := Sd x f
lib/math/common/arithmetic.egi view
@@ -65,25 +65,25 @@ then exp n else if isRational n then if n >= 0- then if isInteger n then power x n else `(^) x n+ then if isInteger n then power x n else '(^) x n else 1 / x ^ neg n- else `(^) x n+ else '(^) x n def (^') $x $n := if x = e then exp n else if isRational n then if n >= 0- then if isInteger n then power' x n else `(^) x n+ then if isInteger n then power' x n else '(^) x n else 1 /' x ^' neg n- else `(^) x n+ else '(^) x n def gcd $x $y := match (x, y) as (termExpr, termExpr) with | (_, #0) -> x | (#0, _) -> y | (term $a $xs, term $b $ys) ->- gcd' (abs a) (abs b) *' foldl (*') 1 (map (^') (AC.intersect xs ys))+ gcd' (abs a) (abs b) *' foldl (*') 1 (map (\(s, n) -> s ^' n) (AC.intersect xs ys)) def gcd' $x $y := match (x, y) as (integer, integer) with@@ -96,5 +96,5 @@ let xs := reverse (coefficients fx x) ys := reverse (coefficients gx x) (zs, rs) := L./ xs ys- in ( sum' (map2 2#(%1 *' x ^' %2) (reverse zs) nats0)- , sum' (map2 2#(%1 *' x ^' %2) (reverse rs) nats0) )+ in ( sum' (map2 (\c n -> c *' x ^' n) (reverse zs) nats0)+ , sum' (map2 (\c n -> c *' x ^' n) (reverse rs) nats0) )
lib/math/common/functions.egi view
@@ -14,8 +14,8 @@ | #0 -> 1 | #1 -> e | mult $a #(i * π) -> (-1) ^ a- | _ -> `exp x- else `exp x+ | _ -> 'exp x+ else 'exp x def log $x := if isFloat x@@ -23,7 +23,7 @@ else match x as mathExpr with | #1 -> 0 | #e -> 1- | _ -> `log x+ | _ -> 'log x def cos $x := if isFloat x@@ -32,7 +32,7 @@ | #0 -> 1 | term $n [#π] -> (-1) ^ abs n | (mult _ #π) / #2 -> 0- | _ -> `cos x+ | _ -> 'cos x def sin $x := if isFloat x@@ -41,14 +41,14 @@ | #0 -> 0 | mult _ #π -> 0 | (mult $n #π) / #2 -> (-1) ^ ((abs n - 1) / 2)- | _ -> `sin x+ | _ -> 'sin x def tan $x := if isFloat x then b.tan x else match x as mathExpr with | #0 -> 0- | _ -> `tan x+ | _ -> 'tan x def acos := b.acos def asin := b.asin@@ -59,21 +59,21 @@ then b.cosh x else match x as mathExpr with | #0 -> 1- | _ -> `cosh x+ | _ -> 'cosh x def sinh $x := if isFloat x then b.sinh x else match x as mathExpr with | #0 -> 0- | _ -> `sinh x+ | _ -> 'sinh x def tanh $x := if isFloat x then b.tanh x else match x as mathExpr with | #0 -> 0- | _ -> `tanh x+ | _ -> 'tanh x def acosh := b.acosh def asinh := b.asinh@@ -88,7 +88,7 @@ def sigmoid $z := 1 / (1 + exp (- z)) -def kroneckerDelta := cambda js -> if all (= head js) (tail js) then 1 else 0+def kroneckerDelta js := if all (= head js) (tail js) then 1 else 0 def eulerTotientFunction $n := n * product (map (\p -> 1 - 1 / p) (unique (pF n))) @@ -96,17 +96,15 @@ memoizedLambda n -> let (es, os) := evenAndOddPermutations' n in generateTensor- (cambda is ->- if member is es then 1 else if member is os then -1 else 0)+ (\is -> if member is es then 1 else if member is os then -1 else 0) (take n (repeat1 n)) def ε' := memoizedLambda n k -> let (es, os) := evenAndOddPermutations' n in generateTensor- (cambda is ->+ (\is -> match drop k is as list integer with | _ ++ $x :: _ ++ ?(< x) :: _ -> 0- | _ ->- if member is es then 1 else if member is os then -1 else 0)+ | _ -> if member is es then 1 else if member is os then -1 else 0) (take n (repeat1 n))
lib/math/expression.egi view
@@ -18,6 +18,9 @@ def mathExpr' := matcher+ | div $ $ as (mathExpr, mathExpr) with+ | Div $p1 $p2 -> [(toMathExpr' p1, toMathExpr' p2)]+ | _ -> [] | $ / $ as (mathExpr, mathExpr) with | Div $p1 $p2 -> [(toMathExpr' p1, toMathExpr' p2)] | _ -> []@@ -57,10 +60,10 @@ | Div (Plus [Term 1 [(Quote $mexpr, 1)]]) (Plus [Term 1 []]) -> [toMathExpr' mexpr] | _ -> []- | func $ $ $ $ as- (mathExpr, list mathExpr, list mathExpr, list indexExpr) with+ | func $ $ $ as+ (mathExpr, list mathExpr, list mathExpr) with | Div- (Plus [Term 1 [(Function $name $argnames $args $js, 1)]])+ (Plus [Term 1 [(Function $name $argnames $args, 1)]]) (Plus [Term 1 []]) -> [(name, argnames, args, js)] | _ -> []@@ -89,15 +92,15 @@ | $ ^ #$k * $ as (mathExpr, multExpr) with | $tgt -> matchAll tgt as mathExpr with- | term _ (ncons $x #k $xs) -> (x, product' (map (uncurry (^')) xs))+ | term _ ($x ^ #k :: $xs) -> (x, product' (map (uncurry (^')) xs)) | $ ^ $ * $ as (mathExpr, integer, multExpr) with | $tgt -> matchAll tgt as mathExpr with- | term _ (ncons $x $n $xs) -> (x, n, product' (map (uncurry (^')) xs))+ | term _ ($x ^ $n :: $xs) -> (x, n, product' (map (uncurry (^')) xs)) | $ ^ $ as (mathExpr, integer) with | $tgt -> match tgt as mathExpr with- | term _ (ncons $x $n []) -> [(x, n)]+ | term _ ($x ^ $n :: []) -> [(x, n)] | _ -> [] | $ * $ as (mathExpr, multExpr) with | $tgt ->@@ -260,7 +263,7 @@ def coefficients $f $x := let m := maximum (0 :: (matchAll f as mathExpr with- | poly (term $a (ncons #x $k $ts) :: _) / _ -> k))+ | poly (term $a (#x ^ $k :: $ts) :: _) / _ -> k)) in map (coefficient f x) (between 0 m) def coefficient $f $x $m :=@@ -274,7 +277,7 @@ def coefficient' $f $x $m := sum (matchAll f as mathExpr with- | poly (term $a (ncons #x #m (!(#x :: _) & $ts)) :: _) / _ ->+ | poly (term $a (#x ^ #m :: (!(#x :: _) & $ts)) :: _) / _ -> foldl (*') a (map (uncurry (^')) ts)) / denominator f def coefficient2 $f $x $y :=
lib/math/geometry/3d-euclidean-space.egi view
@@ -2,7 +2,7 @@ def metric := generateTensor- (\match as (integer, integer) with- | ($n, #n) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [$n, #n] -> 1+ | _ -> 0) [3, 3]
lib/math/geometry/4d-euclidean-space.egi view
@@ -2,7 +2,7 @@ def metric := generateTensor- (\match as (integer, integer) with- | ($n, #n) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [$n, #n] -> 1+ | _ -> 0) [4, 4]
lib/math/geometry/differential-form.egi view
@@ -10,6 +10,10 @@ def wedge %X %Y := X !. Y +infixl expression 7 ∧++def (∧) := wedge+ def Lie.wedge %X %Y := X !. Y - Y !. X def ι %X %Y := withSymbols [i] dfOrder Y * (X...~i . dfNormalize Y..._i)
lib/math/geometry/minkowski-space.egi view
@@ -2,8 +2,8 @@ def metric := generateTensor- (\match as (integer, integer) with- | (#1, #1) -> -1- | ($n, #n) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [#1, #1] -> -1+ | [$n, #n] -> 1+ | _ -> 0) [4, 4]
lib/math/normalize.egi view
@@ -7,7 +7,7 @@ def mathNormalize $x := if isInteger x then x- else if containFunction `rtu x+ else if containFunction 'rtu x then rewriteRuleForRtu (symbolNormalize x) else symbolNormalize x
sample/math/geometry/riemann-curvature-tensor-of-S2.egi view
@@ -9,7 +9,7 @@ def e_i_j := ∂/∂ X_j x~i -- Metric tensors-def g_i_j := generateTensor (\x y -> V.* e_x_# e_y_#) [2, 2]+def g_i_j := generateTensor (\[x, y] -> V.* e_x_# e_y_#) [2, 2] def g~i~j := M.inverse g_#_# assertEqual "Metric tensor"
sample/math/geometry/riemann-curvature-tensor-of-S5-non-sym.egi view
@@ -12,7 +12,7 @@ def e_i_j := ∂/∂ X_j x~i -- Metric tensors-def g_i_j := generateTensor (\x y -> V.* e_x_# e_y_#) [5, 5]+def g_i_j := generateTensor (\[x, y] -> V.* e_x_# e_y_#) [5, 5] def g~i~j := M.inverse g_#_# -- Christoffel symbols
sample/math/geometry/riemann-curvature-tensor-of-S5.egi view
@@ -12,7 +12,7 @@ def e_i_j := ∂/∂ X_j x~i -- Metric tensors-def g{_i_j} := generateTensor (\x y -> V.* e_x_# e_y_#) [5, 5]+def g{_i_j} := generateTensor (\[x, y] -> V.* e_x_# e_y_#) [5, 5] def g{~i~j} := M.inverse g_#_# -- Christoffel symbols
sample/math/geometry/riemann-curvature-tensor-of-T2-non-sym.egi view
@@ -1,43 +1,43 @@ -- Parameters def x := [| θ, φ |] -def X := [| '(a * cos θ + b) * cos φ -- x- , '(a * cos θ + b) * sin φ -- y+def X := [| `(a * cos θ + b) * cos φ -- x+ , `(a * cos θ + b) * sin φ -- y , a * sin θ -- z |] def e_i_j := ∂/∂ X_j x~i -- Metric tensors-def g_i_j := generateTensor (\x y -> V.* e_x_# e_y_#) [2, 2]+def g_i_j := generateTensor (\[x, y] -> V.* e_x_# e_y_#) [2, 2] def g~i~j := M.inverse g_#_# assertEqual "Metric tensor" g_#_#- [| [| a^2, 0 |], [| 0, '(a * cos θ + b)^2 |] |]_#_#+ [| [| a^2, 0 |], [| 0, `(a * cos θ + b)^2 |] |]_#_# assertEqual "Metric tensor" g~#~#- [| [| 1 / a^2, 0 |], [| 0, 1 / '(a * cos θ + b)^2 |] |]~#~#+ [| [| 1 / a^2, 0 |], [| 0, 1 / `(a * cos θ + b)^2 |] |]~#~# -- Christoffel symbols def Γ_i_j_k := (1 / 2) * (∂/∂ g_i_k x~j + ∂/∂ g_i_j x~k - ∂/∂ g_j_k x~i) assertEqual "Christoffel symbols of the first kind" Γ_1_#_#- [| [| 0, 0 |], [| 0, '(a * cos θ + b) * a * sin θ |] |]_#_#+ [| [| 0, 0 |], [| 0, `(a * cos θ + b) * a * sin θ |] |]_#_# assertEqual "Christoffel symbols of the first kind" Γ_2_#_#- [| [| 0, -1 * '(a * cos θ + b) * a * sin θ |], [| -1 * '(a * cos θ + b) * a * sin θ, 0 |] |]_#_#+ [| [| 0, -1 * `(a * cos θ + b) * a * sin θ |], [| -1 * `(a * cos θ + b) * a * sin θ, 0 |] |]_#_# def Γ~i_j_k := withSymbols [m] g~i~m . Γ_m_j_k assertEqual "Christoffel symbols of the second kind" Γ~1_#_#- [| [| 0, 0 |], [| 0, '(a * cos θ + b) * sin θ / a |] |]_#_#+ [| [| 0, 0 |], [| 0, `(a * cos θ + b) * sin θ / a |] |]_#_# assertEqual "Christoffel symbols of the second kind" Γ~2_#_#- [| [| 0, -1 * a * sin θ / '(a * cos θ + b) |], [| -1 * a * sin θ / '(a * cos θ + b), 0 |] |]_#_#+ [| [| 0, -1 * a * sin θ / `(a * cos θ + b) |], [| -1 * a * sin θ / `(a * cos θ + b), 0 |] |]_#_# -- Riemann curvature def R~i_j_k_l := withSymbols [m]@@ -48,10 +48,10 @@ [| [| 0, 0 |], [| 0, 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_1_2- [| [| 0, '(a * cos θ + b) * cos θ / a |], [| -1 * a * cos θ / '(a * cos θ + b), 0 |] |]~#_#+ [| [| 0, `(a * cos θ + b) * cos θ / a |], [| -1 * a * cos θ / `(a * cos θ + b), 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_2_1- [| [| 0, -1 * '(a * cos θ + b) * cos θ / a |], [| a * cos θ / '(a * cos θ + b), 0 |] |]~#_#+ [| [| 0, -1 * `(a * cos θ + b) * cos θ / a |], [| a * cos θ / `(a * cos θ + b), 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_2_2 [| [| 0, 0 |], [| 0, 0 |] |]~#_#@@ -64,10 +64,10 @@ [| [| 0, 0 |], [| 0, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_1_2- [| [| 0, a * '(a * cos θ + b) * cos θ |], [| - '(a * cos θ + b) * a * cos θ, 0 |] |]_#_#+ [| [| 0, a * `(a * cos θ + b) * cos θ |], [| - `(a * cos θ + b) * a * cos θ, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_2_1- [| [| 0, - a * '(a * cos θ + b) * cos θ |], [| '(a * cos θ + b) * a * cos θ, 0 |] |]_#_#+ [| [| 0, - a * `(a * cos θ + b) * cos θ |], [| `(a * cos θ + b) * a * cos θ, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_2_2 [| [| 0, 0 |], [| 0, 0 |] |]_#_#@@ -82,4 +82,4 @@ assertEqual "scalar curvature" scalarCurvature- (2 * cos θ / (a * '(a * cos θ + b)))+ (2 * cos θ / (a * `(a * cos θ + b)))
sample/math/geometry/riemann-curvature-tensor-of-T2.egi view
@@ -1,43 +1,43 @@ -- Parameters def x := [| θ, φ |] -def X := [| '(a * cos θ + b) * cos φ -- x- , '(a * cos θ + b) * sin φ -- y+def X := [| `(a * cos θ + b) * cos φ -- x+ , `(a * cos θ + b) * sin φ -- y , a * sin θ -- z |] def e_i_j := ∂/∂ X_j x~i -- Metric tensors-def g{_i_j} := generateTensor (\x y -> V.* e_x_# e_y_#) [2, 2]+def g{_i_j} := generateTensor (\[x, y] -> V.* e_x_# e_y_#) [2, 2] def g{~i~j} := M.inverse g_#_# assertEqual "Metric tensor" g_#_#- [| [| a^2, 0 |], [| 0, '(a * cos θ + b)^2 |] |]_#_#+ [| [| a^2, 0 |], [| 0, `(a * cos θ + b)^2 |] |]_#_# assertEqual "Metric tensor" g~#~#- [| [| 1 / a^2, 0 |], [| 0, 1 / '(a * cos θ + b)^2 |] |]~#~#+ [| [| 1 / a^2, 0 |], [| 0, 1 / `(a * cos θ + b)^2 |] |]~#~# -- Christoffel symbols def Γ_i{_j_k} := (1 / 2) * (∂/∂ g_i_k x~j + ∂/∂ g_i_j x~k - ∂/∂ g_j_k x~i) assertEqual "Christoffel symbols of the first kind" Γ_1_#_#- [| [| 0, 0 |], [| 0, '(a * cos θ + b) * a * sin θ |] |]_#_#+ [| [| 0, 0 |], [| 0, `(a * cos θ + b) * a * sin θ |] |]_#_# assertEqual "Christoffel symbols of the first kind" Γ_2_#_#- [| [| 0, -1 * '(a * cos θ + b) * a * sin θ |], [| -1 * '(a * cos θ + b) * a * sin θ, 0 |] |]_#_#+ [| [| 0, -1 * `(a * cos θ + b) * a * sin θ |], [| -1 * `(a * cos θ + b) * a * sin θ, 0 |] |]_#_# def Γ~i{_j_k} := withSymbols [m] g~i~m . Γ_m_j_k assertEqual "Christoffel symbols of the second kind" Γ~1_#_#- [| [| 0, 0 |], [| 0, '(a * cos θ + b) * sin θ / a |] |]_#_#+ [| [| 0, 0 |], [| 0, `(a * cos θ + b) * sin θ / a |] |]_#_# assertEqual "Christoffel symbols of the second kind" Γ~2_#_#- [| [| 0, -1 * a * sin θ / '(a * cos θ + b) |], [| -1 * a * sin θ / '(a * cos θ + b), 0 |] |]_#_#+ [| [| 0, -1 * a * sin θ / `(a * cos θ + b) |], [| -1 * a * sin θ / `(a * cos θ + b), 0 |] |]_#_# -- Riemann curvature def R~i_j_k_l := withSymbols [m]@@ -48,10 +48,10 @@ [| [| 0, 0 |], [| 0, 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_1_2- [| [| 0, '(a * cos θ + b) * cos θ / a |], [| -1 * a * cos θ / '(a * cos θ + b), 0 |] |]~#_#+ [| [| 0, `(a * cos θ + b) * cos θ / a |], [| -1 * a * cos θ / `(a * cos θ + b), 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_2_1- [| [| 0, -1 * '(a * cos θ + b) * cos θ / a |], [| a * cos θ / '(a * cos θ + b), 0 |] |]~#_#+ [| [| 0, -1 * `(a * cos θ + b) * cos θ / a |], [| a * cos θ / `(a * cos θ + b), 0 |] |]~#_# assertEqual "riemann curvature" R~#_#_2_2 [| [| 0, 0 |], [| 0, 0 |] |]~#_#@@ -64,10 +64,10 @@ [| [| 0, 0 |], [| 0, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_1_2- [| [| 0, a * '(a * cos θ + b) * cos θ |], [| - '(a * cos θ + b) * a * cos θ, 0 |] |]_#_#+ [| [| 0, a * `(a * cos θ + b) * cos θ |], [| - `(a * cos θ + b) * a * cos θ, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_2_1- [| [| 0, - a * '(a * cos θ + b) * cos θ |], [| '(a * cos θ + b) * a * cos θ, 0 |] |]_#_#+ [| [| 0, - a * `(a * cos θ + b) * cos θ |], [| `(a * cos θ + b) * a * cos θ, 0 |] |]_#_# assertEqual "riemann curvature" R_#_#_2_2 [| [| 0, 0 |], [| 0, 0 |] |]_#_#@@ -82,4 +82,4 @@ assertEqual "scalar curvature" scalarCurvature- (2 * cos θ / (a * '(a * cos θ + b)))+ (2 * cos θ / (a * `(a * cos θ + b)))
sample/math/geometry/thurston-non-sym.egi view
@@ -8,15 +8,15 @@ [|[| 1, 0, 0, 0 |], [| 0, 1, 0, 0 |], [| 0, 0, κ / (sqrt β), (-1 * θ₂ * κ) / (sqrt β) |],- [| 0, 0, (-1 * θ₂ * κ) / (sqrt β), ('(1 + θ₂) * κ) / (sqrt β) |]|]+ [| 0, 0, (-1 * θ₂ * κ) / (sqrt β), (`(1 + θ₂) * κ) / (sqrt β) |]|] def g~i~j := [|[| 1, 0, 0, 0 |], [| 0, 1, 0, 0 |],- [| 0, 0, '(1 + θ₂) / (κ * (sqrt β)), θ₂ / ((sqrt β) * κ) |],+ [| 0, 0, `(1 + θ₂) / (κ * (sqrt β)), θ₂ / ((sqrt β) * κ) |], [| 0, 0, θ₂ / ((sqrt β) * κ), 1 / ((sqrt β) * κ) |]|] -def β := '(1 + θ₂ - θ₂^2)+def β := `(1 + θ₂ - θ₂^2) def Γ~c_a_b := withSymbols [e] (1 / 2) * g~c~e . (∂/∂ g_b_e x~a + ∂/∂ g_a_e x~b - ∂/∂ g_a_b x~e)@@ -52,25 +52,25 @@ def δ := generateTensor- (\x y -> match (x, y) as (integer, integer) with- | ($n, #n) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [$n, #n] -> 1+ | _ -> 0) [5, 5] def R'_i_j_k~l := generateTensor- (\x y z w -> match (x, y, z, w) as (integer, integer, integer, integer) with- | (#1, #1, _, _) -> 0- | (_, _, #1, #1) -> 0- | (#1, $b, #1, $d) -> -1 * p^2 * δ~(b - 1)_(d - 1)- | ($a, #1, #1, $d) -> p^2 * δ~(a - 1)_(d - 1)- | (#1, $b, $c, #1) -> p^2 * g_(b - 1)_(c - 1)- | ($a, #1, $c, #1) -> -1 * p^2 * g_(a - 1)_(c - 1)- | (#1, $b, $c, $d) -> -1 * p * ∇J_(b - 1)_(c - 1)~(d - 1)- | ($a, #1, $c, $d) -> p * ∇J_(a - 1)_(c - 1)~(d - 1)- | ($a, $b, #1, $d) -> -1 * p * ∇J~(d - 1)_(a - 1)_(b - 1)- | ($a, $b, $c, #1) -> p * ∇J_(c - 1)_(a - 1)_(b - 1)- | ($a, $b, $c, $d) -> R_(a - 1)_(b - 1)_(c - 1)~(d - 1)+ (\match as list integer with+ | [#1, #1, _, _] -> 0+ | [_, _, #1, #1] -> 0+ | [#1, $b, #1, $d] -> -1 * p^2 * δ~(b - 1)_(d - 1)+ | [$a, #1, #1, $d] -> p^2 * δ~(a - 1)_(d - 1)+ | [#1, $b, $c, #1] -> p^2 * g_(b - 1)_(c - 1)+ | [$a, #1, $c, #1] -> -1 * p^2 * g_(a - 1)_(c - 1)+ | [#1, $b, $c, $d] -> -1 * p * ∇J_(b - 1)_(c - 1)~(d - 1)+ | [$a, #1, $c, $d] -> p * ∇J_(a - 1)_(c - 1)~(d - 1)+ | [$a, $b, #1, $d] -> -1 * p * ∇J~(d - 1)_(a - 1)_(b - 1)+ | [$a, $b, $c, #1] -> p * ∇J_(c - 1)_(a - 1)_(b - 1)+ | [$a, $b, $c, $d] -> R_(a - 1)_(b - 1)_(c - 1)~(d - 1) + -1 * p^2 * J_(b - 1)_(c - 1) * J_(a - 1)~(d - 1) + p^2 * J_(a - 1)_(c - 1) * J_(b - 1)~(d - 1) + 2 * p^2 * J_(a - 1)_(b - 1) * J_(c - 1)~(d - 1))
sample/math/geometry/thurston.egi view
@@ -8,15 +8,15 @@ [|[| 1, 0, 0, 0 |], [| 0, 1, 0, 0 |], [| 0, 0, κ / (sqrt β), (-1 * θ₂ * κ) / (sqrt β) |],- [| 0, 0, (-1 * θ₂ * κ) / (sqrt β), ('(1 + θ₂) * κ) / (sqrt β) |]|]+ [| 0, 0, (-1 * θ₂ * κ) / (sqrt β), (`(1 + θ₂) * κ) / (sqrt β) |]|] def g~i~j := [|[| 1, 0, 0, 0 |], [| 0, 1, 0, 0 |],- [| 0, 0, '(1 + θ₂) / (κ * (sqrt β)), θ₂ / ((sqrt β) * κ) |],+ [| 0, 0, `(1 + θ₂) / (κ * (sqrt β)), θ₂ / ((sqrt β) * κ) |], [| 0, 0, θ₂ / ((sqrt β) * κ), 1 / ((sqrt β) * κ) |]|] -def β := '(1 + θ₂ - θ₂^2)+def β := `(1 + θ₂ - θ₂^2) def Γ~c_a_b := withSymbols [e] (1 / 2) * g~c~e . (∂/∂ g_b_e x~a + ∂/∂ g_a_e x~b - ∂/∂ g_a_b x~e)@@ -34,9 +34,13 @@ def J_a~c := J_a_b . g~b~c +def ∇_c T~(a_1)...~(a_r)_(b_1)..._(b_k) :=+ ∂/∂ T~(a_1)...~(a_r)_(b_1)..._(b_k) x~c+ + sum (map (\i -> Γ~(a_i)_d_c . T~(a_1)...~(a_(i-1))~d~(a_(i+1))...~(a_r)_(b_1)..._(b_k)) [1..r])+ - sum (map (\i -> Γ~d_(b_i)_c . T~(a_1)...~(a_r)_(b_1)..._(b_(i-1))_d_(b_(i+1))..._(b_k)) [1..k])+ def ∇J_m_a_b :=- withSymbols [n]- ∂/∂ J_a_b x~m + Γ~n_m_a . J_n_b + Γ~n_m_b . J_a_n+ ∇_m J_a_b -- ∂/∂ J_a_b x~m - Γ~n_m_a . J_n_b - Γ~n_m_b . J_a_n def ∇J~m_a_b := withSymbols [t]@@ -52,25 +56,25 @@ def δ := generateTensor- (\x y -> match (x, y) as (integer, integer) with- | ($n, #n) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [$n, #n] -> 1+ | [_, _] -> 0) [5, 5] def R'[_i_j]_k~l := generateTensor- (\x y z w -> match (x, y, z, w) as (integer, integer, integer, integer) with- | (#1, #1, _, _) -> 0- | (_, _, #1, #1) -> 0- | (#1, $b, #1, $d) -> -1 * p^2 * δ~(b - 1)_(d - 1)- | ($a, #1, #1, $d) -> p^2 * δ~(a - 1)_(d - 1)- | (#1, $b, $c, #1) -> p^2 * g_(b - 1)_(c - 1)- | ($a, #1, $c, #1) -> -1 * p^2 * g_(a - 1)_(c - 1)- | (#1, $b, $c, $d) -> -1 * p * ∇J_(b - 1)_(c - 1)~(d - 1)- | ($a, #1, $c, $d) -> p * ∇J_(a - 1)_(c - 1)~(d - 1)- | ($a, $b, #1, $d) -> -1 * p * ∇J~(d - 1)_(a - 1)_(b - 1)- | ($a, $b, $c, #1) -> p * ∇J_(c - 1)_(a - 1)_(b - 1)- | ($a, $b, $c, $d) -> R_(a - 1)_(b - 1)_(c - 1)~(d - 1)+ (\match as list integer with+ | [#1, #1, _, _] -> 0+ | [_, _, #1, #1] -> 0+ | [#1, $b, #1, $d] -> -1 * p^2 * δ~(b - 1)_(d - 1)+ | [$a, #1, #1, $d] -> p^2 * δ~(a - 1)_(d - 1)+ | [#1, $b, $c, #1] -> p^2 * g_(b - 1)_(c - 1)+ | [$a, #1, $c, #1] -> -1 * p^2 * g_(a - 1)_(c - 1)+ | [#1, $b, $c, $d] -> -1 * p * ∇J_(b - 1)_(c - 1)~(d - 1)+ | [$a, #1, $c, $d] -> p * ∇J_(a - 1)_(c - 1)~(d - 1)+ | [$a, $b, #1, $d] -> -1 * p * ∇J~(d - 1)_(a - 1)_(b - 1)+ | [$a, $b, $c, #1] -> p * ∇J_(c - 1)_(a - 1)_(b - 1)+ | [$a, $b, $c, $d] -> R_(a - 1)_(b - 1)_(c - 1)~(d - 1) + -1 * p^2 * J_(b - 1)_(c - 1) * J_(a - 1)~(d - 1) + p^2 * J_(a - 1)_(c - 1) * J_(b - 1)~(d - 1) + 2 * p^2 * J_(a - 1)_(b - 1) * J_(c - 1)~(d - 1))
+ sample/math/number/5th-root-of-unity.egi view
@@ -0,0 +1,53 @@+--+-- This file has been auto-generated by egison-translator.+--++def z := rtu 5++def a11 := z ^ 1 + z ^ 4++def a12 := z ^ 2 + z ^ 3++def b10 := a11 + a12++def b11 := a11 - a12++def b12 := a12 - a11++assertEqual "b10" b10 (-1)++def b10' := b10++def b11' := sqrt (b11 ^ 2)++def a11' := (b10' + b11') / 2++def a12' := (b10' - b11') / 2++def a21 := z ^ 1 - z ^ 4++def a22 := z ^ 2 - z ^ 3++def b20 := a21 + a22++def b21 := a21 - a22++def b22 := a22 - a21++def b20' := sqrt ((-3) + 4 * a12')++def b21' := sqrt ((-3) + 4 * a11')++def a21' := (b20' + b21') / 2++def a22' := (b20' - b21') / 2++def z1' := (a11' + a21') / 2++assertEqual+ "5th-root-of-unity"+ z1'+ ((-1 + sqrt 5 + sqrt (-5 - 2 * sqrt 5) + sqrt (-5 + 2 * sqrt 5)) / 4)+++z1'^5
+ sample/math/number/7th-root-of-unity.egi view
@@ -0,0 +1,51 @@+--+-- This file has been auto-generated by egison-translator.+--++def z := rtu 7++def a11 := z ^ 1 + z ^ 6++def a12 := z ^ 2 + z ^ 5++def a13 := z ^ 3 + z ^ 4++def b10 := a11 + a12 + a13++def b10' := b10++b10'++def b11 := a11 + w * a12 + w ^ 2 * a13++def b12 := a13 + w * a11 + w ^ 2 * a12++def b13 := a12 + w * a13 + w ^ 2 * a11++def b11' := rt 3 (b11 * b12 * b13)++b11'++def b14 := a11 + w * a13 + w ^ 2 * a12++def b15 := a12 + w * a11 + w ^ 2 * a13++def b16 := a13 + w * a12 + w ^ 2 * a11++def b14' := rt 3 (b14 * b15 * b16)++b14'++def a11' := (b10' + b11' + b14') / 3++a11'++def z1' := fst (qF' 1 (- a11') 1)++z1'++--((-1) + rt 3 (14 + 21 * w) + rt 3 ((-7) + (-21) * w) ++--sqrt+-- ((-35) + (-2) * rt 3 (14 + 21 * w) + (-2) * rt 3 ((-7) + (-21) * w) ++-- rt 3 (14 + 21 * w) ^ 2 + rt 3 ((-7) + (-21) * w) ^ 2 ++-- 2 * rt 3 (14 + 21 * w) * rt 3 ((-7) + (-21) * w))) / 6
sample/math/number/tribonacci.egi view
@@ -2,10 +2,10 @@ def A := generateTensor- (\x y -> match (x, y) as (integer, integer) with- | (#1, _) -> 1- | ($x, #(x - 1)) -> 1- | (_, _) -> 0)+ (\match as list integer with+ | [#1, _] -> 1+ | [$x, #(x - 1)] -> 1+ | _ -> 0) [m, m] A@@ -13,7 +13,7 @@ def B := generateTensor- (\x -> if x = 1 then 1 else 0)+ (\[x] -> if x = 1 then 1 else 0) [m] B
sample/sat/dp.egi view
@@ -1,7 +1,3 @@------ This file has been auto-generated by egison-translator.---- def deleteLiteral l cnf := map (\c -> matchAll c as multiset integer with@@ -22,7 +18,9 @@ def dp vars cnf := match (vars, cnf) as (multiset integer, multiset (multiset integer)) with+ -- satisfiable | (_, []) -> True+ -- unsatisfiable | (_, [] :: _) -> False -- 1-literal rule | (_, [$l] :: _) -> dp (delete (abs l) vars) (assignTrue l cnf)@@ -35,11 +33,12 @@ dp vs ((resolveOn v cnf) ++ (deleteClausesWith v (deleteClausesWith (neg v) cnf))) -dp [1] [[1]]-dp [1] [[1], [-1]]-dp [1, 2, 3] [[1, 2], [-1, 3], [1, -3]]-dp [1, 2] [[1, 2], [-1, -2], [1, -2]]-dp [1, 2] [[1, 2], [-1, -2], [1, -2], [-1, 2]]-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]]-dp [1, 2] [[-1, -2], [1]]+assert "dp" (dp [1] [[1]])+assert "dp" (not (dp [1] [[1], [-1]]))+assert "dp" (dp [1, 2, 3] [[1, 2], [-1, 3], [1, -3]])+assert "dp" (dp [1, 2] [[1, 2], [-1, -2], [1, -2]])+assert "dp" (not (dp [1, 2] [[1, 2], [-1, -2], [1, -2], [-1, 2]]))+assert "dp" (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]])+assert "dp" (dp [1, 2] [[-1, -2], [1]])
+ test/CLITest.hs view
@@ -0,0 +1,88 @@+module Main (main) where++import Data.Version (showVersion)+import System.Process (readProcess)++import Test.Framework (defaultMain)+import Test.Framework.Providers.HUnit (hUnitTestToTests)+import Test.HUnit++import Language.Egison (version)++main :: IO ()+main = defaultMain . hUnitTestToTests . test $ TestList+ [ TestLabel "load-file option" . TestCase $ assertEgisonCmd+ (interpreter "1\n")+ ["--load-file", "test/fixture/a.egi"]+ "x"+ , TestLabel "test option" . TestCase $ assertEgisonCmd+ "3\n\"This is the third line\"\n"+ ["--test", "test/fixture/b.egi"]+ ""+ , TestLabel "eval option" . TestCase $ assertEgisonCmd+ "[[], [1], [1, 2], [1, 2, 3]]\n"+ ["--eval", "matchAll [1,2,3] as list something with $x ++ _ -> x"]+ ""+ , TestLabel "command option" . TestCase $ assertEgisonCmd+ "1\n"+ ["--command", "print (show 1)"]+ ""+ , TestLabel "TSV option" . TestCase $ assertEgisonCmd+ "2\n3\n5\n7\n11\n13\n17\n19\n23\n29\n"+ ["-T", "-e", "take 10 primes"]+ ""+ , TestLabel "TSV option with tab" . TestCase $ assertEgisonCmd+ "1\t2\t3\n4\t5\n"+ ["-T", "-e", "[[1, 2, 3], [4, 5]]"]+ ""+ , TestLabel "substitute option" . TestCase $ assertEgisonCmd+ "10\n11\n12\n13\n14\n15\n"+ ["--substitute", "\\matchAll as list integer with _ ++ $x :: _ ++ #(x + 5) :: _ -> x"]+ "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20"+ , TestLabel "map option" . TestCase $ assertEgisonCmd+ "3\n4\n5\n6\n7\n"+ ["--map", "\\x -> x + 2"]+ "1\n2\n3\n4\n5"+ , TestLabel "filter option" . TestCase $ assertEgisonCmd+ "2\n3\n5\n7\n"+ ["--filter", "isPrime"]+ "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"+ , TestLabel "field option" . TestCase $ assertEgisonCmd+ "(10, [2, 5])\n(11, [11])\n(12, [2, 2, 3])\n(13, [13])\n(14, [2, 7])\n(15, [3, 5])\n"+ ["--field", "2c", "-m", "\\x -> x"]+ "10\t2\t5\n11\t11\n12\t2\t2\t3\n13\t13\n14\t2\t7\n15\t3\t5"+ , TestLabel "math option" . TestCase $ assertEgisonCmd+ (interpreter "#latex|\\frac{x}{y}|#\n")+ ["--math", "latex"]+ "x / y"+ , TestLabel "sexpr option" . TestCase $ assertEgisonCmd+ (interpreter "3\n")+ ["--sexpr-syntax"]+ "(+ 1 2)"+ , TestLabel "execute main function" . TestCase $ assertEgisonCmd+ "[\"a\", \"b\", \"c\"]\n"+ ["test/fixture/c.egi", "a", "b", "c"]+ ""+ , TestLabel "io function" . TestCase $ assertEgisonCmd+ "display write print\n3\n1 + 2 = 3\n"+ ["test/lib/core/io.egi"]+ ""+ ]++assertEgisonCmd+ :: String -- The expected value+ -> [String] -- any arguments for egison command+ -> String -- standard input for egison command+ -> Assertion+assertEgisonCmd expected args input = do+ actual <- readProcess "stack" ("exec" : "--" : "egison" : args) input+ assertEqual "" expected actual++interpreter :: String -> String+interpreter output = concat+ [ "Egison Version ", showVersion version, "\n"+ , "https://www.egison.org\n"+ , "Welcome to Egison Interpreter!\n"+ , "> ", output+ , "> Leaving Egison Interpreter.\n"+ ]
− test/OptionsTest.hs
@@ -1,84 +0,0 @@-module Main (main) where--import Data.Version (showVersion)-import System.Process (readProcess)--import Test.Framework (defaultMain)-import Test.Framework.Providers.HUnit (hUnitTestToTests)-import Test.HUnit--import Language.Egison (version)--main :: IO ()-main = defaultMain . hUnitTestToTests . test $ TestList- [ TestLabel "load-file option" . TestCase $ assertEgisonCmd- (interpreter "1\n")- ["--load-file", "test/fixture/a.egi"]- "x"- , TestLabel "test option" . TestCase $ assertEgisonCmd- "3\n\"This is the third line\"\n"- ["--test", "test/fixture/b.egi"]- ""- , TestLabel "eval option" . TestCase $ assertEgisonCmd- "[[], [1], [1, 2], [1, 2, 3]]\n"- ["--eval", "matchAll [1,2,3] as list something with $x ++ _ -> x"]- ""- , TestLabel "command option" . TestCase $ assertEgisonCmd- "1\n"- ["--command", "print (show 1)"]- ""- , TestLabel "TSV option" . TestCase $ assertEgisonCmd- "2\n3\n5\n7\n11\n13\n17\n19\n23\n29\n"- ["-T", "-e", "take 10 primes"]- ""- , TestLabel "TSV option with tab" . TestCase $ assertEgisonCmd- "1\t2\t3\n4\t5\n"- ["-T", "-e", "[[1, 2, 3], [4, 5]]"]- ""- , TestLabel "substitute option" . TestCase $ assertEgisonCmd- "10\n11\n12\n13\n14\n15\n"- ["--substitute", "\\matchAll as list integer with _ ++ $x :: _ ++ #(x + 5) :: _ -> x"]- "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20"- , TestLabel "map option" . TestCase $ assertEgisonCmd- "3\n4\n5\n6\n7\n"- ["--map", "\\x -> x + 2"]- "1\n2\n3\n4\n5"- , TestLabel "filter option" . TestCase $ assertEgisonCmd- "2\n3\n5\n7\n"- ["--filter", "isPrime"]- "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"- , TestLabel "field option" . TestCase $ assertEgisonCmd- "(10, [2, 5])\n(11, [11])\n(12, [2, 2, 3])\n(13, [13])\n(14, [2, 7])\n(15, [3, 5])\n"- ["--field", "2c", "-m", "\\x -> x"]- "10\t2\t5\n11\t11\n12\t2\t2\t3\n13\t13\n14\t2\t7\n15\t3\t5"- , TestLabel "math option" . TestCase $ assertEgisonCmd- (interpreter "#latex|\\frac{x}{y}|#\n")- ["--math", "latex"]- "x / y"- , TestLabel "sexpr option" . TestCase $ assertEgisonCmd- (interpreter "3\n")- ["--sexpr-syntax"]- "(+ 1 2)"- , TestLabel "execute main function" . TestCase $ assertEgisonCmd- "[\"a\", \"b\", \"c\"]\n"- ["test/fixture/c.egi", "a", "b", "c"]- ""- ]--assertEgisonCmd- :: String -- The expected value- -> [String] -- any arguments for egison command- -> String -- standard input for egison command- -> Assertion-assertEgisonCmd expected args input = do- actual <- readProcess "stack" ("exec" : "--" : "egison" : args) input- assertEqual "" expected actual--interpreter :: String -> String-interpreter output = concat- [ "Egison Version ", showVersion version, "\n"- , "https://www.egison.org\n"- , "Welcome to Egison Interpreter!\n"- , "> ", output- , "> Leaving Egison Interpreter.\n"- ]
test/Test.hs view
@@ -26,6 +26,9 @@ , "test/lib/core/maybe.egi" , "test/lib/core/number.egi" , "test/lib/core/order.egi"+ , "test/lib/core/random.egi"+ , "test/lib/core/shell.egi"+ , "test/lib/core/sort.egi" , "test/lib/core/string.egi" , "test/lib/math/algebra.egi" , "test/lib/math/analysis.egi"
test/lib/core/assoc.egi view
@@ -10,31 +10,6 @@ (fromAssoc [(x, 2), (y, 1)]) [x, x, y] -assertEqual "assocList"- (matchAll [(x, 2), (y, 1)] as assocList something with- | $a :: _ -> a)- [x]--assertEqual "assocList"- (matchAll [(x, 3), (y, 2), (z, 1)] as assocList something with- | ncons $a #2 $r -> (a, r))- [(x, [(x, 1), (y, 2), (z, 1)])]--assertEqual "assocList"- (matchAll [(x, 1), (y, 2), (z, 3)] as assocList something with- | ncons $a #2 $r -> (a, r))- []--assertEqual "assocList"- (matchAll [(x, 3), (y, 2), (z, 1)] as assocList something with- | ncons $a $n $r -> (a, n, r))- [(x, 3, [(y, 2), (z, 1)])]--assertEqual "assocList"- (matchAll [(x, 3), (y, 2), (z, 1)] as assocList something with- | ncons $a $n $r -> (a, n, r))- [(x, 3, [(y, 2), (z, 1)])]- assertEqual "assocMultiset" (matchAll [(x, 2), (y, 1)] as assocMultiset something with | $a :: _ -> a)@@ -42,22 +17,22 @@ assertEqual "assocMultiset" (matchAll [(x, 3), (y, 2), (z, 1)] as assocMultiset something with- | ncons #z $n $r -> (n, r))+ | #z ^ $n :: $r -> (n, r)) [(1, [(x, 3), (y, 2)])] assertEqual "assocMultiset" (matchAll [(x, 3), (y, 2), (z, 1)] as assocMultiset something with- | ncons $a #2 $r -> (a, r))+ | $a ^ #2 :: $r -> (a, r)) [(x, [(x, 1), (y, 2), (z, 1)]), (y, [(x, 3), (z, 1)])] assertEqual "assocMultiset" (matchAll [(x, 3), (y, 2), (z, 1)] as assocMultiset something with- | ncons #y #1 $r -> r)+ | #y ^ #1 :: $r -> r) [[(x, 3), (y, 1), (z, 1)]] assertEqual "assocMultiset" (matchAll [(x, 3), (y, 2), (z, 1)] as assocMultiset something with- | ncons $a $n $r -> (a, n, r))+ | $a ^ $n :: $r -> (a, n, r)) [(x, 3, [(y, 2), (z, 1)]), (y, 2, [(x, 3), (z, 1)]), (z, 1, [(x, 3), (y, 2)])] assertEqual "AC.intersect"
+ test/lib/core/io.egi view
@@ -0,0 +1,51 @@+def main args := do+ display "display"+ write " write"+ print " print"+ testPrintToPort+ testEach+ testEachLineFromPort+ let _ := return $ debug (1 + 2)+ let _ := return $ debug2 "1 + 2 = " (1 + 2)+ return ()++def testPrintToPort := do+ let op := openOutputFile "out.txt"+ displayToPort op "displayToPort"+ writeToPort op " writeToPort"+ printToPort op " printToPort"+ closeOutputPort op+ let out := readProcess "cat" ["out.txt"] ""+ let _ := return $+ assertEqual "testPrintToPort" (S.split "\n" out)+ ["displayToPort writeToPort printToPort", ""]+ let _ := readProcess "rm" ["out.txt"] ""+ return ()++def testEach := do+ let op := openOutputFile "out.txt"+ each (printToPort op) ["foo", "bar"]+ closeOutputPort op+ let out := readProcess "cat" ["out.txt"] ""+ let _ := return $+ assertEqual "testEach" (S.split "\n" out) ["foo", "bar", ""]+ let _ := readProcess "rm" ["out.txt"] ""+ return ()++def testEachLineFromPort := do+ let ip := openInputFile "test/fixture/lorem-ipsum.txt"+ let op := openOutputFile "out.txt"+ eachLineFromPort ip (\x -> printToPort op (S.map upperCase x))+ closeInputPort ip+ closeOutputPort op+ let out := readProcess "cat" ["out.txt"] ""+ let _ := return $+ assertEqual "testEachLineFromPort" (S.split "\n" out)+ [ "LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA."+ , "UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT."+ , "DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR."+ , "EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM."+ , ""+ ]+ let _ := readProcess "rm" ["out.txt"] ""+ return ()
test/lib/core/number.egi view
@@ -70,7 +70,7 @@ assertEqual "nAdic" (nAdic 2 10) [1, 0, 1, 0] assertEqual "rtod"- ((\(x, y) -> (x, take 10 y)) (rtod (6 / 35)))+ ((2)#(%1, take 10 %2) (rtod (6 / 35))) (0, [1, 7, 1, 4, 2, 8, 5, 7, 1, 4]) assertEqual "rtod'" (rtod' (6 / 35)) (0, [1], [7, 1, 4, 2, 8, 5])@@ -106,7 +106,7 @@ assertEqual "regularContinuedFractionOfSqrt case 1"- ((\(x, y) -> (x, take 10 y)) (regularContinuedFractionOfSqrt 2))+ ((2)#(%1, take 10 %2) (regularContinuedFractionOfSqrt 2)) (1, [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) assertEqual
test/lib/core/order.egi view
@@ -1,43 +1,50 @@-assertEqual "compare"- (compare 10 10)- Equal--assertEqual "compare"- (compare 11 10)- Greater--assertEqual "compare"- (compare 10 11)- Less+assertEqual "compare" (compare 10 10) Equal+assertEqual "compare" (compare 11 10) Greater+assertEqual "compare" (compare 10 11) Less -assertEqual "min"- (min 20 5)- 5+assertEqual "compareC" (compareC [1, 2] [1]) Greater+assertEqual "compareC" (compareC [1] [1, 2]) Less+assertEqual "compareC" (compareC [1, 2] [1, 3]) Less+assertEqual "compareC" (compareC [1, 3] [1, 3]) Equal -assertEqual "minimum"- (minimum [20, 5, 12])- 5+assertEqual "min" (min 20 5) 5+assertEqual "max" (max 5 30) 30 -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/fn" (max/fn compare [10, 20, 5, 20, 30]) 30 -assertEqual "max"- (max 5 30)- 30+assertEqual "minimum" (minimum [20, 5, 12]) 5+assertEqual "maximum" (maximum [5, 30, 23]) 30 -assertEqual "maximum"- (maximum [5, 30, 23])- 30+assertEqual "splitByOrdering"+ (splitByOrdering 2 [1, 2, 3, 2, 3, 4, 5])+ ([1], [2, 2], [3, 3, 4, 5]) -assertEqual "max/fn"- (max/fn compare [10, 20, 5, 20, 30])- 30+assertEqual "splitByOrdering/fn"+ (splitByOrdering/fn (\_ _ -> Equal) 2 [1, 2, 3, 4, 5])+ ([], [1, 2, 3, 4, 5], []) 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]+ (sort/fn+ (\x y -> match compare x y as ordering with+ | greater -> Less+ | less -> Greater+ | equal -> Equal)+ [10, 20, 5, 20, 30])+ [30, 20, 20, 10, 5]++assertEqual "sortStrings"+ (sortStrings ["banana", "apple", "chocolate"])+ ["apple", "banana", "chocolate"]++assertEqual "minimize"+ (minimize S.length ["banana", "apple", "chocolate"])+ "apple"++assertEqual "maximize"+ (maximize S.length ["banana", "apple", "chocolate"])+ "chocolate"
+ test/lib/core/random.egi view
@@ -0,0 +1,50 @@+assert "rands"+ (all (`member` [1..10]) (take 5 (rands 1 10)))++assert "pureRand"+ (member (pureRand 1 10) [1..10])++assertEqual "randomize" (randomize []) []+assert "randomize" (eqAs (multiset integer) (randomize [1, 2, 3]) [1, 2, 3])++assert "R.between"+ (eqAs (multiset integer) (R.between 1 10) [1..10])++assert "R.multiset"+ (member+ (matchAll [1, 2] as R.multiset integer with $n :: $ns -> (n, ns))+ [[(1, [2]), (2, [1])], [(2, [1]), (1, [2])]])++assertEqual "R.multiset"+ (matchAll [1, 2] as R.multiset integer with #1 :: $ns -> ns)+ [[2]]++assert "R.set"+ (member+ (matchAll [1, 2] as R.set integer with $n :: $ns -> (n, ns))+ [[(1, [1, 2]), (2, [1, 2])], [(2, [1, 2]), (1, [1, 2])]])++assertEqual "R.set"+ (matchAll [1, 2] as R.set integer with #1 :: $ns -> ns)+ [[1, 2]]++assert "R.uncons"+ (member (R.uncons [1, 2]) [(1, [2]), (2, [1])])++assert "R.head"+ (member (R.head [1..10]) [1..10])++assert "R.tail"+ (member+ (R.tail [1..5])+ [[ 2, 3, 4, 5],+ [1, 3, 4, 5],+ [1, 2, 4, 5],+ [1, 2, 3, 5],+ [1, 2, 3, 4 ]])++assert "f.rands"+ (all (\x -> x >= 1.0 && x <= 2.0) (take 10 (f.rands 1.0 2.0)))++assert "f.pureRand"+ (let x := f.pureRand 1.0 2.0 in x >= 1.0 && x <= 2.0)
+ test/lib/core/shell.egi view
@@ -0,0 +1,14 @@+load "lib/core/shell.egi"++assertEqual "TSV.parseLine" (TSV.parseLine [[2]] [] "1\t2\t3") (1, "2", "3")+assertEqual "TSV.parseLine" (TSV.parseLine [[2,2]] [] "1\t2\t3") (1, "2", 3)+assertEqual "TSV.parseLine" (TSV.parseLine [[2,1]] [] "1\t2\t3") (1, "2", "3")++assertEqual "TSV.parseLine" (TSV.parseLine [] [[2]] "1\t2\t3") (1, [2, 3])+assertEqual "TSV.parseLine" (TSV.parseLine [] [[2,2]] "1\t2\t3") (1, [2], 3)+assertEqual "TSV.parseLine" (TSV.parseLine [] [[2,1]] "1\t2\t3") (1, [2, 3])++-- TODO: Is this intended behavior?+assertEqual "TSV.parseLine"+ (TSV.parseLine [[3,4], [6,9]] [[2,3], [5,7]] "1\t2\t3\t4\t5\t6\t7\t8\t9\t10")+ (1, [2, "3"], "4", 5, ["6", "7", "8"], "9", 10)
+ test/lib/core/sort.egi view
@@ -0,0 +1,11 @@+assertEqual "sortWithSign" (sortWithSign []) (1, [])++assertEqual "sortWithSign" (sortWithSign [[1]]) (1, [1])++assertEqual "sortWithSign" (sortWithSign [[2], [1]]) (-1, [1, 2])+assertEqual "sortWithSign" (sortWithSign [[1], [2]]) (1, [1, 2])+assertEqual "sortWithSign" (sortWithSign [[2, 3], [2, 1]]) (-1, [2, 1, 2, 3])++assertEqual "sortWithSign" (sortWithSign [[1], [3], [2]]) (-1, [1, 2, 3])+assertEqual "sortWithSign" (sortWithSign [[3], [1], [2]]) (1, [1, 2, 3])+assertEqual "sortWithSign" (sortWithSign [[3, 6], [1, 2], [2, 4]]) (1, [1, 2, 2, 4, 3, 6])
test/lib/math/tensor.egi view
@@ -51,7 +51,7 @@ assertEqual "append indices with ..."- (let A := generateTensor 2#1 [2, 2]+ (let A := generateTensor (\_ -> 1) [2, 2] f %B := B..._j in f A_i) [|[|1, 1|], [|1, 1|]|]_i_j@@ -59,15 +59,9 @@ assertEqual "generate_tensor by using function expr" (let g_i_j := (generateTensor- (\n m -> if n = m then function (x, y, z) else 0)+ (\match as list integer with+ | [$n, #n] -> function (x, y, z)+ | _ -> 0) [3, 3])_i_j in show (withSymbols [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 |] |]"--assertEqual- "define tensor having value of function expr"- (let h_i_j := [|[|function (x, y, z), 0, 0|]- , [|0, function (x, y, z), 0|]- , [|0, 0, function (x, y, z)|]|]_i_j- in show (withSymbols [i, j] d/d h_i_j x))- "[| [| h_1_1|x, 0, 0 |], [| 0, h_2_2|x, 0 |], [| 0, 0, h_3_3|x |] |]"