 	       ~@(compile-pass1 else-body)
 	       ~end-label))
           ;;
-          ('cond)
-          `((:VM_IVAL ~(make-nil)))
-          ;;
-          ('cond clause & clauses)
-          (let [end-label (gensym),
-                clauses-insts
-                (apply concat
-                       (map (fn [clause]
-                              (let [pred (first clause)
-                                    body (rest clause)
-                                    next-clause-label (gensym)]
-                                `(~@(compile-pass1 pred)
-                                  (:VM_BIFN ~next-clause-label)
-                                  ~@(apply concat
-                                           (map compile-pass1 body))
-                                  (:VM_JMP ~end-label)
-                                  ~next-clause-label)))
-                            (cons clause clauses)))]
-            `(~@clauses-insts
-              ~end-label))
+          ('cond & clauses)	(compile-cond clauses)
 	  ;;
           ('and)
           `((:VM_IVAL ~(make-t)))

       ;; lisp namespace operation
       (:VM_BIND lispval-symbol)	;; bind stack-top value to symbol(operand)
       (:VM_UNBIND integer) ;; unbind symbol(operand)
       (:VM_VREF lispval-symbol)	  ;; refer value of symbol(operand)
       (:VM_VSET lispval-symbol)	  ;; overwrite symbol(operand) by %val

       ;; basic arithmetic operation
       (:VM_LT nil)	;; (< <%val> <stack-top>)

                                    (:VM_POP)))
	  ;;
	  ('dotimes (var num) & body)
          (compile-dotimes var num body)
	  
	  ;;
	  _	(compile-funcall (first exp) (rest exp)))
   ;;
