闭包

我的理解:在一个函数或者某个语句块中可以定义或返回另一个函数,这个函数会依赖于包括它的函数或语句的某些变量,这个变量的传递就叫做闭包。

正规定义:当函数引用到外部定义的变量时,这外部定义的变量称为自由变量(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的说明:你可以使用全局计数器来做到同样的事情,但这样子使用计数器,可以保护计数被非预期的引用。

posted @ 2012-12-21 10:56  flowjacky  阅读(146)  评论(0)    收藏  举报