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

Memory management 内存分配和方案中的调用堆栈,memory-management,scheme,callstack,Memory Management,Scheme,Callstack,当计算机运行方案代码时,如何设置和使用堆栈框架?此外,Scheme如何进行内存管理 例如,如果我在scheme中运行以下代码 (define add_func x (lambda (y) (+ x y)) (map (add_func 2) (cdr (list 1 2 3))) 那么,存储在内存中的add_func返回的函数在哪里。add_func是否存储在堆栈上?另外,(列表1 2 3)是否存储在与(cdr(列表1 2 3))相同的堆栈帧中?every()是否表示新的堆栈帧?方案

当计算机运行方案代码时,如何设置和使用堆栈框架?此外,Scheme如何进行内存管理

例如,如果我在scheme中运行以下代码

(define add_func x
    (lambda (y) (+ x y))

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

那么,存储在内存中的add_func返回的函数在哪里。add_func是否存储在堆栈上?另外,(列表1 2 3)是否存储在与(cdr(列表1 2 3))相同的堆栈帧中?every()是否表示新的堆栈帧?

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

您的
add_func
(以下我将根据传统的方案命名样式将其称为
add func
)定义不正确。我以为你是这个意思:

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

尽管Scheme没有指定如何在内存中存储内容,但由
add func
返回的过程很可能存储在堆中,并且与任何特定的调用帧都没有关联。

这些都不是由标准指定的,实现也各不相同。您可以在R.Kent Dybvig的方案中找到三种不同的实施策略。