egison 3.2.12 → 3.2.13
raw patch · 4 files changed
+85/−8 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- egison.cabal +1/−1
- hs-src/Interpreter/egisoni.hs +72/−1
- hs-src/Language/Egison/Parser.hs +5/−1
- hs-src/Language/Egison/Primitives.hs +7/−5
egison.cabal view
@@ -1,5 +1,5 @@ Name: egison-Version: 3.2.12+Version: 3.2.13 Synopsis: Programming language with non-linear pattern-matching against unfree data types Description: An interpreter for Egison, the programming langugage that realized non-linear pattern-matching with unfree data types. With Egison, you can represent pattern-matching with unfree data types intuitively,
hs-src/Interpreter/egisoni.hs view
@@ -10,6 +10,7 @@ import Control.Applicative ((<$>), (<*>)) import Control.Monad.Error +import Data.List import Data.Sequence (Seq, ViewL(..), ViewR(..), (><)) import qualified Data.Sequence as Sq @@ -127,7 +128,7 @@ where settings :: MonadIO m => FilePath -> Settings m settings home = do- setComplete noCompletion $ defaultSettings { historyFile = Just (home </> ".egison_history") }+ setComplete completeParen $ defaultSettings { historyFile = Just (home </> ".egison_history") } loop :: Env -> String -> String -> InputT IO () loop env prompt' rest = do@@ -164,3 +165,73 @@ loop env prompt "" Right env' -> loop env' prompt ""++completeParen :: Monad m => CompletionFunc m+completeParen arg@((')':_), _) = completeParen' arg+completeParen arg@(('>':_), _) = completeParen' arg+completeParen arg@((']':_), _) = completeParen' arg+completeParen arg@(('}':_), _) = completeParen' arg+completeParen arg@(('(':_), _) = (completeWord Nothing " \t<>[]{}$," completeAfterOpenParen) arg+completeParen arg@(('<':_), _) = (completeWord Nothing " \t()[]{}$," completeAfterOpenCons) arg+completeParen arg@((' ':_), _) = (completeWord Nothing "" completeNothing) arg+completeParen arg@([], _) = (completeWord Nothing "" completeNothing) arg+completeParen arg@(_, _) = (completeWord Nothing " \t[]{}$," completeEgisonKeyword) arg++completeAfterOpenParen :: Monad m => String -> m [Completion]+completeAfterOpenParen str = return $ map (\kwd -> Completion kwd kwd False) $ filter (isPrefixOf str) egisonKeywordsAfterOpenParen++completeAfterOpenCons :: Monad m => String -> m [Completion]+completeAfterOpenCons str = return $ map (\kwd -> Completion kwd kwd False) $ filter (isPrefixOf str) egisonKeywordsAfterOpenCons++completeNothing :: Monad m => String -> m [Completion]+completeNothing _ = return []++completeEgisonKeyword :: Monad m => String -> m [Completion]+completeEgisonKeyword str = return $ map (\kwd -> Completion kwd kwd False) $ filter (isPrefixOf str) egisonKeywords++egisonKeywordsAfterOpenParen = map ((:) '(') $ ["define", "let", "letrec", "do", "lambda", "match-lambda", "match", "match-all", "pattern-function", "matcher", "algebraic-data-matcher", "if", "loop", "io"]+ ++ ["id", "or", "and", "not", "char", "eq?/m", "compose", "compose3", "list", "map", "between", "repeat1", "repeat", "filter", "separate", "concat", "foldr", "foldl", "map2", "zip", "empty?", "member?", "member?/m", "include?", "include?/m", "any", "all", "length", "count", "count/m", "car", "cdr", "rac", "rdc", "nth", "take", "drop", "while", "reverse", "multiset", "add", "add/m", "delete-first", "delete-first/m", "delete", "delete/m", "difference", "difference/m", "union", "union/m", "intersect", "intersect/m", "set", "unique", "unique/m", "simple-select", "print", "print-to-port", "each", "pure-rand", "fib", "fact", "divisor?", "gcd", "primes", "find-factor", "prime-factorization", "p-f", "pfs", "pfs-n", "min", "max", "min-and-max", "power", "mod", "float", "ordering", "qsort", "intersperse", "intercalate", "split", "split/m"]+egisonKeywordsAfterOpenCons = map ((:) '<') ["nil", "cons", "join", "snoc", "nioj"]+egisonKeywordsInNeutral = ["something"]+ ++ ["bool", "string", "integer", "nat", "nats", "nats0"]+egisonKeywords = egisonKeywordsAfterOpenParen ++ egisonKeywordsAfterOpenCons ++ egisonKeywordsInNeutral++completeParen' :: Monad m => CompletionFunc m+completeParen' (lstr, _) = case (closeParen lstr) of+ Nothing -> return (lstr, [])+ Just paren -> return (lstr, [(Completion paren paren False)])++closeParen :: String -> Maybe String+closeParen str = closeParen' 0 $ removeCharAndStringLiteral str++removeCharAndStringLiteral :: String -> String+removeCharAndStringLiteral [] = []+removeCharAndStringLiteral ('"':'\\':str) = '"':'\\':(removeCharAndStringLiteral str)+removeCharAndStringLiteral ('"':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral ('\'':'\\':str) = '\'':'\\':(removeCharAndStringLiteral str)+removeCharAndStringLiteral ('\'':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral (c:str) = c:(removeCharAndStringLiteral str)++removeCharAndStringLiteral' :: String -> String+removeCharAndStringLiteral' [] = []+removeCharAndStringLiteral' ('"':'\\':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral' ('"':str) = removeCharAndStringLiteral str+removeCharAndStringLiteral' ('\'':'\\':str) = removeCharAndStringLiteral' str+removeCharAndStringLiteral' ('\'':str) = removeCharAndStringLiteral str+removeCharAndStringLiteral' (_:str) = removeCharAndStringLiteral' str++closeParen' :: Integer -> String -> Maybe String+closeParen' _ [] = Nothing+closeParen' 0 ('(':_) = Just ")"+closeParen' 0 ('<':_) = Just ">"+closeParen' 0 ('[':_) = Just "]"+closeParen' 0 ('{':_) = Just "}"+closeParen' n ('(':str) = closeParen' (n - 1) str+closeParen' n ('<':str) = closeParen' (n - 1) str+closeParen' n ('[':str) = closeParen' (n - 1) str+closeParen' n ('{':str) = closeParen' (n - 1) str+closeParen' n (')':str) = closeParen' (n + 1) str+closeParen' n ('>':str) = closeParen' (n + 1) str+closeParen' n (']':str) = closeParen' (n + 1) str+closeParen' n ('}':str) = closeParen' (n + 1) str+closeParen' n (_:str) = closeParen' n str
hs-src/Language/Egison/Parser.hs view
@@ -60,12 +60,16 @@ doesExist <- liftIO $ doesFileExist file unless doesExist $ throwError $ strMsg ("file does not exist: " ++ file) input <- liftIO $ readFile file- exprs <- readTopExprs input+ exprs <- readTopExprs $ shebang input concat <$> mapM recursiveLoad exprs where recursiveLoad (Load file) = loadLibraryFile file recursiveLoad (LoadFile file) = loadFile file recursiveLoad expr = return [expr]+ shebang :: String -> String+ shebang ('#':'!':cs) = ';':'#':'!':cs+ shebang cs = cs+ loadLibraryFile :: FilePath -> EgisonM [EgisonTopExpr] loadLibraryFile file = liftIO (getDataFileName file) >>= loadFile
hs-src/Language/Egison/Primitives.hs view
@@ -420,21 +420,23 @@ , ("write-char", writeChar) , ("write-string", writeString) , ("write", writeToStdout)- , ("eof?", isEOFStdin)- , ("flush", flushStdout) , ("read-char-from-port", readCharFromPort) , ("read-line-from-port", readLineFromPort) -- , ("read-from-port", readFromPort) , ("write-char-to-port", writeCharToPort) , ("write-string-to-port", writeStringToPort) , ("write-to-port", writeToPort)+ + , ("eof?", isEOFStdin)+ , ("flush", flushStdout) , ("eof-port?", isEOFPort) , ("flush-port", flushPort)- , ("read-file", readFile') - , ("rand", randRange) ]--- , ("get-lib-dir-name", getLibDirName) ]+ , ("rand", randRange)+ +-- , ("get-lib-dir-name", getLibDirName)+ ] makeIO :: EgisonM EgisonValue -> EgisonValue makeIO m = IOFunc $ liftM (Value . Tuple . (World :) . (:[])) m