【问题标题】:display working out of order in Chez Scheme在 Chez Scheme 中显示工作不正常
【发布时间】: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


    【解决方案1】:

    简短的回答是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 返回的值 未指定。

    【讨论】:

      【解决方案2】:

      As answered by u/bjoli on reddit:

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

      你想要每个人。

      Chez 没有堆栈溢出(如球拍或诡计)。用 map 做一个正确的折叠意味着最后没有 (reverse ...) 。它的速度更快,除了一些需要大量延续的代码。

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

      【讨论】:

      • 鸡肉也不会堆栈溢出,AFAIK。
      猜你喜欢
      • 2021-03-16
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2020-04-22
      • 2021-10-17
      • 1970-01-01
      • 2011-11-18
      • 2016-01-07
      相关资源
      最近更新 更多