Scheme - 无限循环和内存

时间:2012-01-04 19:40:01

标签: scheme

我有这个功能:

((lambda (x) (x x))
 (lambda (x) (x x)))

它产生一个无限循环。我的问题是关于记忆图。我们知道堆栈会溢出,因为我每次调用都会打开一个新帧。但是什么会在堆上?据我所知,在每次调用时都会在堆上创建一个新的闭包,但我不确定这一点。

1 个答案:

答案 0 :(得分:5)

堆栈不会溢出,因为Scheme强制tail call optimization(或类似的东西)。没有创建新的调用框架。此外,只需要常量堆分配来执行此功能;解释器只需要评估两个lambda表达式,产生两个闭包。

如果你想填补内存,请执行类似

的操作
(let loop ((l 0))
  (loop (cons l l)))