欢迎!请参阅关于页面以获取更多关于此内容的信息。
对于从 TANAL 派生的静态分析工具,确定一个符号是用户定义的还是代码生成的结果通常非常有用。因为分析器依赖于 Clojure 核心来评估和生成符号,所以想要注释生成符号的用户必须目前提供一个新的绑定,用以下补丁的代码段替换 clojure.core/gensym。这种重载对 TANAL、TE* 或用户代码来说不合适,因为它是对 Clojure 核心行为的重新定义,应该标准化,而不是强行施加于用户。
评论由:gtrak 撰写
这最终可以帮助过滤出来自 reify 的 def'd 符号,如 CLJS 中的 't131045。我在 autodoc-cljs 的一个 prototypes 中看到了这种行为,这最终可能针对 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主分支,但Clojure构建失败。
谢谢Andy,我将在早上重新设计和测试它
由于clojure.lang.Symbol/intern的工作原理,直接公开和调用元数据构造函数没有意义。更新的补丁直接调用了clojure.lang.Symbol/withMeta,而不是通过clojure.core/with-meta间接调用,避免了通过Var调用时的性能损失。在我的系统上可以干净地构建。
Reid,尽管JIRA可以处理同名多个附件,但对人们来说可能有点令人困惑,而且对于我用来确定适用哪些补丁并干净测试的一些脚本来说也是这样。你介意更改你其中一个补丁的名称吗?
对该补丁的第三次也是最后一次修改。