Sorry guys, I forget to mention that it should behave like "let" in Clojure 
or like "let*" in Scheme.

I mean e.g.:
(if-let* [x 1 y nil z (inc y)]
  (+ x y z)
  0) ; => 0 
;; (inc y) shouldn't be evaluated here.

Which means "and" doesn't work there.
In terms of implementation I mean smth like that:

(defmacro if-let*
  ([bindings then]
   `(if-let* ~bindings ~then nil))
  ([bindings then else]
   (if (seq bindings)
     `(if-let [~(first bindings) ~(second bindings)]
        (if-let* ~(drop 2 bindings) ~then ~else)
        ~else)
     then)))

But anyway I'm more interested in history of that behavior rather than 
implementation.
Because for me it seems logical if "let" support more than two forms 
"if-let" also could do that. 
And I'd like to understand: "Am I wrong or it's just historical reason?"

Ed

On Friday, January 4, 2013 1:29:41 PM UTC+6, Andy Fingerhut wrote:
>
> I don't know the history of the answer to "why", except perhaps as hinted 
> by Evan's answer, which is that it becomes implicit how to combine the 
> results of the multiple values to get the final true/false for the if 
> condition.  You imply "and", which is a perfectly reasonable choice.
>
> My main reason for responding is to let you know that if you really want 
> such behavior, macros let you roll your own without much trouble.
>
> Andy
>
> On Jan 3, 2013, at 10:24 PM, Edward Tsech wrote:
>
> Hey guys,
>
> if-let and when-let macros support only 2 forms in binding vector:
>
> (if-let [x 1 y 2]
>   ...)
> java.lang.IllegalArgumentExcepdtion: if-let requires exactly 2 forms in 
> binding vector(NO_SOURCE_FILE:1)
>
> Why doesn't "if-let" support any even amount of binding forms as "let" 
> does?
>
> e.g.
> (if-let [x 1 y 2 z 3]
>   (+ x y z)
>   0) ; => 6
>
> (if-let [x 1 y nil z 3]
>   (+ x y z)
>   0) ; => 0
>
> Thanks!
>
>
>

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

Reply via email to