
lambda を let で包んであげると、クロージャを作ることができる。
;; (setf x (make-counter))
;; (funcall x)
;; -> 1
;; (funcall x)
;; -> 2
;; (funcall x :output t)
;; -> 2
(defun make-counter (&key (init 0))
(let ((cnt init))
(lambda (&key (output nil))
(if output
cnt
(incf cnt)))))
言い方を変えれば、let で包まれた関数を返す関数はクロージャということ。
