这就是正在发生的事情。首先,重要的是你要明白,当你写这个时:
(define (iter-list lst)
(let ((cur lst))
(lambda ()
...)))
它被转换成这个等价的形式:
(define iter-list
(lambda (lst)
(let ((cur lst))
(lambda ()
...))))
所以你看,另一个lambda
首先在那里。现在,最外面 lambda
的将定义一个局部变量,cur
它将“记住”列表的值,然后将返回最里面的lambda 作为结果,而最里面的lambda
“捕获”,cur
将上面定义的变量“包围”在一个闭包中。换句话说:iter-list
是一个函数,它返回一个函数作为结果,但在这样做之前它会“记住”这个cur
值。这就是为什么你这样称呼它:
(define il2 (iter-list '(1 2))) ; iter-list returns a function
(il2) ; here we're calling the returned function
将其与此处发生的情况进行比较:
(define (iter-list lst)
(let ((cur lst))
...))
以上等价于:
(define iter-list
(lambda (lst)
(let ((cur lst))
...)))
在上面,iter-list
只是一个函数,它会在调用时返回一个值(不是另一个函数,就像以前一样!),这个函数不会“记住”任何东西,并在被调用后立即返回。总结一下:第一个示例创建一个闭包并记住值,因为它返回一个函数,而第二个示例只返回一个数字,并像这样调用:
(define il2 (iter-list '(1 2))) ; iter-list returns a number
(il2) ; this won't work: il2 is just a number!
il2 ; this works, and returns 1