关闭

函数记住它们定义的词法范围。因此,我们可以在 let 中包含一个 lambda 来定义闭包。

(defvar *counter* (let ((count 0))
                    (lambda () (incf count))))

(funcall *counter*) ;; => 1
(funcall *counter*) ;; = 2

在上面的示例中,计数器变量只能由匿名函数访问。在以下示例中可以更清楚地看到这一点

(defvar *counter-1* (make-counter))
(defvar *counter-2* (make-counter))

(funcall *counter-1*) ;; => 1
(funcall *counter-1*) ;; => 2
(funcall *counter-2*) ;; => 1
(funcall *counter-1*) ;; => 3