请分享您的想法在2024年Clojure调查中!

欢迎!有关本网站的更多信息,请参阅关于页面。

0
ClojureScript

目前,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。

1 答案

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