【发布时间】:2021-09-22 12:15:49
【问题描述】:
我在 Mac 上使用 chez 9.5.4。
以下代码:
;; demo.ss
(map display (list "this " "is " "weird "))
这样做:
$ chez --script demo.ss
weird this is
为什么是偶然的尤达?
如何防止这种情况发生?
它在鸡计划中按预期工作。
【问题讨论】:
标签: chez-scheme
我在 Mac 上使用 chez 9.5.4。
以下代码:
;; demo.ss
(map display (list "this " "is " "weird "))
这样做:
$ chez --script demo.ss
weird this is
为什么是偶然的尤达?
如何防止这种情况发生?
它在鸡计划中按预期工作。
【问题讨论】:
标签: chez-scheme
简短的回答是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 是因为它的副作用而不是 for 它的价值观。与map不同,for-each保证调用proc 从第一个元素开始按顺序排列列表 s 的元素 ment(s) 到最后,以及 for-each 返回的值 未指定。
【讨论】:
As answered by u/bjoli on reddit:
您的代码依赖于未指定的行为:地图的顺序未指定。
你想要每个人。
Chez 没有堆栈溢出(如球拍或诡计)。用 map 做一个正确的折叠意味着最后没有 (reverse ...) 。它的速度更快,除了一些需要大量延续的代码。
没有扩展堆栈优化的方案都做了左折叠。像鸡一样。
【讨论】: