在 Chez Scheme 中显示工作无序

时间:2021-07-13 12:30:42

标签: chez-scheme

我在 Mac 上使用 chez 9.5.4。

以下代码:

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

这样做:

$ chez --script demo.ss
weird this is 

为什么是意外的尤达?

我如何防止这种情况发生?

它在 Chicken Scheme 中按预期工作。

2 个答案:

答案 0 :(得分:2)

As answered by u/bjoli on reddit

<块引用>

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

你想要 for-each。

Chez 没有堆栈溢出(如球拍或诡计)。对地图进行右折叠意味着没有(反向...)最后。它更快,除了一些需要大量延续的代码。

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

答案 1 :(得分: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 保证调用 proc 在列表 s 的元素上,从第一个元素开始- ment(s) 到最后,以及 for-each 返回的值 未指定。

相关问题