这两个方案功能有什么区别


  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

请告诉我如何理解上述两个功能之间的区别?提前非常感谢!此致敬意。

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

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

第一个函数是闭包。在函数的词法范围内创建x变量,变量在调用之间保存其值。

附加信息:

  • http://en.wikipedia.org/wiki/Closure_(computer_science)
  • 什么是词汇范围?

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

最新更新