try*
special form | removed v0.0-1933 | added v0.0-927 | Edit |
(defmethod parse 'try*
[op env [_ & body :as form] name]
(let [body (vec body)
catchenv (update-in env [:context] #(if (= :expr %) :return %))
tail (peek body)
fblock (when (and (seq? tail) (= 'finally (first tail)))
(rest tail))
finally (when fblock
(analyze (assoc env :context :statement) `(do ~@fblock)))
body (if finally (pop body) body)
tail (peek body)
cblock (when (and (seq? tail)
(= 'catch (first tail)))
(rest tail))
name (first cblock)
locals (:locals catchenv)
locals (if name
(assoc locals name
{:name name
:line (get-line name env)
:column (get-col name env)})
locals)
catch (when cblock
(analyze (assoc catchenv :locals locals) `(do ~@(rest cblock))))
body (if name (pop body) body)
try (analyze (if (or name finally) catchenv env) `(do ~@body))]
(when name (assert (not (namespace name)) "Can't qualify symbol in catch"))
{:env env :op :try* :form form
:try try
:finally finally
:name name
:catch catch
:children [try catch finally]}))