欢迎!有关更多信息,请参阅关于页面。
对于从TANAL衍生出的静态分析工具,通常很有用确定一个符号是用户定义的还是代码生成的结果。由于工具分析器依赖于Clojure核心进行评估和符号生成,因此希望注释生成的符号的用户必须目前提供一个绑定,用以下补丁等价的片段替换clojure.core/gensym。这种重载对TANAL、TE*或用户代码来说是不合适的,因为它是对clojure.core行为的一种重定义,这应该是标准的,而不是受到需要镐头的用户的影响。
评论者:gtrak
这最终可以帮助过滤出像' t131045 这样的def'd符号,这些符号来自CLJS中的reify。我在autodoc-cljs的原型设计中看到这种行为,这最终可能针对tools.analyzer。
评论者:alexsilkier
关于补丁,为什么不调用带meta的Symbol构造函数,而不是with-meta?为了性能,使用相同的常量映射也可能是有用的。
评论者:arrdem
因为编译器将元数据映射作为静态字段发出,所以当前的补丁将共享所有注释符号的同一映射实例。调用元数据构造函数是合理的,我将更新补丁。
因此,Symbol的元数据构造函数是私有的,请参阅https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Symbol.java#L100。如果不直接更改,就无法从核心中构造具有元数据的符号。如果您担心通过with-meta添加元数据的变量间接化成本,那么with-meta是一个选项,然而,这样我们将无理由地创建两个符号。公开目前私有的元数据构造函数可能是正确的修复方法,姑且这一切都是一个条目。
评论者:jafingerhut
从上面的评论来看,这似乎不是补丁的最终版本,但只是为了信息,我找到了一些自动化脚本,这些脚本可以在截至2014年7月1日的最新Clojure master上干净地应用0001-Annotate-generated-symbols-with-metadata.patch补丁,但Clojure无法构建。
谢谢Andy,我将在早上重新设计和测试它
由于clojure.lang.Symbol/intern的工作方式,直接公开和使用元数据构造函数毫无意义。更新的补丁直接调用clojure.lang.Symbol/withMeta,而不是通过clojure.core/with-meta间接调用,从而避免了通过Var带来的性能损失。在我的系统上干净地构建。
Reid,虽然JIRA可以处理具有相同名称的多个附件,但这对人们来说可能会有些困惑,而且对我来说有一些建定哪些补丁可以干净地应用的脚本。您是否能将您的其中一个补丁重命名一下?
此补丁的第三次也是最后一次修改。