2024年Clojure调查中分享您的看法!

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

0
语法和读取器
目前无法将非引用拼接插入到文法映射中,除非该映射包含偶数个文法形式,即使其中一个是空引用(~@[])也不例外。

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

然而,在语法引用的环境中,映射文法并不一定要内部表示为映射,因为语法引用发出构建映射的代码,而不是映射本身。SyntaxQuoteReader 上的 syntaxQuote 方法甚至不操作映射,而是一个交错键和值的扁平序列。

借助元数据和 LispReader-global Var,我们可以追踪到一个语法引用中的元素集合最终会变成一个映射,并从 SyntaxQuoteReader 发出适当的代码形式。在元数据文法中有一个小的边缘情况,但通过包含原型映射的额外元数据,我们仍然可以在语法引用发出时生成适当的 (with-meta ...) 形式。

重要的是,所有手飞动作从未逃离读取器,而评估/编译环境也一无所知。

这允许以下操作

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

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

或者
{1} ;=> RuntimeException ...

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

我在补丁中的更改通过了所有现有测试,并包括了对新支持的映射非引用拼接形式的附加测试。

7 个答案

0

评论由:[email protected]发表

今天早上修改过了 - 增加了更多测试,同时修复了捕获到的新的错误。

0
by

评论由:[email protected]发表

更新了补丁。

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

0
by

评论由:hiredman发表

这似乎是个坏主意,从纯宏编写角度来看,它在某种程度上是有道理的,但是序列语录被用于宏之外,在这种情况下,这仅仅成为了规避重复键检查的迁回,我想在1.3左右,可能是1.4左右吧,这些检查被添加了。

http://dev.clojure.org/display/design/Allow duplicate map keys and set elements

0
by
_评论由:[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
by

评论由:hiredman发表

是的,抱歉,我把这个实现搞混了,与一个已经关闭的相关问题有关。你能提供一个激励的例子吗?我写了很多Clojure,并且没有在实践中发现这有任何问题,因此我不愿意放松这类限制。如果我们允许这种行为,那么语法引号绝对不能从阅读器中拉出来(可能还有其他行为使得这难以实现或不可能,我不是很确定),实际上语法引号必须在从阅读器中出来之前在数据上操作,而如果语法引号中的映射是“良好塑造”的,那么可能可以将语法引号(源读者的很多复杂性)从阅读器中移出,使其在已经读取进来的数据上操作。

我相信使语法引号成为一个后阅读器宏绝对不是任何形式的优先事项,但我只是提到它可能因为这种改变而关闭这扇门。我已经开始把与语法引号相关的一切都想成是添加数据之上的语法,这似乎是负面的。

所以,总的来说,这个行为我不是特别难受,而这个“修复”似乎可能有一些后续影响,所以一个好的激励例子会很好。

只是想提醒你,不要浪费时间考虑一个激发性的例子,我已经提出的所有功能都已经被确认,所以如果你忽略我,你很可能成功 :)

0

评论由:[email protected]发表

说真的,我已经忘记我提交了这个。我想这归结为优先考虑原则——映射的文本语义是否比概念的语义优先?在这个时候,我反对我以前的观点,我认为应该优先考虑的文本语义,就像它们目前做的那样。特别是在读者这方面。

0
...