packages feed

egison 3.2.22 → 3.2.23

raw patch · 4 files changed

+64/−32 lines, 4 files

Files

egison.cabal view
@@ -1,5 +1,5 @@ Name:                egison-Version:             3.2.22+Version:             3.2.23 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 against unfree data types.
hs-src/Interpreter/egisoni.hs view
@@ -114,10 +114,6 @@   putStrLn $ "Leaving Egison Interpreter."   exitWith ExitSuccess -onAbort :: EgisonError -> IO (Either EgisonError a)-onAbort e = return $ Left e-- repl :: Env -> String -> IO () repl env prompt = do   loop env
hs-src/Language/Egison/Util.hs view
@@ -6,7 +6,7 @@ This module provides utility functions. -} -module Language.Egison.Util (getEgisonExpr, completeEgison) where+module Language.Egison.Util (getEgisonExpr, getEgisonExprOrNewLine, completeEgison) where  import Data.List import Text.Regex.Posix@@ -18,33 +18,66 @@  -- |Get Egison expression from the prompt. We can handle multiline input. getEgisonExpr :: String -> InputT IO (Maybe (Either (String, EgisonTopExpr) (String, EgisonExpr)))-getEgisonExpr prompt = getEgisonExpr' ""- where-  getEgisonExpr' :: String -> InputT IO (Maybe (Either (String, EgisonTopExpr) (String, EgisonExpr)))-  getEgisonExpr' prev = do-    mLine <- case prev of-               "" -> getInputLine prompt-               _ -> getInputLine $ take (length prompt ) (repeat ' ')-    case mLine of-      Nothing -> return Nothing-      Just line -> do-        let input = prev ++ line-        case parseTopExpr input of-          Left err | show err =~ "unexpected end of input" -> do-            getEgisonExpr' $ input ++ "\n"-          Left err | show err =~ "expecting (top-level|\"define\")" ->-            case parseExpr input of-              Left err | show err =~ "unexpected end of input" -> do-                getEgisonExpr' $ input ++ "\n"-              Left err -> do-                liftIO $ putStrLn $ show err-                getEgisonExpr prompt-              Right expr -> return $ Just $ Right (input, expr)-          Left err -> do-            liftIO $ putStrLn $ show err-            getEgisonExpr prompt-          Right topExpr -> return $ Just $ Left (input, topExpr)+getEgisonExpr prompt = getEgisonExpr' prompt "" +getEgisonExpr' :: String -> String -> InputT IO (Maybe (Either (String, EgisonTopExpr) (String, EgisonExpr)))+getEgisonExpr' prompt prev = do+  mLine <- case prev of+             "" -> getInputLine prompt+             _ -> getInputLine $ take (length prompt) (repeat ' ')+  case mLine of+    Nothing -> return Nothing+    Just [] -> do+      if null prev+        then getEgisonExpr prompt+        else getEgisonExpr' prompt prev+    Just line -> do+      let input = prev ++ line+      case parseTopExpr input of+        Left err | show err =~ "unexpected end of input" -> do+          getEgisonExpr' prompt $ input ++ "\n"+        Left err | show err =~ "expecting (top-level|\"define\")" ->+          case parseExpr input of+            Left err | show err =~ "unexpected end of input" -> do+              getEgisonExpr' prompt $ input ++ "\n"+            Left err -> do+              liftIO $ putStrLn $ show err+              getEgisonExpr prompt+            Right expr -> return $ Just $ Right (input, expr)+        Left err -> do+          liftIO $ putStrLn $ show err+          getEgisonExpr prompt+        Right topExpr -> return $ Just $ Left (input, topExpr)++-- |Get Egison expression from the prompt. We can handle multiline input.+getEgisonExprOrNewLine :: String -> InputT IO (Either (Maybe String) (Either (String, EgisonTopExpr) (String, EgisonExpr)))+getEgisonExprOrNewLine prompt = getEgisonExprOrNewLine' prompt ""++getEgisonExprOrNewLine' :: String -> String -> InputT IO (Either (Maybe String) (Either (String, EgisonTopExpr) (String, EgisonExpr)))+getEgisonExprOrNewLine' prompt prev = do+  mLine <- case prev of+             "" -> getInputLine prompt+             _ -> getInputLine $ take (length prompt) (repeat ' ')+  case mLine of+    Nothing -> return $ Left Nothing+    Just [] -> return $ Left $ Just ""+    Just line -> do+      let input = prev ++ line+      case parseTopExpr input of+        Left err | show err =~ "unexpected end of input" -> do+          getEgisonExprOrNewLine' prompt $ input ++ "\n"+        Left err | show err =~ "expecting (top-level|\"define\")" ->+          case parseExpr input of+            Left err | show err =~ "unexpected end of input" -> do+              getEgisonExprOrNewLine' prompt $ input ++ "\n"+            Left err -> do+              liftIO $ putStrLn $ show err+              getEgisonExprOrNewLine prompt+            Right expr -> return $ Right $ Right (input, expr)+        Left err -> do+          liftIO $ putStrLn $ show err+          getEgisonExprOrNewLine prompt+        Right topExpr -> return $ Right $ Left (input, topExpr)  -- |Complete Egison keywords completeEgison :: Monad m => CompletionFunc m
lib/core/collection.egi view
@@ -231,6 +231,9 @@ ;; ;; Simple accessors ;;+(define $cons+  (lambda [$x $xs] {x @xs}))+ (define $car   (lambda [$xs]     (match xs (list something)