我在 Mac 上使用 chez 9.5.4。
以下代码:
;; demo.ss
(map display (list "this " "is " "weird "))
这样做:
$ chez --script demo.ss
weird this is
为什么是意外的尤达?
我如何防止这种情况发生?
它在 Chicken Scheme 中按预期工作。
答案 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 返回的值 未指定。