diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -1,5 +1,5 @@
 Name:                egison
-Version:             2.4.2
+Version:             2.4.3
 Synopsis:            An Interpreter and Compiler for the Programming Language Egison
 Description:         An interpreter and compiler for the programming language Egison.
                      A feature of Egison is the strong pattern match facility.
@@ -16,7 +16,8 @@
 Build-type:          Simple
 Cabal-version:       >=1.8
 
-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
+Data-files:          lib/core/base.egi lib/core/number.egi lib/core/collection.egi lib/core/array.egi lib/core/pattern.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/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
diff --git a/hs-src/Language/Egison/Core.hs b/hs-src/Language/Egison/Core.hs
--- a/hs-src/Language/Egison/Core.hs
+++ b/hs-src/Language/Egison/Core.hs
@@ -40,6 +40,7 @@
   _ <- evalString env $ "(load \"lib/core/number.egi\")"
   _ <- evalString env $ "(load \"lib/core/collection.egi\")"
   _ <- evalString env $ "(load \"lib/core/array.egi\")"
+  _ <- evalString env $ "(load \"lib/core/pattern.egi\")"
   return ()
 
   
@@ -317,7 +318,6 @@
                                        cEval1 (Closure newEnv body)
     Value (Macro mArgs body) -> do argExprs <- liftThrows $ tupleExprToExprList argExpr
                                    newBody <- expandMacro (Data.Map.fromList (zip mArgs argExprs)) body
-                                   liftIO $ putStrLn $ showExpr newBody
                                    cEval1 (Closure env newBody)
     _ -> throwError $ Default "not function"
 cEval1 (Closure _ UndefinedExpr) = do
diff --git a/hs-src/Language/Egison/Macro.hs b/hs-src/Language/Egison/Macro.hs
--- a/hs-src/Language/Egison/Macro.hs
+++ b/hs-src/Language/Egison/Macro.hs
@@ -1,5 +1,6 @@
 module Language.Egison.Macro where
 import Language.Egison.Types
+import Control.Monad.Error
 import qualified Data.Map
 
 type MacroFrame = Data.Map.Map String EgisonExpr
@@ -12,16 +13,16 @@
   case getExpr frame name of
     Nothing -> return $ VarExpr name []
     Just expr -> return expr
-expandMacro frame (PatVarOmitExpr expr) = do
-  newExpr <- expandMacro frame expr
-  case newExpr of
-    MacroVarExpr name numExprs -> return $ PatVarExpr name numExprs
-    _ -> return $ PatVarOmitExpr newExpr
-expandMacro frame (VarOmitExpr expr) = do
-  newExpr <- expandMacro frame expr
-  case newExpr of
-    MacroVarExpr name numExprs -> return $ VarExpr name numExprs
-    _ -> return $ VarOmitExpr newExpr
+expandMacro frame (PatVarOmitExpr name nums) = do
+  case getExpr frame name of
+    Nothing -> throwError $ Default $ "no macro var: " ++ name
+    Just (MacroVarExpr name2) -> return $ PatVarExpr name2 nums
+    expr -> throwError $ Default $ "not macro var: " ++ show expr
+expandMacro frame (VarOmitExpr name nums) = do
+  case getExpr frame name of
+    Nothing -> throwError $ Default $ "no macro var: " ++ name
+    Just (MacroVarExpr name2) -> return $ VarExpr name2 nums
+    expr -> throwError $ Default $ "not macro var: " ++ show expr
 expandMacro frame (InductiveDataExpr cons exprs) = do
   newExprs <- mapM (expandMacro frame) exprs
   return $ InductiveDataExpr cons newExprs
diff --git a/hs-src/Language/Egison/Parser.hs b/hs-src/Language/Egison/Parser.hs
--- a/hs-src/Language/Egison/Parser.hs
+++ b/hs-src/Language/Egison/Parser.hs
@@ -228,20 +228,21 @@
 parseMacroVarExpr = do
   char '%'
   name <- identifier
-  nums <- lexeme parseIndexNums
-  return $ MacroVarExpr name nums
+  return $ MacroVarExpr name
 
 parsePatVarOmitExpr :: Parser EgisonExpr
 parsePatVarOmitExpr = do
   string "$`"
-  expr <- lexeme parseExpr
-  return $ PatVarOmitExpr expr
+  name <- identifier
+  nums <- lexeme parseIndexNums
+  return $ PatVarOmitExpr name nums
 
 parseVarOmitExpr :: Parser EgisonExpr
 parseVarOmitExpr = do
   char '`'
-  expr <- lexeme parseExpr
-  return $ VarOmitExpr expr
+  name <- identifier
+  nums <- lexeme parseIndexNums
+  return $ VarOmitExpr name nums
 
 parseArgs :: Parser ArgsExpr
 parseArgs = do
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
@@ -84,9 +84,9 @@
   | NumberExpr Integer
   | FloatExpr Double
   | VarExpr String [EgisonExpr]
-  | MacroVarExpr String [EgisonExpr]
-  | PatVarOmitExpr EgisonExpr
-  | VarOmitExpr EgisonExpr
+  | MacroVarExpr String
+  | PatVarOmitExpr String [EgisonExpr]
+  | VarOmitExpr String [EgisonExpr]
   | PatVarExpr String [EgisonExpr]
   | WildCardExpr
   | ValuePatExpr EgisonExpr
@@ -331,12 +331,12 @@
 showExpr (NumberExpr contents) = show contents
 showExpr (FloatExpr contents) = show contents
 showExpr (VarExpr name nums) = name ++ unwordsNumExprs nums
-showExpr (MacroVarExpr name nums) = "%" ++ name ++ unwordsNumExprs nums
+showExpr (MacroVarExpr name) = "%" ++ name
 showExpr (PatVarExpr name nums) = "$" ++ name ++ unwordsNumExprs nums
 showExpr WildCardExpr = "_"
 showExpr (ValuePatExpr expr) = "," ++ showExpr expr
-showExpr (PatVarOmitExpr pvar) = "$`" ++ showExpr pvar
-showExpr (VarOmitExpr pvar) = "`" ++ showExpr pvar
+showExpr (PatVarOmitExpr name nums) = "$`" ++ name ++ unwordsNumExprs nums
+showExpr (VarOmitExpr name nums) = "`" ++ name ++ unwordsNumExprs nums
 showExpr (CutPatExpr _) = "#<cut-pat>"
 showExpr (NotPatExpr _) = "#<not-pat>"
 showExpr (AndPatExpr _) = "#<and-pat>"
diff --git a/lib/core/pattern.egi b/lib/core/pattern.egi
new file mode 100644
--- /dev/null
+++ b/lib/core/pattern.egi
@@ -0,0 +1,15 @@
+;;
+;; Pattern.egi
+;;
+
+(define $comb
+  (macro [$n $v]
+    (loop $l $i (between 1 n) <join _ <cons $`v_i l>> _)))
+
+(define $comb/double
+  (macro [$n $v]
+    (loop $l $i (between 1 n) <join _ (& <cons $`v_i _> l)> _)))
+
+(define $cloop
+  (macro [$n $v]
+    (loop $l $i (between 1 n) {`v_i @l} {})))
