如何反复搜索一个plist?

时间:2011-05-06 07:42:13

标签: lisp common-lisp

我正在努力学习LISP,而且我已经挂了一些基本的东西 -

我想遍历列表并从列表值中查找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)
谢谢你: - )

2 个答案:

答案 0 :(得分: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")))

答案 1 :(得分:4)

只需列出关键字:

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