2012-10-18 32 views
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*) 

在REPL中返回(WHISKEY BUCKET)CL - 如何將obj參數傳遞給標籤函數?

obj如何進入at-loc-pobjects-at的參數都沒有名爲obj

回答

1

objects-at參數沒有被命名爲obj,但at-loc-p的參數之一(實際上的唯一參數)。所以當at-loc-p被一個參數(remove-if-not)調用時,該參數將被傳遞到at-loc-p,其名稱爲obj

+0

Doooh,沒有注意到它用objs作爲標籤後面的參數調用該函數。感謝您的簡要解釋。 – deadghost

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

+0

請注意,儘管在上一段代碼片段中,您將'at-loc-p'定義爲從'objects-at'外部可見的全局函數。這與標籤不同。 – sepp2k

+0

@ sepp2k:好點。我被計劃寵壞了。 –