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 clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.