【发布时间】:2013-04-19 22:00:38
【问题描述】:
当我使用 if-let 时
(if-let [a 2 b nil] (+ a b))
我得到一个 IllegalArgumentException:
clojure.core/if-let requires exactly 2 forms in binding vector...
类似于当-让...
这不是我所期望的。 if-let 可以尝试所有绑定并在其中一个失败时中断并评估 else 表达式。
可以在clojuredocs 的 cmets 中找到相同的投诉。我找到了一个答案 here 并没有真正令人满意,因为海报似乎已经考虑到了嵌套的 if-let 结构。
有什么理由限制 *-let 宏的绑定?
更新: 似乎还不清楚,我对 if-let 的期望是:
- 它应该按顺序评估所有绑定。
- 当全部成功时,它应该评估'then'-case。
- 如果一个绑定失败,它应该立即中断并评估“else”情况。
- 如果绑定失败,即使是成功的绑定,也不应该在“else”表达式中可用
【问题讨论】:
-
你的 if-let 应该做什么并不是很明显。它是否应该在 let 子句中的第一个错误条目时失败?还是应该只测试第一个条目,如果是这样,评估其他 let 子句以在以下代码中使用?即把它当作一个嵌套函数: (if-let [a 2] (let [b nil] (+ a b))) - 我过去当然也想要这个结构......
-
@Korny:关于我的期望,请参阅我更新的问题。
标签: clojure