我正在浏览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)))
在第7行,为什么不呢
(with-meta `(~@form ~x) (meta form))
amalloy.. 7
这几乎相当,但并不完全相同.考虑如果形式(错误)会发生什么()
.如上所述,此错误在编译时捕获,因为它是非法的评估(nil x)
.通过您提出的简化,错误将在运行时被注意到,或者可能永远不会在x
没有参数的情况下发生.
撇开正确性,它对可读性也更好,因为它强调将调用表单的第一个,其余作为参数.它的实现也是一个更好的对称性->
.
这几乎相当,但并不完全相同.考虑如果形式(错误)会发生什么()
.如上所述,此错误在编译时捕获,因为它是非法的评估(nil x)
.通过您提出的简化,错误将在运行时被注意到,或者可能永远不会在x
没有参数的情况下发生.
撇开正确性,它对可读性也更好,因为它强调将调用表单的第一个,其余作为参数.它的实现也是一个更好的对称性->
.