1
  1. (define self-add
    (let ((x 0))
      (lambda ()
        (set! x (+ x 1))
        x)))
    

(自加) => 1

(自加) => 2

(自加) => 3

(自加) => 4

    2.
 (define self-add1
    (lambda ()
      (let ((x 0))
        (set! x (+ x 1))
        x)))

(自加1) => 1

(自加1) => 1

(自加1) => 1

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

4

3 回答 3

5

第一个函数定义了一个x具有初始值的局部变量0然后将 lambda 特殊形式绑定到名称self-add- 所以x被 lambda“包围”(这就是为什么我们说 lambda from 表现为闭包)并且将是相同的对于所有的调用self-add(你可以说它x被 记住了self-add),每次调用它的值x都会加一。

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

于 2012-07-01T15:21:57.183 回答
1

第一个功能是闭包。您在函数的词法范围内创建x变量,并且该变量在调用之间保持其值。

附加信息:

于 2012-07-01T14:53:08.813 回答
0

第一个函数是一个闭包,而第二个函数每次都简单地返回相同的函数,这使得 x = 0 然后加一个并返回结果。

于 2012-07-01T15:02:05.710 回答