2024 Clojure 状态调查! 中分享您的想法。

欢迎!请访问关于页面以了解更多此网站的使用信息。

0
ClojureScript

目前 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 一起工作

1 个回答

0
参考: https://clojure.atlassian.net/browse/CLJS-2446(由 aralo 报告)
...