0
(defparameter *objects* '(whiskey bucket frog chain))

(defparameter *object-locations* '((whiskey living-room)
                                   (bucket living-room)
                                   (chain garden)
                                   (frog garden)))

(defun objects-at (loc objs obj-locs)
  (labels ((at-loc-p (obj)
             (eq (cadr (assoc obj obj-locs)) loc)))
    (remove-if-not #'at-loc-p objs)))

(objects-at 'living-room *objects* *object-locations*)

(WHISKEY BUCKET)REPLで戻ります。

どのようobjに受け継がれていat-loc-pますか?のパラメータはどれもobjects-at名前が付けられていませんobj

4

2 に答える 2

1

のパラメータはどれもobjects-at名前が付けられていませんが、のパラメータのobj1つ(実際には唯一のパラメータ)はat-loc-pです。したがって、at-loc-pが引数(によって)で呼び出されると、その引数は名前remove-if-notで渡されます。at-loc-pobj

于 2012-10-18T15:30:14.473 に答える
0

labels関数を定義します。それで

(labels ((square (x) (* x x))) (square 2))

と同じです

(let ((square (lambda (x) (* x x)))) (funcall square 2))

x(この例では、)は()関数objのパラメーターの名前にすぎません。squareat-loc-p

関数を書く別の方法objects-at

(defun objects-at (loc objs obj-locs)
  (defun at-loc-p (obj)
    (eq (cadr (assoc obj obj-locs)) loc))
  (remove-if-not #'at-loc-p objs)))

ただし、これは関数をグローバルに定義しますat-loc-p

于 2012-10-18T15:30:48.247 に答える