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

时间:2012-07-01 14:38:10

标签: scheme the-little-schemer

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

    (self-add)=> 1

         

    (self-add)=> 2

         

    (self-add)=> 3

         

    (self-add)=> 4

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

      (self-add1)=> 1

           

      (self-add1)=> 1

           

      (self-add1)=> 1

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

3 个答案:

答案 0 :(得分:5)

第一个函数定义一个局部变量x,初始值为0之后将一个lambda特殊形式绑定到名称self-add - 所以{ {1}}由lambda“封闭”(这就是为什么我们说lambda表现为closure)并且{em>相同用于x的所有调用(你可以说self-addx“记住”,每次调用时self-add的值都会增加一。

第二个函数将lambda绑定到过程,然后 在lambda中定义一个局部变量x - 每次x获取x时重新定义self-add1对于所有调用,将调用 :所以x永远不会被self-add1“记住”,并且每次调用过程时都会重新创建0,并使用{{1}进行初始化然后递增,始终返回值1

答案 1 :(得分:1)

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

其他信息:

答案 2 :(得分:0)

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