考虑从SICP中采取的以下步骤:
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance
(- balance amount))
balance)
"Insufficient funds")))
假设我说:
(define x (make-withdraw 100))
make-withdraw
返回名为(lambda (amount) ... )
的新环境中的过程(e2
)(包含变量balance
的绑定),并将该过程绑定到全局帧中的x
。现在,假设我打电话给:
(f x)
哪里
(define (f y) (y 25))
一我听说这个计划毫无价值这是否意味着当
f
创建新环境时,它会绑定e3
onx
的值的副本?2也就是说,
y
(现在)保存的值(在输入y
的主体之后)是由f
保存的lambda
的副本?三。所以我们现在有两个变量,global中的
x
和x
中的y
,每个变量都包含一个引用e3
中内容的过程?四如果我是正确的,由
e2
和x
执行的过程是否像指向y
的指针一样?
最佳答案
在传递值的情况下,将计算函数的参数,并将其值绑定到函数参数。
因此,如果参数是表达式,则对其求值并将值绑定到参数如果它是绑定到值的标识符,则该值绑定到参数。
如果一个值很简单,比如一个整数,那么这个整数就“复制”在新环境中分配的某个内存单元中,如果它是更复杂的东西,比如一个闭包(一个编译的函数),那么您可以认为这个对象的“引用”是在新环境中复制的。
关于scheme - 通过计划中的值(value)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694761/