如何在Lisp中调用函数列表中的函数?

如何在Lisp中调用函数列表中的函数?,lisp,closures,common-lisp,Lisp,Closures,Common Lisp,我正在阅读实用的公共Lisp,我正在阅读REPL中的闭包第6章。我尝试了下面的代码,我认为这是一个闭包列表,但我不知道如何在REPL中同时调用所有闭包: (defparameter *fn* (let ((count 10)) (list #'(lambda () (incf count)) #'(lambda () (decf count)) #'(lambda () count)))) 我已经读过的答案,并尝试了一些和其他一些,但似乎没有

我正在阅读实用的公共Lisp,我正在阅读REPL中的闭包第6章。我尝试了下面的代码,我认为这是一个闭包列表,但我不知道如何在REPL中同时调用所有闭包:

(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的东西

谢谢你的帮助

您可以使用而不是地图:

(funcall (first *fn*))

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

(map 'list #'funcall *fn*)

(mapcar #'funcall *fn*)
但是,您会注意到这打印的是11 10 10,而不是11 9 10。这是因为count在*fn*中的lambda之间共享,因为let作用域将它们全部包含在内

如果要将count绑定到每个lambda中的不同变量,则必须为每个lambda构建一个不同的let作用域。

您可以使用而不是映射:

但是,您会注意到这打印的是11 10 10,而不是11 9 10。这是因为count在*fn*中的lambda之间共享,因为let作用域将它们全部包含在内


如果希望count绑定到每个lambda中的不同变量,则必须为每个lambda构建一个不同的let作用域。

谢谢,这非常有用!谢谢,这很有帮助!
CL-USER> (mapcar #'funcall *fn*)
(11 10 10)