egison 2.3.8 → 2.3.9
raw patch · 11 files changed
+118/−80 lines, 11 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- egison.cabal +3/−2
- elisp/egison-mode.el +3/−1
- etc/template-for-test.hs +17/−0
- etc/template.hs +2/−7
- hs-src/Compiler/egisonc.hs +62/−33
- hs-src/Interpreter/egisoni.hs +0/−18
- lib/core/number.egi +7/−4
- sample/collection-test.egi +1/−4
- sample/compile-test.egi +0/−6
- sample/n-queen.egi +1/−2
- sample/number-test.egi +22/−3
egison.cabal view
@@ -1,5 +1,5 @@ Name: egison-Version: 2.3.8+Version: 2.3.9 Synopsis: An Interpreter for the Programming Language Egison Description: An interpreter for the programming language Egison. A feature of Egison is the strong pattern match facility.@@ -18,12 +18,13 @@ 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 sample/number-test.egi sample/collection-test.egi sample/array-test.egi sample/graph-test.egi- sample/poker-hands-test.egi sample/compile-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 sample/n-queen.egi sample/icfpc2012/mine.egi sample/icfpc2012/maps/*.map elisp/egison-mode.el etc/template.hs+ etc/template-for-test.hs Library Build-Depends: base >= 4.0 && < 5, array, containers, haskeline, transformers, mtl, parsec >= 3.0, directory, ghc, ghc-paths
elisp/egison-mode.el view
@@ -87,7 +87,8 @@ (ip (keyword-indent-point op))) (if ip (+ ip cp)- (+ 2 (length op) cp))))+ (progn (forward-sexp)+ (+ 1 (current-column)))))) ((eq (string-to-char (thing-at-point 'char)) 60) (forward-char) (let ((op (current-word)))@@ -132,6 +133,7 @@ (modify-syntax-entry 62 ")" egison-mode-syntax-table) (modify-syntax-entry 59 "<" egison-mode-syntax-table) (modify-syntax-entry 10 ">" egison-mode-syntax-table)+ (modify-syntax-entry 63 "w" egison-mode-syntax-table) egison-mode-syntax-table) ;; (copy-syntax-table lisp-mode-syntax-table) "Syntax table for Egison mode")
+ etc/template-for-test.hs view
@@ -0,0 +1,17 @@+module Main where+import Language.Egison.Core+import Language.Egison.Types+import Control.Monad.Error++evalTopExprs :: Env -> [TopExpr] -> IO ()+evalTopExprs _ [] = return ()+evalTopExprs env (topExpr:rest) = do+ str <- runIOThrowsREPL $ evalTopExpr env topExpr+ putStrLn str+ evalTopExprs env rest++main :: IO ()+main = do+ env <- primitiveBindings+ evalTopExprs env topExprs+
etc/template.hs view
@@ -1,13 +1,8 @@ module Main where-import Language.Egison.Core -- Egison Interpreter-import Language.Egison.Types -- Egison data types---import Language.Egison.Variables -- Egison variable operations---import Language.Egison.Parser -- Egison variable operations---import Control.Monad (when)+import Language.Egison.Core+import Language.Egison.Types import Control.Monad.Error---import System.IO import System.Environment- main :: IO () main = do
hs-src/Compiler/egisonc.hs view
@@ -15,6 +15,9 @@ templateFile :: String templateFile = "etc/template.hs" +templateFileForTest :: String+templateFileForTest = "etc/template-for-test.hs"+ main :: IO () main = do args <- getArgs@@ -23,7 +26,7 @@ case opts of Options {optShowHelp = True} -> printHelp Options {optShowVersion = True} -> printVersionNumber- Options {optOutput = output, optProf = prof} ->+ Options {optOutput = output} -> if null nonOpts then showUsage else do@@ -31,13 +34,14 @@ outExec = case output of Just outFile -> outFile Nothing -> dropExtension inFile- process prof inFile outExec+ process opts inFile outExec data Options = Options { optShowVersion :: Bool, optShowHelp :: Bool, optOutput :: Maybe String,- optProf :: Bool+ optProf :: Bool,+ optTest :: Bool } showUsage :: IO ()@@ -49,7 +53,8 @@ optShowVersion = False, optShowHelp = False, optOutput = Nothing,- optProf = False+ optProf = False,+ optTest = False } options :: [OptDescr (Options -> Options)]@@ -66,7 +71,10 @@ "output file to write", Option ['p'] ["prof"] (NoArg (\opts -> opts {optProf = True}))- "use profiling system"+ "use profiling system",+ Option ['t'] ["test"]+ (NoArg (\opts -> opts {optTest = True}))+ "execute test expressions" ] printVersionNumber :: IO ()@@ -83,15 +91,16 @@ putStrLn " --version Display egison version information" putStrLn " --output filename Write executable to the given filename" putStrLn " --prof Make use of GHC profiling system"+ putStrLn " --test Execute test expressions" putStrLn "" exitWith ExitSuccess -process :: Bool -> String -> String -> IO ()-process prof inFile outExec = do- result <- (runIOThrows $ liftM show $ createHaskellFile inFile)+process :: Options -> String -> String -> IO ()+process opts inFile outExec = do+ result <- (runIOThrows $ liftM show $ createHaskellFile opts inFile) case result of Just errMsg -> putStrLn errMsg- _ -> compileHaskellFile prof outExec+ _ -> compileHaskellFile opts outExec appendLoadExprForCoreLibraries :: [TopExpr] -> [TopExpr] appendLoadExprForCoreLibraries topExprs = [(Load "lib/core/base.egi"),@@ -100,49 +109,69 @@ (Load "lib/core/array.egi") ] ++ topExprs -createHaskellFile :: String -> IOThrowsError ()-createHaskellFile inFile = do- templatePath <- liftIO $ getDataFileName templateFile- liftIO $ copyFile templatePath "./_tmp.hs"- egisonProgram <- liftIO $ readFile inFile- topExprs <- liftThrows $ readTopExprList egisonProgram- topExprs2 <- expandLoadExprs $ appendLoadExprForCoreLibraries topExprs- liftIO $ appendFile "./_tmp.hs" "\ntopExprs :: [TopExpr]\n"- liftIO $ appendFile "./_tmp.hs" "topExprs = "- liftIO $ appendFile "./_tmp.hs" $ show topExprs2- return ()+createHaskellFile :: Options -> String -> IOThrowsError ()+createHaskellFile opts inFile =+ case opts of+ Options {optTest = True} -> do+ templatePath <- liftIO $ getDataFileName templateFileForTest+ liftIO $ copyFile templatePath "./_tmp.hs"+ egisonProgram <- liftIO $ readFile inFile+ topExprs <- liftThrows $ readTopExprList egisonProgram+ topExprs2 <- expandLoadExprs opts $ appendLoadExprForCoreLibraries topExprs+ liftIO $ appendFile "./_tmp.hs" "\ntopExprs :: [TopExpr]\n"+ liftIO $ appendFile "./_tmp.hs" "topExprs = "+ liftIO $ appendFile "./_tmp.hs" $ show topExprs2+ return ()+ _ -> do+ templatePath <- liftIO $ getDataFileName templateFile+ liftIO $ copyFile templatePath "./_tmp.hs"+ egisonProgram <- liftIO $ readFile inFile+ topExprs <- liftThrows $ readTopExprList egisonProgram+ topExprs2 <- expandLoadExprs opts $ appendLoadExprForCoreLibraries topExprs+ liftIO $ appendFile "./_tmp.hs" "\ntopExprs :: [TopExpr]\n"+ liftIO $ appendFile "./_tmp.hs" "topExprs = "+ liftIO $ appendFile "./_tmp.hs" $ show topExprs2+ return () -expandLoadExprs :: [TopExpr] -> IOThrowsError [TopExpr]-expandLoadExprs [] = return []-expandLoadExprs ((LoadFile filename):topExprs) = do+expandLoadExprs :: Options -> [TopExpr] -> IOThrowsError [TopExpr]+expandLoadExprs _ [] = return []+expandLoadExprs opts ((LoadFile filename):topExprs) = do result <- liftIO $ doesFileExist filename if result then do loadProgram <- liftIO $ readFile filename loadTopExprs <- liftThrows $ readTopExprList loadProgram- rets <- expandLoadExprs topExprs+ rets <- expandLoadExprs opts topExprs return $ loadTopExprs ++ rets else throwError $ Default $ "File does not exist: " ++ filename-expandLoadExprs ((Load libname):topExprs) = do+expandLoadExprs opts ((Load libname):topExprs) = do filename <- liftIO (getDataFileName libname) result <- liftIO $ doesFileExist filename if result then do loadProgram <- liftIO $ readFile filename loadTopExprs <- liftThrows $ readTopExprList loadProgram- rets <- expandLoadExprs topExprs+ rets <- expandLoadExprs opts topExprs return $ loadTopExprs ++ rets else throwError $ Default $ "Library does not exist: " ++ libname-expandLoadExprs (topExpr:topExprs) = do- rets <- expandLoadExprs topExprs+expandLoadExprs opts (topExpr@(Test _):topExprs) =+ case opts of+ Options {optTest = True} -> do+ rets <- expandLoadExprs opts topExprs+ return $ topExpr:rets+ _ -> expandLoadExprs opts topExprs+expandLoadExprs opts (topExpr:topExprs) = do+ rets <- expandLoadExprs opts topExprs return $ topExpr:rets -compileHaskellFile :: Bool -> String -> IO ()-compileHaskellFile prof filename = do+compileHaskellFile :: Options -> String -> IO ()+compileHaskellFile opts filename = do let ghc = "ghc"- if prof- then system $ ghc ++ " -prof -auto-all -o " ++ filename ++ " _tmp.hs"- else system $ ghc ++ " -O2 -o " ++ filename ++ " _tmp.hs"+ case opts of+ Options {optProf = True} ->+ system $ ghc ++ " -prof -auto-all -o " ++ filename ++ " _tmp.hs"+ _ ->+ system $ ghc ++ " -O2 -o " ++ filename ++ " _tmp.hs" removeFile "./_tmp.hs" removeFile "./_tmp.hi" removeFile "./_tmp.o"
hs-src/Interpreter/egisoni.hs view
@@ -1,10 +1,8 @@ module Main where-import Paths_egison import Language.Egison.Core -- Egison Interpreter import Language.Egison.Parser import Language.Egison.Types -- Egison data types import Language.Egison.Variables -- Egison variable operations---import Control.Monad (when) import Control.Monad.Error import System.IO import System.Environment@@ -70,19 +68,3 @@ loop env "> " "" else loop env "> " "" ---countParens :: String -> Bool---countParens str = let countOpen = length $ filter ((==) '(') str in--- let countClose = length $ filter ((==) ')') str in--- (countOpen > 0) && (countOpen <= countClose)---- End REPL Section---- Begin Util section, of generic functions--{- Remove leading/trailing white space from a string; based on corresponding Python function- Code taken from: http://gimbo.org.uk/blog/2007/04/20/splitting-a-string-in-haskell/ -}-strip :: String -> String-strip s = dropWhile ws $ reverse $ dropWhile ws $ reverse s- where ws = (`elem` [' ', '\n', '\t', '\r'])---- End Util
lib/core/number.egi view
@@ -104,10 +104,13 @@ (define $fib (lambda [$n]- (match n Nat- {[<o> 1]- [<s <o>> 1]- [<s <s $n1>> (+ (fib (+ n1 1)) (fib n1))]})))+ (letrec {[$fib1 (lambda [$n $ret1 $ret2]+ (match n Nat+ {[<o> ret2]+ [<s <o>> ret1]+ [<s $n1> (fib1 (- n 1) (+ ret1 ret2) ret1)]+ }))]}+ (fib1 n 1 1)))) (define $fact
sample/collection-test.egi view
@@ -101,12 +101,9 @@ <ok>] [_ <ko>]})) -- (test (match-all {1 2 3 4} (List Integer) [<join _ <join $ns _>> ns])) - ;; pattern macro (define $pair (macro [$s $pat]@@ -144,4 +141,4 @@ (test (isStraight? {1 2})) ;; comparison of large list-(test (match-all (between 1 2000) (List Integer) [<join ,(between 1 1000) <cons $x _>> x]))+(test (match (between 1 10000) (List Integer) {[,(between 1 10000) <ok>] [_ <ko>]}))
− sample/compile-test.egi
@@ -1,6 +0,0 @@-(define $main- (lambda [$: $argv]- (do {[$: (write-string : "output : ")]- [$: (write : argv)]- [$: (write-char : '\n')]}- :)))
sample/n-queen.egi view
@@ -4,8 +4,7 @@ [<cons $a_1 (loop $l $i (between 2 n) <cons (loop $l1 $i1 (between 1 (- i 1))- (& ^,(- a_i1 (- i i1))- ^,(+ a_i1 (- i i1))+ (& ^,(- a_i1 (- i i1)) ^,(+ a_i1 (- i i1)) l1) $a_i) l>
sample/number-test.egi view
@@ -1,5 +1,24 @@-(test (fib 10))+(test (if ((= (List Integer)) (between 3 5)+ {3 4 5})+ <ok>+ <ko>)) -(test (fact 10))+(test (if (eq? (min&max {10 20 4 40 23})+ [4 40])+ <ok>+ <ko>)) -(test (gcd {10 20 40 35}))+(test (if (eq-n? (fib 10)+ 89)+ <ok>+ <ko>))++(test (if (eq-n? (fact 10)+ 3628800)+ <ok>+ <ko>))++(test (if (eq-n? (gcd {10 20 40 35})+ 5)+ <ok>+ <ko>))