当我使用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的期望是:
if-let并let服务于不同的目的,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 的目的是让您在绑定值只是为了测试和使用它的情况下变得更轻松。
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |