目前 with-meta 在 varargs 函数中不起作用(在 Clojure 中可以工作)
(apply (with-meta #(-> %&) {}) 0 1 2 (range 30))
鉴于 JavaScript 的灵活性,我建议以下元函数实现
`
(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))
`
goog/bind 创建一个副本,goog/mixin 只是出于性能考虑(复制任何 IFn 协议或 applyTo)。
优点
- 略快一些
- 代码更简单、更小(元Fn 的 20 个arity被发射了3次 (.call, .apply, prototype.IFn)
- 与 varargs 一起工作