關閉

函式記住它們定義的詞法範圍。因此,我們可以在 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