请在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这样的良好lint工具,它会警告您是否有任何未使用的绑定。

对于习惯了LISP的人来说,更改这可能会导致感觉很不舒服,并且使Clojure中的let与其他形式不一致。

by
也许还值得提一下,let的表达式体被一个隐式的do包起来,因此`(let [x 1 y 2])实际上是等同于`(let [x 1 y 2] (do))`,而`(do)`将会返回nil。
...