我有这个功能:
((lambda (x) (x x))
(lambda (x) (x x)))
它产生一个无限循环。我的问题是关于记忆图。我们知道堆栈会溢出,因为我每次调用都会打开一个新帧。但是什么会在堆上?据我所知,在每次调用时都会在堆上创建一个新的闭包,但我不确定这一点。
答案 0 :(得分:5)
堆栈不会溢出,因为Scheme强制tail call optimization(或类似的东西)。没有创建新的调用框架。此外,只需要常量堆分配来执行此功能;解释器只需要评估两个lambda
表达式,产生两个闭包。
如果你想填补内存,请执行类似
的操作(let loop ((l 0))
(loop (cons l l)))