2013-04-30 2 views
1

실용 커먼 리스프를 읽고 있는데, 나는 REPL에서 클로저 (6 장)를 가지고 놀고있다. 나는 폐쇄의 목록을 만드는 생각에 다음 코드를 시도했다, 그러나 나는 동시에 REPL에서 그들 모두를 호출하는 방법을 알아낼 수 없습니다 : 나는 this question에 대한 답변을 읽고 시도했습니다Lisp의 함수 목록에서 함수를 어떻게 호출합니까?

(defparameter *fn* 
    (let ((count 10)) 
    (list 
     #'(lambda() (incf count)) 
     #'(lambda() (decf count)) 
     #'(lambda() count)))) 

몇 가지와 다른 몇 가지,하지만 아무것도 작동하는 것 같습니다. 내가 시도한 것은 -

CL-USER> (apply #'funcall *fn*) 
; Evaluation aborted on #<CCL::TOO-MANY-ARGUMENTS #x2100B8890D>. 
CL-USER> (funcall *fn*) 
; Evaluation aborted on #<TYPE-ERROR #x2100B5667D>. 
CL-USER> (loop for function in *fn* 
     (collect (funcall function))) 
; Evaluation aborted on #<CCL::SIMPLE-PROGRAM-ERROR #x2100C21D4D>. 
CL-USER> (map #'funcall *fn*) 
; Evaluation aborted on #<CCL::TOO-FEW-ARGUMENTS #x2100B7320D>. 

내가 찾고있는 것은 인쇄 할 내용 (11 9 10)입니다.

도움 주셔서 감사합니다.

답변

6

당신은 map 대신 mapcar를 사용할 수 있습니다

CL-USER> (mapcar #'funcall *fn*) 
(11 10 10) 

그러나이 (11 10 10) 대신 (11 9 10) 인쇄 알 수 있습니다. 그 이유는 count*fn*의 람다간에 공유되기 때문입니다. let 범위가이 모든 것을 포함하기 때문입니다.

count을 각 람다의 다른 변수에 바인딩하려면 각 람다마다 고유 한 let 범위를 만들어야합니다.

+0

감사합니다. 매우 도움이되었습니다. – lightlike

4
(funcall (first *fn*)) 

(loop for f in *fn* collect (funcall f)) 

(map 'list #'funcall *fn*) 

(mapcar #'funcall *fn*) 
관련 문제