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 で包まれた関数を返す関数はクロージャということ。
 
 
 

§1544 · Posted By · 4月 27, 2014 · Development · Tags: , , , , · [Print]