(defn parse-set!
[[_ target val :as form] env]
(when-not (= 3 (count form))
(throw (ex-info (str "Wrong number of args to set!, had: " (dec (count form)))
(merge {:form form}
(-source-info form env)))))
(let [target (analyze-form target (ctx env :ctx/expr))
val (analyze-form val (ctx env :ctx/expr))]
{:op :set!
:env env
:form form
:target target
:val val
:children [:target :val]}))