2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多有关如何使用本页面的信息。

0
语法和读取器
目前,除非映射包含偶数个文本文档,否则无法将非引用拼接插入到映射中,即使其中一个是null非引用(~@[])也是一样。

例如:`{~@[1 2]} ;=> RuntimeException 映射文本文档必须包含偶数个形式 clojure.lang.Util.runtimeException (Util.java:219)

然而,在语法引用的上下文中,映射文本文档不需要在内部表示为映射,因为语法引用发出的是构建映射的代码,而不是映射本身。SyntaxQuoteReader上的syntaxQuote方法甚至不操作映射,而是操作交替排列的键和值的扁平序列。

借助元数据和LispReader全局Var,我们可以跟踪语法引用内的元素集合将成为映射,并从SyntaxQuoteReader发出正确的代码形式。在元数据文本文档中有一个小的边缘情况,但通过包含proto-map的额外元数据,我们仍然可以在语法引用发出时生成适当的(with-meta ...)格式。

重要的是,所有涉及的手势从未逃离读取器,eval/compile环境对此一无所知。

这允许以下操作

`{~@[1 2]} ;=> 在eval之后: {1 2}
`^{~@[:foo :bar]} sym ;=> sym在eval后的元数据: {:foo :bar}

但不能
`~{1} ;=> RuntimeException ...


{1} ;=> RuntimeException ...

并且 `{~@[1]} 与当前需要的形式 `{~@[1] ~@[]}` 有相同的语义
;=> IllegalArgumentException 没有为键:1 提供的值 clojure.lang.PersistentHashMap.create (PersistentHashMap.java:77)

补丁中的更改通过了一切现有的测试,并包括了对新的支持映射非引用拼接形式的额外测试。

7 答案

0

评论由:[email protected] 发表

从今早开始修改 - 更多测试,以及针对新捕获到的案例的bug修复。

0

评论由:[email protected] 发表

更新了补丁。

现在使用两个不同的路径来添加元数据。旧版本可能堆叠了-with-meta 调用,这可能导致丢失键。

0

评论者:hiredman

这似乎是个不好的主意,从宏观编写的角度来看,似乎是合理的,但是语法引用在宏之外使用,这时候这仅仅成了绕过所添加的重复键检查,我相信是在1.3左右可能1.4的时候

http://dev.clojure.org/display/design/允许重复的图映射键和集合元素

0
_评论者:[email protected]_

实际上,unquote-splicing 已经绕过了重复键检查,因为它扩展为 (apply hash-map ...) 调用。

Clojure 1.7.0-alpha2 中

用户> `{~@[:foo :bar :foo :bar] ~@[]}
;=> {:foo :bar}
用户>`{~@[:foo :bar :foo :bar] ~@[]}
;=> (clojure.core/apply clojure.core/hash-map (clojure.core/seq (clojure.core/concat [:foo :bar :foo :bar] [])))
0

评论者:hiredman

是的,对不起,我把这个问题搞混了,与一个已关闭的相关问题相混淆。你有没有什么动机性的例子?因为我写了不少 Clojure,还未发现它在实践中是个问题,我对放松这类约束持谨慎态度。如果我们允许这种行为,那么语法引用就绝对不能从读取器中提取(可能还有其他行为使其变得困难或不可能,我不确定),实际上语法引用必须在从读取器提取之前就操作数据,而如果使用在语法引用中的映射是“有效的”,可能可以将语法引用(读取器中的复杂性来源)从读取器中移除,并对其已读取的数据进行操作。

我几乎100%确信使语法引用成为后读取器宏并不是任何形式的优先任务,但我只是提到,由于这些类型的变更,这种类型的后续东西可能会关闭大门,我已经开始思考任何与语法引用有关的内容,而不仅仅是数据,这看起来是消极的。

所以,我对这种行为并不感到太多痛苦,并且这个“修复”可能会有一些后续的影响,所以一个好的动员示例将是好的。

只是想警告你不要浪费时间想出一个激励性的例子,我所反对的每一个特性都已经提交,所以如果你忽略我,你真的有机会成功 :)

0

评论由:[email protected] 发表

说实话,我已经忘记了提交这个。我想这归结于优先考虑原则——映射的文义语义优先于概念语义吗?在这个点上,我反对我以前的观点,我认为映射的文义语义应该优先,就像现在这样。尤其是在这是对读者来说。

0
...