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

欢迎!请浏览 关于 页面,了解更多此网站的工作信息。

0

这更多是一个建议,不确定该在哪里发布。如果存在更好的论坛,请告诉我。

基本上我假设没有人会使用没有体部的 `let`。我能想到的唯一原因只是为了副作用,而 `do` 等方法更为合适。目前 `(let [x 1 y 2 z (+ x y)]) => nil`(而不是抛出规范错误,这难道是预期的有用法吗?为什么?)

无论如何,如果我的假设正确,那么我建议 `let` 返回最后一个分配的值,因此 `(let [x 1 y 2 z (+ x y)]) => 3`,即 `z`。这在我的眼中既方便又直观。这也特别适用于构建长度绑定表,基于相同的变量,只对于最后一个重要的变量,这需要一行特别的混乱缩进。

1 答案

+4

这种行为是预期的,与任何其他评估体部表单一样。返回值是体部的最后一个表达式。如果您想显式返回任何一个绑定,您必须这么做。这甚至在官方 Clojure 文档关于 `let 特殊形式的例子中有展现,见 https://clojure.org/reference/special_forms#let

如果你使用了一个好的代码检查工具,比如clj-kondo,它会警告你如果存在一些你未处理的绑定。

这会对习惯了Lisp的人来说非常不适,并且会使Clojure中的let形式与其它形式不一致。

by
可能还值得提一下,let语句的主体部分被一个隐式的do语句包围,所以'(let [x 1 y 2])实际上等价于'(let [x 1 y 2] (do))',并且'(do)'会返回nil。
...