diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -1,5 +1,5 @@
 Name:                egison
-Version:             3.2.6
+Version:             3.2.7
 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,
@@ -51,6 +51,6 @@
 
 Executable egison
   Main-is:             egisoni.hs
-  Build-depends:       egison, base >= 4.0 && < 5, array, containers, unordered-containers, haskeline, transformers, mtl, parsec >= 3.0, directory, ghc, ghc-paths, filepath, regex-posix, strict-io, bytestring
+  Build-depends:       egison, base >= 4.0 && < 5, array, containers, unordered-containers, haskeline, transformers, mtl, parsec >= 3.0, directory, ghc, ghc-paths, filepath, regex-posix, strict-io, bytestring, unix
   Other-modules:       Paths_egison
   Hs-Source-Dirs:      hs-src/Interpreter
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
@@ -1,5 +1,12 @@
 module Main where
 
+import Prelude hiding (catch)
+import Control.Exception ( SomeException(..),
+                           AsyncException(..),
+                           catch, handle, throw)
+import System.Posix.Signals
+import Control.Concurrent
+
 import Control.Applicative ((<$>), (<*>))
 import Control.Monad.Error
 
@@ -11,9 +18,10 @@
 import System.Environment
 import System.Directory (getHomeDirectory)
 import System.FilePath ((</>))
-import System.Console.Haskeline
+import System.Console.Haskeline hiding (handle, catch, throwTo)
 import System.Console.GetOpt
 import System.Exit (ExitCode (..), exitWith, exitFailure)
+import System.IO
 import Language.Egison
 
 main :: IO ()
@@ -104,17 +112,25 @@
 showByebyeMessage = do
   putStrLn $ "Leaving Egison Interpreter."
 
+onAbort :: EgisonError -> IO (Either EgisonError a)
+onAbort e = do
+  let x = show e
+  return $ Left e
+
 repl :: Env -> String -> IO ()
 repl env prompt = do
   home <- getHomeDirectory
-  liftIO (runInputT (settings home) $ loop env prompt "")
+  liftIO (runInputT (settings home) $ (loop env prompt ""))
   where
     settings :: MonadIO m => FilePath -> Settings m
     settings home = defaultSettings { historyFile = Just (home </> ".egison_history") }
     
     loop :: Env -> String -> String -> InputT IO ()
     loop env prompt' rest = do
+      _ <- liftIO $ installHandler keyboardSignal (Catch (do {putStr "^C"; hFlush stdout})) Nothing
       input <- getInputLine prompt'
+      tid <- liftIO $ myThreadId
+      _ <- liftIO $ installHandler keyboardSignal (Catch (throwTo tid UserInterruption)) Nothing
       case input of
         Nothing -> return () 
         Just "quit" -> return () 
@@ -124,12 +140,12 @@
             _ -> loop env (take (length prompt) (repeat ' ')) rest
         Just input' -> do
           let newInput = rest ++ input'
-          result <- liftIO $ runEgisonTopExpr env newInput
+          result <- liftIO $ handle onAbort $ runEgisonTopExpr env newInput
           case result of
             Left err | show err =~ "unexpected end of input" -> do
               loop env (take (length prompt) (repeat ' ')) $ newInput ++ "\n"
             Left err | show err =~ "expecting (top-level|\"define\")" -> do
-              result <- liftIO $ fromEgisonM (readExpr newInput) >>= either (return . Left) (evalEgisonExpr env)
+              result <- liftIO $ handle onAbort $ fromEgisonM (readExpr newInput) >>= either (return . Left) (evalEgisonExpr env)
               case result of
                 Left err | show err =~ "unexpected end of input" -> do
                   loop env (take (length prompt) (repeat ' ')) $ newInput ++ "\n"
@@ -144,4 +160,3 @@
               loop env prompt ""
             Right env' ->
               loop env' prompt ""
-    
diff --git a/hs-src/Language/Egison/Types.hs b/hs-src/Language/Egison/Types.hs
--- a/hs-src/Language/Egison/Types.hs
+++ b/hs-src/Language/Egison/Types.hs
@@ -1,9 +1,12 @@
 {-# Language TypeSynonymInstances, FlexibleInstances, GeneralizedNewtypeDeriving,
-             MultiParamTypeClasses, UndecidableInstances  #-}
+             MultiParamTypeClasses, UndecidableInstances, DeriveDataTypeable #-}
 module Language.Egison.Types where
 
 import Prelude hiding (foldr)
 
+import Control.Exception
+import Data.Typeable
+
 import Control.Applicative
 import Control.Monad.Error
 import Control.Monad.State
@@ -356,7 +359,9 @@
   | Match String
   | Parser String
   | Desugar String
+  | UserInterruption
   | Default String
+  deriving Typeable
     
 instance Show EgisonError where
   show (Parser error) = "Parse error at: " ++ error
@@ -368,7 +373,10 @@
   show (NotImplemented message) = "Not implemented: " ++ message
   show (Assertion message) = "Assertion failed: " ++ message
   show (Desugar message) = "Error: " ++ message
+  show UserInterruption = "Aborted: User interruption"
   show (Default message) = "Error: " ++ message
+
+instance Exception EgisonError
 
 instance Error EgisonError where
   noMsg = Default "An error has occurred"
diff --git a/lib/core/base.egi b/lib/core/base.egi
--- a/lib/core/base.egi
+++ b/lib/core/base.egi
@@ -46,3 +46,13 @@
       (match x a
         {[,y #t]
          [_ #f]}))))
+
+(define $compose
+  (lambda [$f $g]
+    (lambda $x
+      (apply g (apply f x)))))
+
+(define $compose3
+  (lambda [$f $g $h]
+    (lambda $x
+      (apply h (apply g (apply f x))))))
diff --git a/lib/core/collection.egi b/lib/core/collection.egi
--- a/lib/core/collection.egi
+++ b/lib/core/collection.egi
@@ -310,4 +310,3 @@
        [$ [something]
         {[$tgt {tgt}]}]
        })))
-
