如何迭代 plist,提示每个键一个值并将该值填充到 plist 中?
我有我的项目的属性列表的“骨架”
(defconst project-properties
'(:number nil
:place nil
:location nil))
我复制此列表并填写值,以便保留一个框架列表并使用填充的列表来进一步处理它。
我设法为 alist 做到这一点,但无法更改功能以使其与 plist 一起使用。
(defun project-prompt-properties-alist ()
"Prompt for project properties and return them"
(let ((properties (copy-alist project-properties)))
(cl-loop for (prop . val) in properties
do (setf (alist-get prop properties) (read-string (format "Geef %s: " prop))))
properties))
最佳答案
Common Lisp 和 Elisp 都允许您使用 on
循环列表,它迭代列表的连续尾部,而不是 in
迭代列表的连续元素列表。例如:
CL-USER> (loop for tail on project-properties
do (format t "~A~%" tail))
(NUMBER NIL PLACE NIL LOCATION NIL)
(NIL PLACE NIL LOCATION NIL)
(PLACE NIL LOCATION NIL)
(NIL LOCATION NIL)
(LOCATION NIL)
(NIL)
您可以进一步使用 by
关键字将输入列表减少两个元素,而不是每次迭代时减少一个元素:
CL-USER> (loop for tail on project-properties by #'cddr
do (format t "~A~%" tail))
(NUMBER NIL PLACE NIL LOCATION NIL)
(PLACE NIL LOCATION NIL)
(LOCATION NIL)
您可以使用解构来获取每个尾部的前两个元素:
CL-USER> (loop for (prop val) on project-properties by #'cddr
do (format t "~A -> ~A~%" prop val))
NUMBER -> NIL
PLACE -> NIL
LOCATION -> NIL
这些功能在 Elisp 中的工作方式相同。您应该能够为 Elisp 编写 project-prompt-properties-plist
,如下所示:
(defun project-prompt-properties-plist ()
"Prompt for project properties and return them"
(let ((properties (copy-sequence project-properties)))
(cl-loop for (prop val) on properties by #'cddr
do (plist-put properties prop (read-string (format "Geef %s: " prop))))
properties))
关于common-lisp - 迭代 plist 并设置每个键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76876921/