egison 3.2.22 → 3.2.23
raw patch · 4 files changed
+64/−32 lines, 4 files
Files
- egison.cabal +1/−1
- hs-src/Interpreter/egisoni.hs +0/−4
- hs-src/Language/Egison/Util.hs +60/−27
- lib/core/collection.egi +3/−0
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)