(defn analyze-const
[form env & [type]]
(let [type (or type (classify form))]
(merge
{:op :const
:env env
:type type
:literal? true
:val form
:form form}
(when-let [m (and (obj? form)
(not-empty (meta form)))]
{:meta (analyze-const m (ctx env :ctx/expr) :map) ;; metadata on a constant literal will not be evaluated at
:children [:meta]}))))