Stack overflow despite tail call position but only in 64-bit 问题导致在 F# 编译器中发现 bug

阅读 answer 后,我很好奇导致发现错误的原因,因为我想更好地提高解决问题和理解 TCO 的技能。

最佳答案

我的推理是这样的:

在查看计算表达式时谈论“尾调用”可能会产生误导 - 一般情况下确实没有这样的事情(参见例如 this other answer 的一个相关讨论,尽管与序列表达式无关)。

因此,调用 gauss 本身不会使堆栈溢出,只有遍历它的代码才能使其溢出。但是一旦我看到调用代码就像 Seq.nth 一样,这意味着几乎可以肯定存在编译器错误,因为序列表达式中的“tail yield! ing”模式应该得到优化(不确定这是否是一部分规范,但我认为它是众所周知的)。因此,这只是看看初始复制的哪些部分是必要的。

用非递归定义替换原始代码中的循环会使重现停止失败,删除模式匹配也是如此。我没有发现查看 IL 有帮助(在序列表达式的编译中涉及很多编译器生成的机器),我只是尝试在源代码级别最小化再现并凭经验测试行为。

关于f# - 什么推理导致 `Sequence expression containing recursive definition is compiled incorrectly`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35799031/

10-13 07:32