On Wed, Jul 27, 2011 at 2:13 PM, Alan Malloy <a...@malloys.org> wrote: > On Jul 27, 11:11 am, Alan Malloy <a...@malloys.org> wrote: >> On Jul 27, 5:50 am, Feng Shen <shen...@gmail.com> wrote: >> >> > Clojure core.clj has a macro when-let, >> > I am wondering how to write a macro `when-lets` >> >> > (when-lets [symbol-1 test-1 >> > symbol-2 test-2 >> > ... >> > ] >> > body >> > ) >> >> > body only get evaluated when (and test-1 test-2 ....) >> > I am thinking about it, anybody has any clue? >> >> (defmacro when-lets [tests & body] >> (reduce (fn [body test] >> `(when-let ~(vec test) >> ~body)) >> `(do ~@body) >> (partition 2 (reverse tests)))) >> >> This would be cleaner if we had foldr in the language already - I find >> myself wanting it quite often for macros like this. > > Sorry, should of course be > > (defmacro when-lets [tests & body] > (reduce (fn [body test] > `(when-let ~(vec test) > ~body)) > `(do ~@body) > (reverse (partition 2 tests)))) > > Apparently the reason I want foldr is because I get it wrong when I do > it myself.
(defn foldr ([f coll] (reduce f (reverse coll))) ([f init coll] (reduce f init (reverse coll)))) There. :) -- Protege: What is this seething mass of parentheses?! Master: Your father's Lisp REPL. This is the language of a true hacker. Not as clumsy or random as C++; a language for a more civilized age. -- 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