 
 #?(:cljs
    (def CLJS_CORE_SYM 'cljs.core))
+
+(def IGNORE_SYM 'ignore)
+
+(def ANY_SYM 'any)
 
 #?(:cljs
    (defn ^boolean cljs-seq? [x]

#?(:cljs
   (def STRING_SYM 'string))

#?(:cljs
   (def BOOLEAN_SYM 'boolean))

#?(:cljs
   (def JS_STAR_SYM 'js*))

  (if-let [tag (get-tag e)]
    tag
    (case (:op e)
      :recur    IGNORE_SYM
      :throw    IGNORE_SYM
      :let      (infer-tag env (:expr e))
      :loop     (infer-tag env (:expr e))
      :do       (infer-tag env (:ret e))
      :method   (infer-tag env (:expr e))
      :def      (infer-tag env (:init e))
      :invoke   (infer-invoke env e)
      :if       (infer-if env e)
      :constant (case (:form e)
                  true BOOLEAN_SYM
                  false BOOLEAN_SYM
                  ANY_SYM)
      :var      (if (:init e)
                  (infer-tag env (:init e))
                  (infer-tag env (:info e)))
      :dot      ANY_SYM
      :js       ANY_SYM
      nil)))

(defmulti parse (fn [op & rest] op))
