common-lisp - 迭代 plist 并设置每个键的值

标签 common-lisp elisp

如何迭代 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/

相关文章:

lisp - 对 project euler 4 的 lisp 程序的反馈

emacs - 全局设置键,但排除特定模式

ruby - 用于构建列表的 elisp 数据结构/工作流程

Emacs 口齿不清 : get sub-matches from a regexp match

common-lisp - 在 Common Lisp 中测试一个变量是否包含一个函数

installation - 在 Quicklisp 中找不到文件

lisp - 普通 lisp 中 Nth 的问题

lisp - 为什么 CLISP 不能调用某些具有非内部名称的函数?

r - Emacs ESS 模式 TAB 停止缩进

Emacs:将功能分配给键绑定(bind),并重复按下,撤消最后一次按下并在更广泛的设置下重做