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)
Jör*_*tag 13
这是Scheme的成语.在许多Scheme实现中,方括号可以与列表文字中的圆括号互换使用.在那些Scheme实现中,方括号通常用于区分参数列表,参数列表和S表达式或数据列表的绑定.
在Clojure中,括号和括号表示不同的东西,但它们在绑定声明中的使用方式相同.
fog*_*gus 11
Clojure非常努力地保持一致.没有技术上的原因与列表形式不可能一直在使用let,fn,with-open等......事实上,你可以创建自己my-let很轻松地使用一个替代.然而,除了明显突出外,矢量在形式上一致地使用意味着"这里有一些约束".你应该努力在你自己的代码中坚持这个理想.