diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -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.
diff --git a/hs-src/Interpreter/egisoni.hs b/hs-src/Interpreter/egisoni.hs
--- a/hs-src/Interpreter/egisoni.hs
+++ b/hs-src/Interpreter/egisoni.hs
@@ -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
diff --git a/hs-src/Language/Egison/Util.hs b/hs-src/Language/Egison/Util.hs
--- a/hs-src/Language/Egison/Util.hs
+++ b/hs-src/Language/Egison/Util.hs
@@ -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
diff --git a/lib/core/collection.egi b/lib/core/collection.egi
--- a/lib/core/collection.egi
+++ b/lib/core/collection.egi
@@ -231,6 +231,9 @@
 ;;
 ;; Simple accessors
 ;;
+(define $cons
+  (lambda [$x $xs] {x @xs}))
+
 (define $car
   (lambda [$xs]
     (match xs (list something)
