packages feed

egison 3.3.12 → 3.3.13

raw patch · 12 files changed

+181/−31 lines, 12 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Language.Egison.Types: ArrayBoundsExpr :: EgisonExpr -> EgisonExpr
+ Language.Egison.Types: ArraySizeExpr :: EgisonExpr -> EgisonExpr

Files

egison.cabal view
@@ -1,5 +1,5 @@ Name:                egison-Version:             3.3.12+Version:             3.3.13 Synopsis:            Programming language with non-linear pattern-matching against unfree data Description:   An interpreter for Egison, the programming langugage that realized non-linear pattern-matching against unfree data types.@@ -32,7 +32,7 @@  Extra-Source-Files:  benchmark/Benchmark.hs -Data-files:          lib/core/base.egi lib/core/collection.egi lib/core/order.egi lib/core/number.egi lib/core/math.egi lib/core/database.egi lib/core/io.egi lib/string/string.egi +Data-files:          lib/core/base.egi lib/core/collection.egi lib/core/order.egi lib/core/number.egi lib/core/math.egi lib/core/database.egi lib/core/io.egi lib/string/string.egi lib/string/japanese.egi                      lib/tree/xml.egi lib/math/prime.egi lib/math/euler.egi                      sample/*.egi sample/io/*.egi sample/io/*.egi                      elisp/egison-mode.el
hs-src/Language/Egison/Core.hs view
@@ -1,4 +1,4 @@-{-# Language TupleSections #-}+{-# Language TupleSections, ViewPatterns #-}  {- | Module      : Language.Egison.Core@@ -314,13 +314,13 @@ evalExpr env (GenerateArrayExpr names size expr) =    evalExpr env (GenerateArrayExpr names (TupleExpr [size]) expr) -evalExpr env (ArrayBoundsExpr expr) = -  evalExpr env expr >>= arrayBounds+evalExpr env (ArraySizeExpr expr) = +  evalExpr env expr >>= arraySize   where-    arrayBounds :: WHNFData -> EgisonM WHNFData-    arrayBounds (Intermediate (IArray arr)) = return . Value . toEgison $ Array.bounds arr-    arrayBounds (Value (Array arr))         = return . Value . toEgison $ Array.bounds arr-    arrayBounds val                          = throwError $ TypeMismatch "array" val+    arraySize :: WHNFData -> EgisonM WHNFData+    arraySize (Intermediate (IArray arr)) = return . Value . toEgison $ snd $ Array.bounds arr+    arraySize (Value (Array arr))         = return . Value . toEgison $ snd $ Array.bounds arr+    arraySize val                          = throwError $ TypeMismatch "array" val  evalExpr _ SomethingExpr = return $ Value Something evalExpr _ UndefinedExpr = return $ Value Undefined@@ -488,12 +488,20 @@     DFSMode -> processMStatesDFS stream     BFSMode -> processMStatesBFS stream +gatherBindings :: MatchingState -> Maybe [Binding]+gatherBindings (MState _ _ bindings []) = return bindings+gatherBindings (MState _ _ bindings trees) = isResolved trees >> return bindings+  where isResolved :: [MatchingTree] -> Maybe ()+        isResolved [] = return ()+        isResolved (MAtom _ _ _ : _) = Nothing+        isResolved (MNode _ state : rest) = gatherBindings state >> isResolved rest+ extractMatches :: [MList EgisonM MatchingState] -> EgisonM ([Match], [MList EgisonM MatchingState]) extractMatches = extractMatches' ([], [])  where   extractMatches' :: ([Match], [MList EgisonM MatchingState]) -> [MList EgisonM MatchingState] -> EgisonM ([Match], [MList EgisonM MatchingState])   extractMatches' (xs, ys) [] = return (xs, ys)-  extractMatches' (xs, ys) ((MCons (MState _ _ bindings []) states):rest) = do+  extractMatches' (xs, ys) ((MCons (gatherBindings -> Just bindings) states):rest) = do     states' <- states     extractMatches' (xs ++ [bindings], ys ++ [states']) rest   extractMatches' (xs, ys) (stream:rest) = extractMatches' (xs, ys ++ [stream]) rest
hs-src/Language/Egison/Desugar.hs view
@@ -137,9 +137,9 @@ desugar (IndexedExpr expr indices) =    IndexedExpr <$> desugar expr <*> (mapM desugar indices) -desugar (ArrayBoundsExpr expr) = do+desugar (ArraySizeExpr expr) = do   expr' <- desugar expr-  return $ ArrayBoundsExpr expr'+  return $ ArraySizeExpr expr'  desugar (InductiveDataExpr name exprs) = do    exprs' <- mapM desugar exprs
hs-src/Language/Egison/Parser.hs view
@@ -323,7 +323,9 @@ statements = braces $ sepEndBy statement whiteSpace  statement :: Parser BindingExpr-statement = try binding <|> brackets (([],) <$> expr)+statement = try binding+        <|> try (brackets (([],) <$> expr))+        <|> (([],) <$> expr)  bindings :: Parser [BindingExpr] bindings = braces $ sepEndBy binding whiteSpace@@ -386,7 +388,7 @@ generateArrayExpr = keywordGenerateArray >> GenerateArrayExpr <$> varNames <*> expr <*> expr  arraySizeExpr :: Parser EgisonExpr-arraySizeExpr = keywordArrayBounds >> ArrayBoundsExpr <$> expr+arraySizeExpr = keywordArraySize >> ArraySizeExpr <$> expr  arrayRefExpr :: Parser EgisonExpr arrayRefExpr = keywordArrayRef >> ArrayRefExpr <$> expr <*> expr@@ -551,7 +553,7 @@   , "io"   , "algebraic-data-matcher"   , "generate-array"-  , "array-bounds"+  , "array-size"   , "array-ref"   , "something"   , "undefined"]@@ -608,7 +610,7 @@ keywordUndefined            = reserved "undefined" keywordAlgebraicDataMatcher = reserved "algebraic-data-matcher" keywordGenerateArray        = reserved "generate-array"-keywordArrayBounds          = reserved "array-bounds"+keywordArraySize            = reserved "array-size" keywordArrayRef             = reserved "array-ref"  sign :: Num a => Parser (a -> a)
hs-src/Language/Egison/Types.hs view
@@ -163,7 +163,7 @@    | AlgebraicDataMatcherExpr [(String, [EgisonExpr])]   | GenerateArrayExpr [String] EgisonExpr EgisonExpr-  | ArrayBoundsExpr EgisonExpr+  | ArraySizeExpr EgisonExpr   | ArrayRefExpr EgisonExpr EgisonExpr    | SomethingExpr
+ lib/string/japanese.egi view
@@ -0,0 +1,71 @@+(define $katakana-to-yomi+  (lambda [$s]+    (match s string+      {[<cons $c <cons ,'ャ' $rs>>+        (append (katakana-to-yomi1 {c 'ャ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ュ' $rs>>+        (append (katakana-to-yomi1 {c 'ュ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ョ' $rs>>+        (append (katakana-to-yomi1 {c 'ョ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ァ' $rs>>+        (append (katakana-to-yomi1 {c 'ァ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ィ' $rs>>+        (append (katakana-to-yomi1 {c 'ィ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ゥ' $rs>>+        (append (katakana-to-yomi1 {c 'ゥ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ェ' $rs>>+        (append (katakana-to-yomi1 {c 'ェ'}) (katakana-to-yomi rs))]+       [<cons $c <cons ,'ォ' $rs>>+        (append (katakana-to-yomi1 {c 'ォ'}) (katakana-to-yomi rs))]+       [<cons ,'ー' $rs>+        (katakana-to-yomi rs)]+       [<cons ,'ッ' $rs>+        (katakana-to-yomi rs)]+       [<cons $c $rs>+        (append (katakana-to-yomi1 {c}) (katakana-to-yomi rs))]+       [<nil> {}]+       })))++(define $katakana-to-yomi1+  (lambda [$cs]+    (match cs (list char)+      {[,{'ア'} {"A"}] [,{'イ'} {"I"}] [,{'ウ'} {"U"}] [,{'エ'} {"E"}] [,{'オ'} {"O"}]+       [,{'カ'} {"K" "A"}] [,{'キ'} {"K" "I"}] [,{'ク'} {"K" "U"}] [,{'ケ'} {"K" "E"}] [,{'コ'} {"K" "O"}]+       [,{'サ'} {"S" "A"}] [,{'シ'} {"SH" "I"}] [,{'ス'} {"S" "U"}] [,{'セ'} {"S" "E"}] [,{'ソ'} {"S" "O"}]+       [,{'タ'} {"T" "A"}] [,{'チ'} {"CH" "I"}] [,{'ツ'} {"T" "U"}] [,{'テ'} {"T" "E"}] [,{'ト'} {"T" "O"}]+       [,{'ナ'} {"N" "A"}] [,{'ニ'} {"N" "I"}] [,{'ヌ'} {"N" "U"}] [,{'ネ'} {"N" "E"}] [,{'ノ'} {"N" "O"}]+       [,{'ハ'} {"H" "A"}] [,{'ヒ'} {"H" "I"}] [,{'フ'} {"F" "U"}] [,{'ヘ'} {"H" "E"}] [,{'ホ'} {"H" "O"}]+       [,{'マ'} {"M" "A"}] [,{'ミ'} {"M" "I"}] [,{'ム'} {"M" "U"}] [,{'メ'} {"M" "E"}] [,{'モ'} {"M" "O"}]+       [,{'ヤ'} {"Y" "A"}] [,{'ユ'} {"Y" "U"}] [,{'ヨ'} {"Y" "O"}]+       [,{'ラ'} {"R" "A"}] [,{'リ'} {"R" "I"}] [,{'ル'} {"R" "U"}] [,{'レ'} {"R" "E"}] [,{'ロ'} {"R" "O"}]+       [,{'ワ'} {"W" "A"}] [,{'ヲ'} {"O"}] [,{'ン'} {"N"}]+       [,{'ガ'} {"G" "A"}] [,{'ギ'} {"G" "I"}] [,{'グ'} {"G" "U"}] [,{'ゲ'} {"G" "E"}] [,{'ゴ'} {"G" "O"}]+       [,{'ザ'} {"Z" "A"}] [,{'ジ'} {"J" "I"}] [,{'ズ'} {"Z" "U"}] [,{'ゼ'} {"Z" "E"}] [,{'ゾ'} {"Z" "O"}]+       [,{'ダ'} {"D" "A"}] [,{'ヂ'} {"D" "I"}] [,{'ヅ'} {"D" "U"}] [,{'デ'} {"D" "E"}] [,{'ド'} {"D" "O"}]+       [,{'バ'} {"B" "A"}] [,{'ビ'} {"B" "I"}] [,{'ブ'} {"B" "U"}] [,{'ベ'} {"B" "E"}] [,{'ボ'} {"B" "O"}]+       [,{'パ'} {"P" "A"}] [,{'ピ'} {"P" "I"}] [,{'プ'} {"P" "U"}] [,{'ペ'} {"P" "E"}] [,{'ポ'} {"P" "O"}]+       [,{'キ' 'ャ'} {"K" "AE"}] [,{'キ' 'ュ'} {"K" "YU"}] [,{'キ' 'ョ'} {"K" "YO"}]+       [,{'ギ' 'ャ'} {"G" "AE"}] [,{'ギ' 'ュ'} {"G" "YU"}] [,{'ギ' 'ョ'} {"G" "YO"}]+       [,{'シ' 'ャ'} {"SH" "AE"}] [,{'シ' 'ュ'} {"SH" "U"}] [,{'シ' 'ョ'} {"SH" "O"}]+       [,{'ジ' 'ャ'} {"J" "A"}] [,{'ジ' 'ュ'} {"J" "U"}] [,{'ジ' 'ョ'} {"J" "O"}]+       [,{'チ' 'ャ'} {"CH" "AE"}] [,{'チ' 'ュ'} {"CH" "U"}] [,{'チ' 'ョ'} {"CH" "O"}]+       [,{'ニ' 'ャ'} {"N" "AE"}] [,{'ニ' 'ュ'} {"N" "U"}] [,{'ニ' 'ョ'} {"N" "O"}]+       [,{'ヒ' 'ャ'} {"H" "AE"}] [,{'ヒ' 'ュ'} {"H" "YU"}] [,{'ヒ' 'ョ'} {"H" "YO"}]+       [,{'ビ' 'ャ'} {"B" "AE"}] [,{'ビ' 'ュ'} {"B" "YU"}] [,{'ビ' 'ョ'} {"B" "YO"}]+       [,{'ピ' 'ャ'} {"P" "AE"}] [,{'ピ' 'ュ'} {"P" "YU"}] [,{'ピ' 'ョ'} {"P" "YO"}]+       [,{'ミ' 'ャ'} {"M" "AE"}] [,{'ミ' 'ュ'} {"M" "YU"}] [,{'ミ' 'ョ'} {"M" "YO"}]+       [,{'リ' 'ャ'} {"R" "AE"}] [,{'リ' 'ュ'} {"R" "YU"}] [,{'リ' 'ョ'} {"R" "YO"}]+       [,{'ウ' 'ィ'} {"WI"}] [,{'ウ' 'ェ'} {"WE"}] [,{'ウ' 'ォ'} {"WO"}]+       [,{'キ' 'ィ'} {"K" "I"}]+       [,{'ク' 'ィ'} {"K" "WI"}] [,{'ク' 'ェ'} {"K" "WE"}] [,{'ク' 'ォ'} {"K" "WO"}]+       [,{'シ' 'ィ'} {"S" "I"}] [,{'シ' 'ェ'} {"SH" "E"}]+       [,{'ジ' 'ェ'} {"J" "E"}]+       [,{'チ' 'ェ'} {"CH" "E"}]+       [,{'フ' 'ァ'} {"F" "A"}] [,{'フ' 'ィ'} {"F" "I"}] [,{'フ' 'ェ'} {"F" "E"}] [,{'フ' 'ォ'} {"F" "O"}]+       [,{'ヴ' 'ァ'} {"V" "A"}] [,{'ヴ' 'ィ'} {"V" "I"}] [,{'ヴ' 'ェ'} {"V" "E"}] [,{'ヴ' 'ォ'} {"V" "O"}]+       [,{'シ' 'ィ'} {"S" "I"}] [,{'ス' 'ィ'} {"S" "I"}] [,{'ズ' 'ィ'} {"Z" "I"}]+       [,{'テ' 'ィ'} {"T" "I"}] [,{'デ' 'ィ'} {"D" "I"}] [,{'デ' 'ュ'} {"D" "YU"}]+       [,{'ツ' 'ゥ'} {"T" "U"}] [,{'ト' 'ゥ'} {"T" "U"}] [,{'ヅ' 'ゥ'} {"D" "U"}] [,{'ド' 'ゥ'} {"D" "U"}] [,{'フ' 'ュ'} {"F" "YU"}]+       [,{'ァ'} {"A"}] [,{'ィ'} {"I"}] [,{'ゥ'} {"U"}] [,{'ェ'} {"E"}] [,{'ォ'} {"O"}]+       [<cons $c <cons _>> (katakana-to-yomi1 {c})]+       })))
lib/string/string.egi view
@@ -45,6 +45,10 @@ ;;; String as Collection ;;; +(define $S.map+  (lambda [$f $xs]+    (pack (map f (unpack xs)))))+ (define $S.length   (lambda [$xs]     (length-string xs)))@@ -64,3 +68,59 @@            xss)))  (define $S.intercalate (compose intersperse S.concat))++(define $katakana?+  (match-lambda char+    {[,'ア' #t] [,'イ' #t] [,'ウ' #t] [,'エ' #t] [,'オ' #t]+     [,'カ' #t] [,'キ' #t] [,'ク' #t] [,'ケ' #t] [,'コ' #t]+     [,'サ' #t] [,'シ' #t] [,'ス' #t] [,'セ' #t] [,'ソ' #t]+     [,'タ' #t] [,'チ' #t] [,'ツ' #t] [,'テ' #t] [,'ト' #t]+     [,'ナ' #t] [,'ニ' #t] [,'ヌ' #t] [,'ネ' #t] [,'ノ' #t]+     [,'ハ' #t] [,'ヒ' #t] [,'フ' #t] [,'ヘ' #t] [,'ホ' #t]+     [,'マ' #t] [,'ミ' #t] [,'ム' #t] [,'メ' #t] [,'モ' #t]+     [,'ヤ' #t] [,'ユ' #t] [,'ヨ' #t]+     [,'ラ' #t] [,'リ' #t] [,'ル' #t] [,'レ' #t] [,'ロ' #t]+     [,'ワ' #t] [,'ヲ' #t] [,'ン' #t]+     [,'ガ' #t] [,'ギ' #t] [,'グ' #t] [,'ゲ' #t] [,'ゴ' #t]+     [,'ザ' #t] [,'ジ' #t] [,'ズ' #t] [,'ゼ' #t] [,'ゾ' #t]+     [,'ダ' #t] [,'ヂ' #t] [,'ヅ' #t] [,'デ' #t] [,'ド' #t]+     [,'バ' #t] [,'ビ' #t] [,'ブ' #t] [,'ベ' #t] [,'ボ' #t]+     [,'パ' #t] [,'ピ' #t] [,'プ' #t] [,'ペ' #t] [,'ポ' #t]+     [,'ァ' #t] [,'ィ' #t] [,'ゥ' #t] [,'ェ' #t] [,'ォ' #t]+     [,'ャ' #t] [,'ュ' #t] [,'ョ' #t]+     [,'ッ' #t] [,'ー' #t]+     [_ #f]}))++(define $katakanas?+  (lambda [$s]+    (all katakana? (unpack s))))++(define $alphabet?+  (match-lambda char+    {[,'a' #t] [,'b' #t] [,'c' #t] [,'d' #t] [,'e' #t]+     [,'f' #t] [,'g' #t] [,'h' #t] [,'i' #t] [,'j' #t]+     [,'k' #t] [,'l' #t] [,'m' #t] [,'n' #t] [,'o' #t]+     [,'p' #t] [,'q' #t] [,'r' #t] [,'s' #t] [,'t' #t]+     [,'u' #t] [,'v' #t] [,'w' #t] [,'x' #t] [,'y' #t]+     [,'z' #t]+     [,'A' #t] [,'B' #t] [,'C' #t] [,'D' #t] [,'E' #t]+     [,'F' #t] [,'G' #t] [,'H' #t] [,'I' #t] [,'J' #t]+     [,'K' #t] [,'L' #t] [,'M' #t] [,'N' #t] [,'O' #t]+     [,'P' #t] [,'Q' #t] [,'R' #t] [,'S' #t] [,'T' #t]+     [,'U' #t] [,'V' #t] [,'W' #t] [,'X' #t] [,'Y' #t]+     [,'Z' #t]+     [_ #f]}))++(define $alphabets?+  (lambda [$s]+    (all alphabet? (unpack s))))++(define $upper-case+  (match-lambda char+    {[,'a' 'A'] [,'b' 'B'] [,'c' 'C'] [,'d' 'D'] [,'e' 'E']+     [,'f' 'F'] [,'g' 'G'] [,'h' 'H'] [,'i' 'I'] [,'j' 'J']+     [,'k' 'K'] [,'l' 'L'] [,'m' 'M'] [,'n' 'N'] [,'o' 'O']+     [,'p' 'P'] [,'q' 'Q'] [,'r' 'R'] [,'s' 'S'] [,'t' 'T']+     [,'u' 'U'] [,'v' 'V'] [,'w' 'W'] [,'x' 'X'] [,'y' 'Y']+     [,'z' 'Z']+     [$c c]}))
+ sample/demo1-ja.egi view
@@ -0,0 +1,9 @@+;; 素数の無限リストから全ての双子素数をパターンマッチにより抽出+(define $twin-primes+  (match-all primes (list integer)+    [<join _ <cons $p <cons ,(+ p 2) _>>>+     [p (+ p 2)]]))++;; 最初の10個の双子素数を列挙+(take 10 twin-primes)+;=>{[3 5] [5 7] [11 13] [17 19] [29 31] [41 43] [59 61] [71 73] [101 103] [107 109]}
sample/io/cut.egi view
@@ -6,6 +6,6 @@ (define $cut   (lambda [$file $nums]     (do {[$port (open-input-file file)]-         [(each-line-from-port port (lambda [$line] (let {[$fs (S.split "," line)]}-                                                      (print (S.intercalate "," (map (nth $ fs) nums))))))]-         [(close-input-port port)]})))+         (each-line-from-port port (lambda [$line] (let {[$fs (S.split "," line)]}+                                                     (print (S.intercalate "," (map (nth $ fs) nums))))))+         (close-input-port port)})))
sample/io/dice.egi view
@@ -1,5 +1,5 @@ (define $main   (lambda [$argv]     (do {[$v (rand 1 6)]-         [(write (show v))]-         [(write-char '\n')]})))+         (write (show v))+         (write-char '\n')})))
sample/mahjong.egi view
@@ -15,12 +15,12 @@   (algebraic-data-matcher     {<ton> <nan> <sha> <pe> <haku> <hatsu> <chun>})) -(define $hai+(define $tile   (algebraic-data-matcher-    {<num suit integer> <ji honor>}))+    {<num suit integer> <hnr honor>}))  ;;-;; Pattern modularizations+;; Pattern modularization ;; (define $twin   (pattern-function [$pat1 $pat2]@@ -43,10 +43,10 @@        pat2>>>))  ;;-;; A function that determins whether the hand is finished or not.+;; A function that determines whether the hand is completed or not. ;;-(define $agari?-  (match-lambda (multiset hai)+(define $complete?+  (match-lambda (multiset tile)     {[(twin $th_1        (| (shuntsu $sh_1 (| (shuntsu $sh_2 (| (shuntsu $sh_3 (| (shuntsu $sh_4 <nil>)                                                                 (kohtsu $kh_1 <nil>)))@@ -60,13 +60,13 @@ ;; ;; Demonstration code ;;-(test (agari? {<Ji <Haku>> <Ji <Haku>>+(test (complete? {<Hnr <Haku>> <Hnr <Haku>>                <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>                <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>                <Num <Pin> 2> <Num <Pin> 3> <Num <Pin> 4>                <Num <Sou> 6> <Num <Sou> 6> <Num <Sou> 6>})) -(test (agari? {<Ji <Haku>> <Ji <Haku>>+(test (complete? {<Hnr <Haku>> <Hnr <Haku>>                <Num <Pin> 1> <Num <Pin> 3> <Num <Pin> 4>                <Num <Wan> 6> <Num <Wan> 7> <Num <Wan> 8>                <Num <Wan> 3> <Num <Wan> 4> <Num <Wan> 5>
sample/poker-hands.egi view
@@ -16,7 +16,7 @@     {<card suit (mod 13)>}))  ;;-;; A function that determins poker-hands+;; A function that determines poker-hands ;; (define $poker-hands   (lambda [$cs]