欢迎!请查看关于页面了解该工作的更多信息。
对于从TANAL派生的静态分析工具,经常需要确定一个符号是用户定义的还是代码生成的结果。由于分析器依赖于Clojure核心进行评估和符号生成,因此希望注解生成的符号的用户必须目前提供一个绑定,将clojure.core/gensym替换为以下补丁等效的片段。这种重载对于TANAL、TE*或用户代码来说并不合适,因为它是对clojure.core行为的重定义,这种行为应该是标准的,而不是用大锤对付用户。
评论由:gtrak 创建
这最终可以帮助过滤掉来自CLJS中reify的定义的符号,如't131045'。我一直在autodoc-cljs的原型中看到这种行为,它最终可以 targeting tools.analyzer。
评论由:alexmiller 创建
关于这个补丁,为什么不调用接收元数据的Symbol构造函数,而不是使用with-meta?为了性能,也可能有用相同的常量映射。
评论由:arrdem 创建
因为编译器会发出元数据映射作为静态字段,所以当前的补丁会共享所有标记符号的相同映射实例。调用元数据构造函数是合理的,我会更新这个补丁。
所以Symbol的元数据构造函数是私有的,参见 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Symbol.java#L100。如果不直接修改这一点,就无法从核心构建带有元数据的符号。如果你担心使用with-meta引入元数据的var间接开销,但是在这种情况下,我们无理由地构建了两个符号。暴露目前私有的元数据构造函数可能是正确的修复方法,尽管它有自己的任务。
评论人:jafingerhut
从上面的评论来看,这似乎不是这个补丁的最终版本,不过作为信息,我发现的一些自动脚本能干净地应用于2014年6月9日的修改补丁patch 0001-Annotate-generated-symbols-with-metadata.patch,但截至2014年7月1日的最新Clojure master构建失败。
谢谢Andy,我会在早上重做并测试它
由于clojure.lang.Symbol/intern的工作,直接暴露和使用元数据构造函数没有意义。更新的补丁直接调用clojure.lang.Symbol/withMeta,而不是通过clojure.core/with-meta间接调用并承担调用var的性能损失。在我的系统上构建干净。
Reid,尽管JIRA可以处理同名多个附件,但对于某些人来说可能会有些混淆,对于一些用于确定哪些补丁适用以及测试的自动脚本来说,可能会有些麻烦。你介意重命名你的其中一个补丁吗?
这是对这个补丁的第三次也是最后一次修改。