The macro below is called if-let-all.
(defmacro if-let-all
"if-let-all evaluates every local binding sequentially and evaluates
true-case only if every local binding is a truthy value.
true-case has access to all local bindings, but false-case doesn't have access
to local bindings."
[bindings true-case false-case]
(let [pairs (partition 2 bindings)
names (mapv first pairs)
exprs (map second pairs)
exprs-in-if-let (fn self [[name1 & more-names] [expr1 & more-exprs]]
`(if-let [~name1 ~expr1]
~(if more-names
(self more-names more-exprs)
names)))
things (exprs-in-if-let names exprs)]
`(if-let [~names ~things]
~true-case
~false-case)))
You can use it as (if-let-all [a 2 b 3] (+ a b) "oh no!!"). false-case doesn't
have access to local bindings.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.