> I am impressed that you were able to write a macro without any repl...
Pretty amazed myself. Never seems to happen when it's code that I'm trying to write for myself :-) On Monday, September 1, 2014 12:06:45 AM UTC+10, Yehonathan Sharvit wrote: > > 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.