2013-04-30 47 views
1

我正在閱讀Practical Common Lisp,我在REPL中玩弄關閉(第6章)。我嘗試下面的代碼,我認爲使關閉的名單,但我無法弄清楚如何所有的人都在打電話的同時REPL:如何在Lisp函數列表中調用函數?

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

我讀過的答案,this question並試圖一些和其他一些,但似乎沒有任何工作。這是我已經嘗試過 -

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

可以使用mapcar代替map

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

但是,你會發現這個打印(11 10 10)而不是(11 9 10)。這是因爲由*fn*中的lambdas共享,因爲let範圍將它們全部包圍。

如果您希望count綁定到每個lambda中的不同變量,則必須爲每個lambda構建一個不同的let範圍。

+0

謝謝,這是非常有益的! – lightlike 2013-04-30 23:22:54

4
(funcall (first *fn*)) 

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

(map 'list #'funcall *fn*) 

(mapcar #'funcall *fn*)