scheme - 通过计划中的值(value)混淆

标签 scheme lisp pass-by-value sicp shallow-copy

考虑从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创建新环境时,它会绑定e3onx的值的副本?
2也就是说,y(现在)保存的值(在输入y的主体之后)是由f保存的lambda的副本?
三。所以我们现在有两个变量,global中的xx中的y,每个变量都包含一个引用e3中内容的过程?
四如果我是正确的,由e2x执行的过程是否像指向y的指针一样?

最佳答案

在传递值的情况下,将计算函数的参数,并将其值绑定到函数参数。
因此,如果参数是表达式,则对其求值并将值绑定到参数如果它是绑定到值的标识符,则该值绑定到参数。
如果一个值很简单,比如一个整数,那么这个整数就“复制”在新环境中分配的某个内存单元中,如果它是更复杂的东西,比如一个闭包(一个编译的函数),那么您可以认为这个对象的“引用”是在新环境中复制的。

关于scheme - 通过计划中的值(value)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694761/

相关文章:

data-structures - 流实现

haskell - Haskell 中何时需要 lambda 形式?

scheme - 在 Racket 中写负数

math - 如何解决 Lisp 中的负幂问题

c - 如何访问按值传递给函数的结构数组中的成员?

lisp - 如何从 Lisp 中的二叉搜索树中删除

lisp - SICP car/cdr练习题问题

java - 如何在选定的场景中实现按值传递?

Python:threading.Thread,值是按值传递还是按引用传递?

unicode - 以重音字符为键的 Common Lisp 哈希表