lig*_*ike 1 lisp closures common-lisp
我正在阅读Practical Common Lisp,我正在玩REPL中的闭包(第6章).我正在尝试下面的代码,我认为这是一个闭包列表,但我无法弄清楚如何在REPL同时调用所有这些代码:
(defparameter *fn*
(let ((count 10))
(list
#'(lambda () (incf count))
#'(lambda () (decf count))
#'(lambda () count))))
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这个问题的答案,并尝试了一些和其他一些,但似乎没有任何工作.这是我尝试过的 -
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>.
Run Code Online (Sandbox Code Playgroud)
我正在寻找的东西将打印出来(11 9 10).
谢谢你的帮助!
您可以使用mapcar而不是map:
CL-USER> (mapcar #'funcall *fn*)
(11 10 10)
Run Code Online (Sandbox Code Playgroud)
但是,您会注意到此打印(11 10 10)而不是(11 9 10).那是因为countlambdas之间共享*fn*,因为let范围将它们全部包含在内.
如果要count绑定到每个lambda中的不同变量,则必须let为每个lambda 构建不同的范围.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |