Thanks for the very informative reply!

On Apr 17, 1:40 pm, Christophe Grand <christo...@cgrand.net> wrote:
> tmountain a écrit :
>
>
>
> > Hi guys. I'm in the process of learning Clojure and loving it so far.
> > I've been dabbling in Common Lisp for years, but Clojure has so many
> > nice features that it's rapidly becoming my language of choice.
> > Recently, I've been trying to get my head wrapped around macros and
> > that an `or macro' would be a good candidate since you want to defer
> > evaluation of arguments until absolutely necessary. I hacked this up,
> > and it seems to work, but I wanted to see if I could have done
> > anything better.
>
> > (defmacro my-or [& args]
> >    (let [head (first args)
> >           tail (rest  args)]
> >           (if (nil? tail)
> >               head
> >               `(if ~head
> >                    ~head
> >                    (my-or ~...@tail)))))
>
> You could use multiples arities to replace the (if (nil?... and shorten
> your macro:
>
> (defmacro my-or
>  ([head] head)
>  ([head & tail]
>    `(if ~head
>       ~head
>       (my-or ~...@tail))))
>
> There's still a problem: ~head appears twice which means the code substituted 
> to head can be called twice if it returns true.
> (defmacro my-or
>  ([head] head)
>  ([head & tail]
>    `(let [x# ~head]
>       (if x#
>         x#
>         (my-or ~...@tail)))))
>
> hth,
>
> Christophe
>
> --
> Professional:http://cgrand.net/(fr)
> On Clojure:http://clj-me.blogspot.com/(en)
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to