gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:27 25 4
gpt4 key购买 nike

我正在阅读 Practical Common Lisp,并且正在研究 REPL 中的闭包(第 6 章)。我正在尝试以下代码,我认为它列出了闭包,但我无法弄清楚如何在 REPL 中同时调用所有闭包:

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

感谢您的帮助!

最佳答案

您可以使用 mapcar而不是 map:

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

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

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

关于lisp - 在 Lisp 中如何调用函数列表中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16307306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com