2011-05-06 64 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