欢迎!有关此功能的更多信息,请参阅关于页面。
对于从 TANAL 派生的静态分析工具,确定一个符号是用户定义的还是代码生成的结果往往很有用。因为工具分析器依赖于 Clojure 核心来评估和生成符号,所以希望注解生成符号的用户目前必须提供绑定,用一个等同于以下补丁的片段替换 clojure.core/gensym。这种过度使用对 TANAL、TE* 或用户代码来说并不合适,因为它是对 clojure.core 行为的重定义,应该标准化而不是强加给用户。
评论者:gtrak
这最终有助于筛选出自 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添加元数据引起的var间接开销,则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调用带来的性能损失。我的系统上可以干净地构建。
赖德,尽管 JIRA 可以处理同名多个附件,但它可能会让人感到有些困惑,对我来说,在我的用于确定哪些补丁可以应用和测试cleanly的脚本中。你介意更改你其中一个补丁的名称吗?
本补丁的第三次(也是最后一次)修改。