2011-05-06 35 views
5

我努力學習LISP和我就要掛了一些基本的東西 -如何反覆搜索plist?

我通過列表要循環和查找從列表中值的plist值...

; here it just looks up the plist value 
(defun get-plist-value(x) (getf (list :a "1" :b "2") x)) 


; this is what i want to do, but it doesnt work 
; i have tried concatenating the ":" before the x value, but it didnt work either 
(loop for x in '(a b) do (get-plist-value x)) 

; this works 
(get-plist-value :a) 

謝謝你:-)

回答

7

(loop for x in '(a b) do (get-plist-value x))

這裏有兩個問題。

首先,符號a與符號:a不一樣(除非你在keyword包中,這是不太可能的),所以它將無法找到任何東西。同樣適用於b。其次,這將查找一個值,將其從get-plist-value調用返回,然後丟棄它,而不用做任何事情。如果要將所有找到的項目收集到新列表中並讓循環返回該列表,請使用collect而不是do;如果要輸出找到的項目,請使用類似do (format t "~&~A" (get-plist-value x));等等。

附錄:請注意,:a的打印表示中的冒號是如何打印符號的人工產物。冒號是包裝前綴,這表示該符號位於keyword包裝中。它是而不是是符號名稱的一部分,所以簡單地連接符號名稱不會有幫助。如果你想get-plist-value的名字來進行比較的符號,你可以不喜歡以下,雖然它可能不是最漂亮的可能的解決方案:

(defun get-plist-value (x) 
    (getf (list :a "1" :b "2") 
     (intern (symbol-name x) "KEYWORD"))) 
+0

我嘗試使用格式但是我正在嘲笑〜&。謝謝你的詳細解決方案 - 有道理:-) – schmoopy 2011-05-06 16:32:50

4

只需列出關鍵詞:

(loop for x in (list :a :b) 
     collect (get-plist-value x)) 
+0

謝謝你,你的答案也適用 - 我記得馬蒂亞斯,因爲他首先回答:-)但我會upvote雅 – schmoopy 2011-05-06 16:33:14