欢迎!请查看关于页面,了解更多有关此如何运作的信息。
对于源自TANAL的静态分析工具,通常需要确定一个符号是用户定义的还是代码生成的结果。由于工具分析器依赖于Clojure核心进行评估和符号生成,因此希望注释生成的符号的用户必须目前提供一个绑定,用以下纠错修补程序等效片段替换clojure.core/gensym。这种重载对于TANAL、TE*或用户代码不合适,因为这是对clojure.core行为的重定义,这应该是标准的而不是用撬棍的用户。
评论由:gtrak
这最终可能有助于过滤掉来自CLJS中reify的def'd符号,如't131045。我一直在观察autodoc-cljs的验证概念中的core.async命名空间的行为,这最终可能针对tools.analyzer。
评论由:alexmiller
关于修补程序,为什么不调用接受元数据的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年6月9日的补丁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可以处理具有相同名称的多个附件,但这可能对人们来说有些 confusing,对于一些用于确定哪些补丁适用并干净测试的脚本来说,会有些麻烦。你能否改变一下你其中一个补丁的名字?
这是对这个补丁的第三和最后一次修改。