Clojure中的Peg Thing示例:是否会出现堆栈溢出问题?

Clojure中的Peg Thing示例:是否会出现堆栈溢出问题?,clojure,Clojure,我正试图通过阅读《为勇敢和真诚的人而奋斗》一书来学习Clojure。在第五章中有一个示例程序“Peg Thing”。有关该问题的完整源代码,请访问 我的问题是,看起来函数在互相调用,堆栈随着每次移动而增长,直到你退出游戏。我说得对吗?所以,如果我们让一个机器人玩这个游戏数百万回合,在某个时候我们可能会得到堆栈溢出prompt move调用自身,但不调用recur。在成功的移动中,game over将被调用,如果用户想要玩更多的游戏,那么在当前堆栈帧的顶部将有更多堆栈。是我弄错了,还是这是以一种过

我正试图通过阅读《为勇敢和真诚的人而奋斗》一书来学习Clojure。在第五章中有一个示例程序“Peg Thing”。有关该问题的完整源代码,请访问


我的问题是,看起来函数在互相调用,堆栈随着每次移动而增长,直到你退出游戏。我说得对吗?所以,如果我们让一个机器人玩这个游戏数百万回合,在某个时候我们可能会得到堆栈溢出
prompt move
调用自身,但不调用
recur
。在成功的移动中,
game over
将被调用,如果用户想要玩更多的游戏,那么在当前堆栈帧的顶部将有更多堆栈。是我弄错了,还是这是以一种过于简单的方式实现的,作为一个演示,而实现者并不关心一百万次游戏的可能性?

你是对的——Clojure中有一些方法可以避免不断增长的堆栈(超越循环/重复,另请参见),但是查看代码时,它似乎没有使用它们。也就是说,请注意,我们要求堆栈溢出问题是自包含的;如果一个问题在没有链接的情况下无法得到回答(或者其答案无法被理解和帮助他人),那么这是不可接受的。这是一个很好的问题。我必须承认,我对这个示例代码有点失望。在阅读了前面章节“当然,你的程序必须有一些副作用……否则,运行它就没有意义了”。我想“啊哈-这是他们将向我们展示如何以clojure风格的方式改变状态的地方”,结果发现它只是依赖于在每个用户交互中越来越深入地递归,这在现实世界中不是一个明智的策略。你是对的--clojure中有一些方法可以避免不断增长的堆栈(超越循环/重现,另请参见),但是查看代码时,它似乎没有使用它们。也就是说,请注意,我们要求堆栈溢出问题是自包含的;如果一个问题在没有链接的情况下无法得到回答(或者其答案无法被理解和帮助他人),那么这是不可接受的。这是一个很好的问题。我必须承认,我对这个示例代码有点失望。在阅读了前面章节“当然,你的程序必须有一些副作用……否则,运行它就没有意义了”。我想“啊哈,这是他们将向我们展示如何以clojure式的方式改变状态的地方”,结果发现它只是依赖于在每个用户交互中越来越深入地递归,这在现实世界中不是一个明智的策略。