> 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.

Reply via email to