为什么要求矢量?

Jas*_*ker 14 lisp macros clojure let

在我向一个不熟悉clojure的同事解释一些clojure代码之前,我从未真正考虑过这个问题.let当他问你为什么使用向量来声明绑定而不是列表时,我向他解释.我对他没有真正的答案.但该语言确实限制您使用列表:

=> (let (x 1) x)
java.lang.IllegalArgumentException: let requires a vector for its binding (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)

这究竟是为什么?

Ray*_*yne 26

我想,大部分是可读性.无论何时在Clojure中需要绑定,都会使用矢量.很多人都认为绑定的向量可以使事情更好地流动,并且更容易识别绑定是什么以及正在运行的代码是什么.

纯娱乐:

user=> (defmacro list-let [bindings & body] `(let ~(vec bindings) ~@body))
#'user/list-let
user=> (macroexpand-1 '(list-let (x 0) (println x)))
(clojure.core/let [x 0] (println x))
user=> (list-let (x 0 y 1) (println x y))
0 1
nil
Run Code Online (Sandbox Code Playgroud)

  • 使用文字向量也可以清楚地表明它不是函数调用.list-let有效,但您必须知道第一个列表未正常评估.一旦你有文字向量语法,你也可以利用它. (5认同)
  • 我投票给这个答案,因为它击败我的2分钟**和**有代码!不错的表演! (4认同)
  • 是的,Hickey在他的...并发性谈话中提到了可读性原因,我认为是. (3认同)

Jör*_*tag 13

这是Scheme的成语.在许多Scheme实现中,方括号可以与列表文字中的圆括号互换使用.在那些Scheme实现中,方括号通常用于区分参数列表,参数列表和S表达式或数据列表的绑定.

在Clojure中,括号和括号表示不同的东西,但它们在绑定声明中的使用方式相同.


fog*_*gus 11

Clojure非常努力地保持一致.没有技术上的原因与列表形式不可能一直在使用let,fn,with-open等......事实上,你可以创建自己my-let很轻松地使用一个替代.然而,除了明显突出外,矢量在形式上一致地使用意味着"这里有一些约束".你应该努力在你自己的代码中坚持这个理想.