Scheme - infinte循环和内存

Ada*_* Sh 3 scheme

我有这个功能:

((lambda (x) (x x))
 (lambda (x) (x x)))
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*Foo 5

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

如果你想填补内存,做一些类似的事情

(let loop ((l 0))
  (loop (cons l l)))
Run Code Online (Sandbox Code Playgroud)

  • 不,Scheme不要求TCO.它确实要求正确的尾调用(PTC),即无限尾调用不能消耗无限内存.TCO是实施PTC的一种方式,但还有其他方法,例如"MTA上的切尼". (3认同)