【问题标题】:How to search through a plist repeatedly?如何反复搜索plist?
【发布时间】:2011-05-06 07:42:12
【问题描述】:

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

谢谢你:-)

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    (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")))
    

    【讨论】:

    • 我尝试使用格式 t,但我正在使用 ~&。感谢您提供详细的解决方案 - 有道理:-)
    【解决方案2】:

    只列出关键词:

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

    【讨论】:

    • 谢谢你,你的回答也很有效——自从他第一个回答以来,我把他归功于 matthias :-) 但我会支持你
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多