方案中的内存分配和调用栈
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
返回的过程很可能存储在堆中,并且不与任何特定的调用帧相关联。
当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
返回的过程很可能存储在堆中,并且不与任何特定的调用帧相关联。