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

欢迎!请查看 关于 页面以了解如何使用本站的一些更多信息。

0
ClojureScript

cljs.core.Var 实现了 IWithMeta,这与 Clojure 中的 vars 不同,Clojure 中的 vars 没有不可变的元数据。vars 上不应支持 with-meta,只应支持 alter-meta!。

与 Clojure 不同,ClojureScript 不使用 alter-meta! 的动态分派。cljs.core/alter-meta! 的实现会愉快地修改任何具有 "meta" 字段的对象的元数据,即使它不是 ref/var/Whatever 的身份。这意味着,如果您想在自定义类型上添加元数据,您必须有一个 "meta" 字段,而不是为获取/设置元数据实现方法。这并不太理想,但对我来说不构成直接问题。

我关心 IWithMeta 的原因是我需要在值和引用类型之间区分元数据处理。理想情况下,还有一个 IAlterMeta 协议,但 (and (satisfies? IMeta x) (not (satisfies? IWithMeta x))) 已经足够。在 JVM 上,可以像 IMeta 和 IObj 一样做同样的工作。

2 答案

0

由 mfikes 制作评论

单元测试失败

ERROR in (test-1248) (core-advanced-test.js:64:417) 未在断言中捕获的异常。预期: nil 实际: #object[Error Error: No protocol method IWithMeta.-with-meta defined for type object: #'cljs.core/first]

0
参考: https://clojure.atlassian.net/browse/CLJS-2398 (由 bbloom 在报告中指)
...