diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -1,5 +1,5 @@
 Name:                egison
-Version:             2.1.9
+Version:             2.1.10
 Synopsis:            An Interpreter for the Programming Language Egison
 Description:         An interpreter for the programming language Egison.
                      A feature of Egison is the strong pattern match facility.
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
@@ -664,16 +664,18 @@
 
 snocDestructInnerRefs :: [InnerValRef] -> IOThrowsError (ObjectRef, ObjectRef)
 snocDestructInnerRefs [] = throwError $ Default "snocDestructInnerRefs: empty collection"
-snocDestructInnerRefs ((IElement objRef):rest) = do
-  cdrObjRef <- liftIO $ newIORef $ Intermidiate $ ICollection rest
-  return (objRef, cdrObjRef)
-snocDestructInnerRefs ((ISubCollection objRef):rest) = do
-  b <- isEmptyCollection objRef
-  if b
-    then snocDestructInnerRefs rest
-    else do (carObjRef, cdrObjRef) <- snocDestruct objRef
-            cdrObjRef2 <- liftIO $ newIORef $ Intermidiate $ ICollection $ (ISubCollection cdrObjRef):rest
-            return (carObjRef, cdrObjRef2)
+snocDestructInnerRefs innerRefs =
+  case reverse innerRefs of
+    ((IElement objRef):rest) -> do
+      cdrObjRef <- liftIO $ newIORef $ Intermidiate $ ICollection $ reverse rest
+      return (objRef, cdrObjRef)
+    ((ISubCollection objRef):rest) -> do
+      b <- isEmptyCollection objRef
+      if b
+        then snocDestructInnerRefs $ reverse rest
+        else do (racObjRef, rdcObjRef) <- snocDestruct objRef
+                rdcObjRef2 <- liftIO $ newIORef $ Intermidiate $ ICollection $ (reverse rest) ++ [(ISubCollection rdcObjRef)]
+                return (racObjRef, rdcObjRef2)
     
 snocDestructInnerVals :: [InnerVal] -> IOThrowsError (ObjectRef, ObjectRef)
 snocDestructInnerVals [] = throwError $ Default "snocDestructInnerVals: empty collection"
