欢迎!有关如何使用本网站的更多信息,请参阅关于页面。
对于从TANAL派生的静态分析工具,经常需要确定一个符号是用户定义的还是代码生成的结果。由于分析器依赖于Clojure核心进行评估和符号生成,因此想要注释生成的符号的用户必须当前提供一个绑定,将clojure.core/gensym替换为以下补丁等效的片段。这样的重载对于TANAL、TE*或用户代码是不合适的,因为这是对clojure.core行为的重新定义,应该是标准的,而不是像撬棍一样的用户处理。
评论者:gtrak
这最终可能有助于过滤出来自CLJS中reify的'd131045等定义的符号。我在autodoc-cljs的证明概念中看到这种行为,这最终可能会针对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版本上构建。
谢谢Andy,我会在早上重新设计和测试它
由于clojure.lang.Symbol/intern的功能,公开和使用元数据构造函数似乎没有意义。更新的补丁直接调用clojure.lang.Symbol/withMeta而不是通过clojure.core/with-meta进行间接调用,并且会因调用Var而降低性能。在我的系统上可以顺利构建。
Reid,虽然JIRA可以处理相同名称的多个附件,但这可能会让人困惑,并且对于我确定哪些补丁可应用且可干净构建的一些脚本来说可能有点麻烦。您能否改一个补丁的名称?
此补丁的第三次也是最后一次修改。