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

Reply via email to