Как искать через плист повторно? - PullRequest
5 голосов
/ 06 мая 2011

Я пытаюсь выучить 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 ]

7 голосов
/ 06 мая 2011

(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")))
4 голосов
/ 06 мая 2011

Просто перечислите ключевые слова:

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