 ;;   [env context gen [_ fields :as defcls]])
 
 (defmethod emit-seq 'let
-  [env context gen [_ bindings & body :as the-let]]
+  [env context ^GeneratorAdapter gen [_ bindings & body :as the-let]]
   (let [start-label (. gen newLabel)
         end-label (. gen newLabel)
         names (mapv #(vector (first %) (. gen newLocal object-type)) bindings)

  (. gen invokeVirtual (asmtype java.io.PrintWriter) (Method/getMethod "void println(String)")))

(defn emit-var
  [gen sym]
  (. gen push (namespace sym))
  (. gen push (name sym))
  (. gen invokeStatic (asmtype RT) (Method/getMethod "clojure.lang.Var var(String,String)")))

(declare emit-jvm)
(defmethod emit-seq :jvm
  [env context gen [_ & insns]]
  (doseq [i insns]
    (emit-jvm env context gen i)))

(defmethod emit-seq -invoke-
  [env context gen [fun & args :as call]]
  (when (nil? fun)
    (throw (IllegalArgumentException. "Can't invoke nil")))
  (debug "emitting invoke:" call)

         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]
