(defn analyze-form [env form name opts]
(load-core)
(cond
(symbol? form) (analyze-symbol env form)
(and (seq? form) (seq form)) (analyze-seq env form name opts)
(record? form) (analyze-record env form)
(map? form) (analyze-map env form)
(vector? form) (analyze-vector env form)
(set? form) (analyze-set env form)
(keyword? form) (analyze-keyword env form)
(instance? JSValue form) (analyze-js-value env form)
(= () form) (analyze-list env form)
:else
(let [tag (cond
(nil? form) 'clj-nil
(number? form) 'number
(string? form) 'string
(true? form) 'boolean
(false? form) 'boolean)]
(cond-> {:op :constant :env env :form form}
tag (assoc :tag tag)))))