欢迎!请查阅关于页面以获取有关此工作的更多信息。
对于源自 TANAL 的静态分析工具,经常需要确定一个符号是用户定义的还是代码生成的结果。由于分析工具依赖于 Clojure 内核进行评估和符号生成,因此希望为生成的符号添加注释的用户必须目前提供绑定,以clojure.core/gensym替换为以下补丁等价的代码段。这种重载对于 TANAL、TE* 或用户代码来说不合适,因为它是对 clojure.core 行为的重定义,应该是标准的而不是用撬棍施加给用户。
评论者:gtrak
这最终可能有助于筛选出来自 CLJS 中 reify 的 't131045 等符号。我一直在自动文档化 CLJS 的原型中看到这种行为,它最终可能针对 tools.analyzer。
评论者:alexmiller
关于补丁,为什么不调用带元数据的符号构造函数而不是 with-meta?为了性能,可能也有必要使用相同的常量映射。
评论者:arrdem
因为编译器会将元图作为静态字段发出,所以当前的补丁会将标注符号共享同一个实例。调用元数据构造函数是合理的,我将更新补丁。
因此,Symbol 的元数据构造函数是私有的,请参见 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Symbol.java#L100。如果不直接修改,从核心无法创建带有元数据的符号。如果您担心通过 with-meta 添加元数据时的 var 中转开销,with-meta 是一个选项,然而那时我们在没有理由的情况下构建了两个符号。公开当前私有元数据构造函数可能是正确的修复,但这是一个独立的工单。
评论者:jafingerhut
从上面的评论来看,这个补丁不是一个最终版本,但是为了告知信息,我发现的一些自动化脚本能将 2014年6月9日的补丁 patch 0001-Annotate-generated-symbols-with-metadata.patch 清洁地应用到 2014年7月1日最新的 Clojure master,但 Clojure 无法构建。
感谢 Andy,我将在早上重新设计和测试
由于 clojure.lang.Symbol/intern 的工作方式,公开和直接使用元数据构造函数是没有意义的。更新的补丁直接调用 clojure.lang.Symbol/withMeta 而不是通过 clojure.core/with-meta 间接调用,从而避免了通过 Var 调用的性能损失。在我的系统上能干净地构建。
Reid,尽管 JIRA 可以处理具有相同名称的多个附件,但这可能会让人有些困惑,而且对于我用来确定哪些补丁可以应用和干净测试的一些脚本来说也是这样。您能否改一个补丁的名字?
此补丁的第3次也是最后一次修改。