欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。
对于源自 TANAL 的静态分析工具,确定符号是用户定义的还是代码生成结果是很有用的。由于分析工具依赖于 Clojure 内核进行评估和符号生成,因此希望注释生成的符号的用户目前必须提供一个绑定,替换 clojure.core/gensym 为以下补丁等价的片段。这种重载对于 TANAL、TE* 或用户代码来说并不合适,因为这是对 clojure.core 行为的重定义,这种行为应该是标准的,而不是像用大锤那样强加给用户。
评论由:gtrak 提供
这最终可能有助于筛选出由 CLJS 中的 reify 生成的定义的符号,例如 't131045。我在 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间接 costs,则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可以处理具有相同名称的多个附件,但这对人们来说可能会有些混乱,并且对于我的一些用于确定哪些补丁可以应用和干净测试的脚本来说,可能会有所不便。你能否改用一个补丁名称?
该补丁的第三次也是最后一次修改。