我执行以下代码来仅检索 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 更“实用”的方法来做到这一点?
使用 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)