目前,with-meta 无法用于 varargs 函数(这在 Clojure 中可以工作)
(apply (with-meta #(-> %&) {}) 0 1 2 (range 30))
鉴于 JS 的灵活性,我提出以下 meta 函数的实现方法
`
(defn meta-fn
[f m]
(let [new-f (goog/bind f #js{})]
(goog/mixin new-f f)
(specify! new-f IMeta (-meta [_] m))
new-f))
`
The goog/bind creates a copy, and the goog/mixin is for performance reasons (copy any IFn protocol or applyTo).
优点
- 有所提高的速度
- 代码更为简洁和小巧(MetaFn 的 20 个arity都在 .call, .apply, prototype.IFn 下发出 3 次)
- 支持 varargs。