I don't know if it will answer your history question, but there was a
fairly long discussion about this last year:

  
https://groups.google.com/forum/?fromgroups=#!searchin/clojure/let-else/clojure/1g5dEvIvGYY/EWjwFGnS-rYJ

Cheers,

Dave

On Fri, Jan 4, 2013 at 7:23 AM, Edward Tsech <edts...@gmail.com> wrote:
> 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 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

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