2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面了解有关此网站的一些更多信息。

0 投票

这更像是一个建议,但不确定该在哪里发布。如果存在更好的论坛,请为我提供链接。

基本上我假设没有人使用没有主体的 `let`。我能想到的唯一原因是纯粹为了副作用,而 `do` 等操作符更为合适,并且目前 `((let [x 1 y 2 z (+ x y)]) => nil)`(而不是抛出规范错误,因为如果这被视为有用的预期行为?但为什么?)

无论如何,如果我的假设是正确的,那么我建议 `let` 返回最后一个分配的值,即 `[[x 1 y 2 z (+ x y)]] => 3`,也就是 `z`。这在我的眼里既舒适又直观。这也特别适用于只有到最后一个变量才重要的长时间绑定形式,而这需要一整行的特殊样式缩进只是为了它。

1 答案

+4 投票

这种行为是期望的,就像任何其他评估主体的形式一样。返回值是主体中的最后一个表达式。如果您想返回其中一个绑定,必须明确这样做。这甚至在官方 Clojure 文档中有关 `let` 特殊形式的示例中也显示出来,在 https://clojure.org/reference/special_forms#let

如果您使用的是像 clj-kondo 这样的良好 linter,则它会在您有任何未使用的绑定时警告您。

改变这一点可能会对习惯于 LISPs 的人来说非常震动,并且使 Clojure 中的 let 与其他形式不一致。

by
可能还值得提到的是,let 的主体被隐式地包裹在一个 do 中,所以 (let [x 1 y 2]) 实际上等同于 (let [x 1 y 2] (do)),而 (do) 会返回 nil。
...