   :default -invoke-)
 
 (defmethod emit-seq 'lambda
-  [env context gen [_ params & body :as lambda]]
+  [env context ^GeneratorAdapter gen [_ params & body :as lambda]]
   (when-not (= context :context/statement)
     (let [[dotname bytecode closed-overs] (compile lambda)]
       (. *class-loader* defineClass dotname bytecode lambda)

  value)

(defmethod emit-seq 'define
  [env context gen [_ name val :as form]]
  (when (> (count form) 3)
    (throw (IllegalArgumentException. "define only takes one value")))
  (set-global! name (eval* val))
  (emit-global gen name))

(defmethod emit-seq 'if
  [env context gen [_ condition then else :as the-if]]
  (debug "emit-seq if" the-if context)
  (when-not (<= 3 (count the-if) 4)
    (throw (IllegalArgumentException. "if takes 2 or 3 forms")))

         eval)

(defn asmtype ^Type [^Class cls] (Type/getType cls))
(def ^Type object-type (asmtype Object))
(def ^Type boolean-object-type (asmtype Boolean))
(def ^Type ilambda-type (asmtype ILambda))
(def ^Method void-ctor (Method/getMethod "void <init>()"))

(defn dotmunge
  [str]
  (.replace ^String (munge str) "." "_DOT_"))

(defn close-name
  [fsym]
