egison 2.4.2 → 2.4.3
raw patch · 6 files changed
+43/−25 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.Egison.Types: MacroVarExpr :: String -> [EgisonExpr] -> EgisonExpr
+ Language.Egison.Types: MacroVarExpr :: String -> EgisonExpr
- Language.Egison.Types: PatVarOmitExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.Types: PatVarOmitExpr :: String -> [EgisonExpr] -> EgisonExpr
- Language.Egison.Types: VarOmitExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.Types: VarOmitExpr :: String -> [EgisonExpr] -> EgisonExpr
Files
- egison.cabal +3/−2
- hs-src/Language/Egison/Core.hs +1/−1
- hs-src/Language/Egison/Macro.hs +11/−10
- hs-src/Language/Egison/Parser.hs +7/−6
- hs-src/Language/Egison/Types.hs +6/−6
- lib/core/pattern.egi +15/−0
egison.cabal view
@@ -1,5 +1,5 @@ Name: egison-Version: 2.4.2+Version: 2.4.3 Synopsis: An Interpreter and Compiler for the Programming Language Egison Description: An interpreter and compiler for the programming language Egison. A feature of Egison is the strong pattern match facility.@@ -16,7 +16,8 @@ Build-type: Simple Cabal-version: >=1.8 -Data-files: lib/core/base.egi lib/core/number.egi lib/core/collection.egi lib/core/array.egi lib/graph.egi lib/poker-hands.egi+Data-files: lib/core/base.egi lib/core/number.egi lib/core/collection.egi lib/core/array.egi lib/core/pattern.egi+ lib/graph.egi lib/poker-hands.egi sample/number-test.egi sample/collection-test.egi sample/array-test.egi sample/graph-test.egi sample/poker-hands-test.egi sample/io/argv-test.egi sample/io/cat.egi sample/io/copy.egi sample/io/char-test.egi sample/io/hello.egi sample/io/read-write-test.egi
hs-src/Language/Egison/Core.hs view
@@ -40,6 +40,7 @@ _ <- evalString env $ "(load \"lib/core/number.egi\")" _ <- evalString env $ "(load \"lib/core/collection.egi\")" _ <- evalString env $ "(load \"lib/core/array.egi\")"+ _ <- evalString env $ "(load \"lib/core/pattern.egi\")" return () @@ -317,7 +318,6 @@ cEval1 (Closure newEnv body) Value (Macro mArgs body) -> do argExprs <- liftThrows $ tupleExprToExprList argExpr newBody <- expandMacro (Data.Map.fromList (zip mArgs argExprs)) body- liftIO $ putStrLn $ showExpr newBody cEval1 (Closure env newBody) _ -> throwError $ Default "not function" cEval1 (Closure _ UndefinedExpr) = do
hs-src/Language/Egison/Macro.hs view
@@ -1,5 +1,6 @@ module Language.Egison.Macro where import Language.Egison.Types+import Control.Monad.Error import qualified Data.Map type MacroFrame = Data.Map.Map String EgisonExpr@@ -12,16 +13,16 @@ case getExpr frame name of Nothing -> return $ VarExpr name [] Just expr -> return expr-expandMacro frame (PatVarOmitExpr expr) = do- newExpr <- expandMacro frame expr- case newExpr of- MacroVarExpr name numExprs -> return $ PatVarExpr name numExprs- _ -> return $ PatVarOmitExpr newExpr-expandMacro frame (VarOmitExpr expr) = do- newExpr <- expandMacro frame expr- case newExpr of- MacroVarExpr name numExprs -> return $ VarExpr name numExprs- _ -> return $ VarOmitExpr newExpr+expandMacro frame (PatVarOmitExpr name nums) = do+ case getExpr frame name of+ Nothing -> throwError $ Default $ "no macro var: " ++ name+ Just (MacroVarExpr name2) -> return $ PatVarExpr name2 nums+ expr -> throwError $ Default $ "not macro var: " ++ show expr+expandMacro frame (VarOmitExpr name nums) = do+ case getExpr frame name of+ Nothing -> throwError $ Default $ "no macro var: " ++ name+ Just (MacroVarExpr name2) -> return $ VarExpr name2 nums+ expr -> throwError $ Default $ "not macro var: " ++ show expr expandMacro frame (InductiveDataExpr cons exprs) = do newExprs <- mapM (expandMacro frame) exprs return $ InductiveDataExpr cons newExprs
hs-src/Language/Egison/Parser.hs view
@@ -228,20 +228,21 @@ parseMacroVarExpr = do char '%' name <- identifier- nums <- lexeme parseIndexNums- return $ MacroVarExpr name nums+ return $ MacroVarExpr name parsePatVarOmitExpr :: Parser EgisonExpr parsePatVarOmitExpr = do string "$`"- expr <- lexeme parseExpr- return $ PatVarOmitExpr expr+ name <- identifier+ nums <- lexeme parseIndexNums+ return $ PatVarOmitExpr name nums parseVarOmitExpr :: Parser EgisonExpr parseVarOmitExpr = do char '`'- expr <- lexeme parseExpr- return $ VarOmitExpr expr+ name <- identifier+ nums <- lexeme parseIndexNums+ return $ VarOmitExpr name nums parseArgs :: Parser ArgsExpr parseArgs = do
hs-src/Language/Egison/Types.hs view
@@ -84,9 +84,9 @@ | NumberExpr Integer | FloatExpr Double | VarExpr String [EgisonExpr]- | MacroVarExpr String [EgisonExpr]- | PatVarOmitExpr EgisonExpr- | VarOmitExpr EgisonExpr+ | MacroVarExpr String+ | PatVarOmitExpr String [EgisonExpr]+ | VarOmitExpr String [EgisonExpr] | PatVarExpr String [EgisonExpr] | WildCardExpr | ValuePatExpr EgisonExpr@@ -331,12 +331,12 @@ showExpr (NumberExpr contents) = show contents showExpr (FloatExpr contents) = show contents showExpr (VarExpr name nums) = name ++ unwordsNumExprs nums-showExpr (MacroVarExpr name nums) = "%" ++ name ++ unwordsNumExprs nums+showExpr (MacroVarExpr name) = "%" ++ name showExpr (PatVarExpr name nums) = "$" ++ name ++ unwordsNumExprs nums showExpr WildCardExpr = "_" showExpr (ValuePatExpr expr) = "," ++ showExpr expr-showExpr (PatVarOmitExpr pvar) = "$`" ++ showExpr pvar-showExpr (VarOmitExpr pvar) = "`" ++ showExpr pvar+showExpr (PatVarOmitExpr name nums) = "$`" ++ name ++ unwordsNumExprs nums+showExpr (VarOmitExpr name nums) = "`" ++ name ++ unwordsNumExprs nums showExpr (CutPatExpr _) = "#<cut-pat>" showExpr (NotPatExpr _) = "#<not-pat>" showExpr (AndPatExpr _) = "#<and-pat>"
+ lib/core/pattern.egi view
@@ -0,0 +1,15 @@+;;+;; Pattern.egi+;;++(define $comb+ (macro [$n $v]+ (loop $l $i (between 1 n) <join _ <cons $`v_i l>> _)))++(define $comb/double+ (macro [$n $v]+ (loop $l $i (between 1 n) <join _ (& <cons $`v_i _> l)> _)))++(define $cloop+ (macro [$n $v]+ (loop $l $i (between 1 n) {`v_i @l} {})))