这两个Scheme函数有什么区别?

abe*_*008 1 scheme the-little-schemer

  1. (define self-add
    (let ((x 0))
      (lambda ()
        (set! x (+ x 1))
        x)))
    
    Run Code Online (Sandbox Code Playgroud)

(自我添加)=> 1

(自我添加)=> 2

(自我添加)=> 3

(自我添加)=> 4

    2.
 (define self-add1
    (lambda ()
      (let ((x 0))
        (set! x (+ x 1))
        x)))
Run Code Online (Sandbox Code Playgroud)

(self-add1)=> 1

(self-add1)=> 1

(self-add1)=> 1

请告诉我如何理解上述两个功能之间的区别?非常感谢提前!最好的祝福.

Ósc*_*pez 5

第一个函数定义了一个局部变量x与初始值0事后绑定一个lambda特殊形式的名称self-add-这样x的"封闭"由氧(这就是为什么我们说,从表现为拉姆达关闭),也将是相同的对于所有的调用self-add(你可以说是x被"记住" self-add),每次调用它时,值x都会增加1.

第二个函数将lambda绑定到过程,然后在lambda中定义一个局部变量x- 这里x每次self-add1调用时都会重新定义,并且对于所有调用都将是不同的:所以x永远不会"记住" self-add1并且每次重新创建过程都会重新创建被调用,初始化0然后递增,总是返回值1.