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

欢迎!请查看关于页面,了解更多关于此功能的信息。

0 投票
ClojureScript

cljs.core.Var 实现 IWithMeta,这与 Clojure 中不包含不可变元数据的 vars 不同。with-meta 不应支持在 vars 上使用,仅应支持 alter-meta!。

与 Clojure 不同,ClojureScript 不使用 alter-meta! 的动态分派。cljs.core/alter-meta! 的实现将愉快地修改具有 "meta" 字段的任何对象的元数据,即使它不是 ref/var/其他标识符。这意味着,如果您想在自定义类型上拥有元数据,您必须有一个 "meta" 字段,而不是实现获取/修改元数据的方法。这并不理想,但对我来说并没有立即的问题。

我关心 IWithMeta 的原因是,我需要在值和引用类型之间区分元数据的处理。理想情况下,会有一个 IAlterMeta 协议,但是 (satisfies? IMeta x) 且 (not (satisfies? IWithMeta x)) 就足够了。在 JVM 中,可以使用 IMeta 和 IObj 做同样的事情。

2 答案

0 投票

评论者:mfikes

单元测试失败

ERROR 在 (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 报告)
...