我正在浏览clojure.core的来源:
(defmacro ->>
[x & forms]
(loop [x x, forms forms]
(if forms
(let [form (first forms)
threaded (if (seq? form)
(with-meta `(~(first form) ~@(next form) ~x) (meta form))
(list form x))]
(recur threaded (next forms)))
x)))
Run Code Online (Sandbox Code Playgroud)
在第7行,为什么不呢
(with-meta `(~@form ~x) (meta form))
Run Code Online (Sandbox Code Playgroud)
这几乎相当,但并不完全相同.考虑如果形式(错误)会发生什么()
.如上所述,此错误在编译时捕获,因为它是非法的评估(nil x)
.通过您提出的简化,错误将在运行时被注意到,或者可能永远不会在x
没有参数的情况下发生.
撇开正确性,它对可读性也更好,因为它强调将调用表单的第一个,其余作为参数.它的实现也是一个更好的对称性->
.