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