方案中的内存分配和调用栈

Memory allocation and the call stack in scheme

当Scheme代码被计算机运行时,它是如何设置和使用栈帧的?另外,Scheme是如何进行内存管理的?

例如,如果我要运行方案

中的以下代码
(define add_func x
    (lambda (y) (+ x y))

(map (add_func 2) (cdr (list 1 2 3)))

那么add_func返回的函数存放在内存的什么地方。 add_func 是否存储在堆栈中?此外,(list 1 2 3) 是否存储在与 (cdr (list 1 2 3)) 相同的堆栈帧中?每个 () 是否表示一个新的堆栈帧?

方案没有指定具体的内存管理策略或布局。特别是,可以实现 Scheme 在堆上分配 all 调用帧而不使用调用堆栈。事实上,将堆用于调用框架可以更容易地实现延续。

您的 add_func(我将在下文中按照传统的 Scheme 命名风格将其称为 add-func)定义不正确。我以为你是这个意思:

(define (add-func x)
  (lambda (y) (+ x y)))

虽然 Scheme 没有指定事物如何存储在内存中,但 add-func 返回的过程很可能存储在堆中,并且不与任何特定的调用帧相关联。