我正在尝试学习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)

谢谢你 :-)

最佳答案



这里有两个问题。

首先,符号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")))

关于lisp - 如何反复搜索plist?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5908279/

10-11 22:35
查看更多