Clojure:为什么if-let只允许绑定向量中的2个表单?

nan*_*sen 6 clojure

当我使用if-let之类的时候

(if-let [a 2 b nil] (+ a b))
Run Code Online (Sandbox Code Playgroud)

我得到一个IllegalArgumentException:

clojure.core/if-let requires exactly 2 forms in binding vector...
Run Code Online (Sandbox Code Playgroud)

类似于when-let ...

这不是我所期望的.If-let可以尝试所有绑定并在一个失败时中断并评估else表达式.

同样的抱怨可以在clojuredocs的评论中找到.我在这里找到了一个并不真正满足的答案,因为海报似乎有一个等同于嵌套的if-let-structure的想法.

有什么理由限制*-let宏的绑定?

更新:由于似乎不清楚,我对if-let的期望是:

  • 它应该按顺序评估所有绑定.
  • 当一切都成功时,它应该评估'当时'的情况.
  • 如果一个绑定失败,它应立即打破并评估'else'案例.
  • 如果失败,绑定,即使是成功的绑定,也不应该在'else'表达式中可用

Art*_*ldt 3

if-letlet服务于不同的目的,if-let 不仅仅是 let 的更受限制的版本。of instance 的if-let不同之处let在于,该值仅绑定到 then 子句,而不绑定到 else。

user> (if-let [ans (+ 1 2 3)] ans :foo)   
6
user> (if-let [ans (+ 1 2 3)] ans ans)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: ans in this context, compiling:(NO_SOURCE_PATH:1)
user> (let [ans (+ 1 2 3)] ans ans)
6   
Run Code Online (Sandbox Code Playgroud)

if-let 的目的是让您在绑定值只是为了测试和使用它的情况下变得更轻松。