(defmacro deferror
"Define a new error type"
{:arglists '([name [parent-error?] doc-string? [args*] & body]
[name [parent-error?] doc-string? args-destruct-map & body])}
[err-name pvec & decl]
(let [pvec (if (empty? pvec) [`error] pvec)
[docstr args & body] (if (string? (first decl)) decl (cons nil decl))
args (or args [])
argmap (if (vector? args) `{:keys ~args} args)
body (or body {})
qual-err-name (symbol (str *ns*) (name err-name))]
(assert (== (count pvec) 1)) ; only support single-inheritance for now
(assert (vector? args)) ; only vector (keyword destruct) args for now
`(do
(defn ~err-name [details#]
(let [basedata# ((resolve (first (parents '~qual-err-name))) details#)
~argmap basedata#]
(merge basedata# {:tag '~qual-err-name} (do ~@body) details#)))
(alter-meta! (var ~err-name) assoc
:doc ~docstr ::args ~(vec (map #(keyword (str %)) args)))
~@(for [parent pvec]
`(derive '~qual-err-name '~(qualify-sym parent)))
(var ~err-name))))
Used in 0 other vars
Comments top
No comments for deferror. Log in to add a comment.