我的理解:在一个函数或者某个语句块中可以定义或返回另一个函数,这个函数会依赖于包括它的函数或语句的某些变量,这个变量的传递就叫做闭包。
正规定义:当函数引用到外部定义的变量时,这外部定义的变量称为自由变量(free variable)。函数引用到自由的词法变量时,称之为闭包(closure)。
CL-USER> (defun add-to-list (num lst)
(mapcar #'(lambda (x)
(+ x num))
lst))
ADD-TO-LIST
CL-USER> (add-to-list 5 '(1 2 3))
(6 7 8)
CL-USER> (let ((counter 0))
(defun reset ()
(setf counter 0))
(defun stamp ()
(setf counter (+ counter 1))))
STAMP
CL-USER> (list (stamp) (stamp) (reset) (stamp))
(1 2 0 1)
;对示例2的说明:你可以使用全局计数器来做到同样的事情,但这样子使用计数器,可以保护计数被非预期的引用。