1

Practical Common 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)。

ご協力いただきありがとうございます!

4

2 に答える 2

6

の代わりにmapcarを使用できますmap

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

(11 10 10)ただし、これはではなく印刷され(11 9 10)ます。これは、countが のラムダ間で共有されているためです。これは*fn*letスコープがそれらすべてを囲んでいるためです。

count各ラムダで異なる変数にバインドする場合は、ラムダごとに個別のスコープを構築する必要がありますlet

于 2013-04-30T19:22:58.883 に答える
4
(funcall (first *fn*))

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

(map 'list #'funcall *fn*)

(mapcar #'funcall *fn*)
于 2013-04-30T19:21:52.550 に答える