Thanks a lot Beau.
Your code almost worked.
This is the working code -- you just forgot the '&' between args and body
:)
I am impressed that you were able to write a macro without any repl...
(defmacro deftry [& definition]
(if (vector? (second definition))
(let [[name args & body] definition]
`(defn ~name ~args
(try ~@body
(catch Error e#
(println "error caught:" e#)))))
(let [[name & definitions] definition]
`(defn ~name ~@(map (fn [[args & body]] `(~args (try ~@body (catch
Error e# (println "err caught" e#)))))
definitions)))))
On Sunday, 31 August 2014 13:56:03 UTC+3, Beau Fabry wrote:
>
> This isn't a multimethod, it's a multiple-arity function. Anyway, you just
> need to detect that someone has tried to define a multiple arity method and
> change your definition accordingly. Something like below. I haven't
> actually tried this code so it's almost definitely wrong but you get the
> gist.
>
> (defmacro deftry [& definition]
> (if (vec? (second definition))
> (let [[name args & body] definition]
> `(defn ~name ~args
> (try ~@body
> (catch Error e#
> (println "error caught:" e#)))))
> (let [[name & definitions] definition]
> `(defn ~name ~@(map (fn [[args body]] `(~args (try ~@body (catch
> Error e# (println "err caught")))))
> definitions)))))
>
>
> On Sunday, August 31, 2014 8:26:12 PM UTC+10, Yehonathan Sharvit wrote:
>>
>> I tried to write a macro that wraps the code a function with a try/catch
>> statement. It works fine for regular functions but it doesn't work for
>> multimethods. I understand the reason, but I don't know how to fix it.
>>
>> Here is my code:
>>
>> (defmacro deftry [name args & body] "
>> https://groups.google.com/forum/#!topic/clojurescript/To0AnQVC3lg"
>> `(defn ~name ~args
>> (try ~@body
>> (catch Error e#
>> (println "error caught:" e#)))))
>>
>>
>> Usage:
>> 1. regular function => it works fine
>>
>> (deftry foo []
>> (throw (Error. "foo")))
>>
>>
>> 2. multimethods => it breaks
>> (deftry foo
>> ([a] 3)
>> ([] 5))
>>
>>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.