我有这个功能:
((lambda (x) (x x))
(lambda (x) (x x)))
Run Code Online (Sandbox Code Playgroud)
它会产生无限循环.我的问题是关于记忆图.我们知道堆栈会溢出,因为我每次调用都会打开一个新帧.但是什么会在堆上?据我所知,在每次调用时都会在堆上创建一个新的闭包,但我不确定.
堆栈不会溢出,因为Scheme要求尾部调用优化(或类似的东西).没有创建新的调用框架.此外,只需要常量堆分配来执行此功能; 解释器只需要评估两个lambda表达式,产生两个闭包.
如果你想填补内存,做一些类似的事情
(let loop ((l 0))
(loop (cons l l)))
Run Code Online (Sandbox Code Playgroud)