仅获取 plist 的键

Man*_*red 2 common-lisp

我执行以下代码来仅检索 plist 的键:

(loop :for (key nil) :on config :by #'cddr
      :collect key))
Run Code Online (Sandbox Code Playgroud)

运行此命令会产生:

CONFIG-TEST> (loop :for (key nil) :on '(:foo 1 :bar 2) :by #'cddr
                   :collect key)
(:FOO :BAR)
Run Code Online (Sandbox Code Playgroud)

有没有比使用 LOOP 更“实用”的方法来做到这一点?

cor*_*ump 5

使用 SERIES 包,scan-plist返回两个系列,一个用于键,另一个用于值:

(scan-plist '(:a 3 :b 2))
=> #Z(:A :B)
   #Z(3 2)
Run Code Online (Sandbox Code Playgroud)

您可以依靠它来收集第一个系列作为列表:

(collect 'list (scan-plist '(:a 3 :b 2)))
Run Code Online (Sandbox Code Playgroud)

更一般地,您可能希望以某种方式处理这些值,因此您可以使用mapping. 例如,这是一个plist-alist用 SERIES 制作的:

(defun plist-alist (plist)
  (collect 'list
    (mapping (((k v) (scan-plist plist))) (cons k v))))
Run Code Online (Sandbox Code Playgroud)