1

我在 Mac 上使用 chez 9.5.4。

以下代码:

;; demo.ss
(map display (list "this " "is " "weird "))

做这个:

$ chez --script demo.ss
weird this is 

为什么意外的尤达?

我该如何防止这种情况?

它在鸡计划中按预期工作。

4

2 回答 2

2

正如 u/bjoli 在 reddit 上回答的那样

您的代码依赖于未指定的行为:地图的顺序未指定。

你想要每个。

Chez 没有堆栈溢出(如球拍或诡计)。用 map 做一个正确的折叠意味着最后没有 (reverse ...) 。它更快,除了在一些持续性繁重的代码中。

没有扩展堆栈优化的方案都做了左折叠。像鸡一样。

于 2021-07-13T15:20:22.477 回答
2

简短的回答是,这就是这样map做的。

根据 r7rs-small 规范,在https://small.r7rs.org/attachment/r7rs.pdf第 51 页:

proc 应用于列表 s 的元素的动态顺序是未指定的。

这是因为map旨在通过将纯函数应用于每个元素来转换列表。的唯一效果map应该是它的结果列表。

正如 divs1210 引用 u/bjoli 指出的那样,Scheme 还定义了一个执行您想要的操作的过程。事实上,for-each在 r7rs-small pdf 的同一页上进行了描述!它说:

for-each 的参数类似于 map 的参数,但 for-each 调用 proc 是为了它的副作用而不是它的值。与 map 不同,for-each 保证按从第一个元素到最后一个元素的顺序对列表 s 的元素调用 proc,并且 for-each 返回的值是未指定的。

于 2021-07-13T15:31:14.753 回答