Emacs lisp,如何动态创建引用表达式,包括像`?1`这样的特殊字符?

Emacs lisp, how to dynamically create quoted expression including special chars like `?1`?

我想动态创建一个字符列表以用于 read-char-choice。从这个 answer 的类似问题中,如何以不带引号的值作为选项以编程方式构建列表,?1 使用函数。我最终得到的函数是

(defun prompt-list (name-list)
  "docstring"
  (let ((names name-list)
        (name-num 1)
        (choice-list (list)))
    (dolist (x names)
      (add-to-list 'choice-list
                   `(,name-num ;; in that part how to create the ?1, ?2 but dynamically
                     ,x (lambda () (setq project-headers x))))
      (setq name-num (+ 1 name-num)))
    choice-list))

当我尝试 运行 它时 returns 错误:Format specifier doesn’t match argument type。 根据我的理解,它需要一个 char 类型,所以我的问题是如何以编程方式生成 char 类型?

?1 是字符 '1' 的读取语法,它的整数值为 49。您可以使用读取语法来初始化 name-num 变量,而不是使用整数 1:

(defun prompt-list (name-list)
  "docstring"
  (let ((names name-list)
        (name-num ?1)
        (choice-list (list)))
    (dolist (x names)
      (add-to-list 'choice-list `(,name-num
                                  ,x (lambda () (setq project-headers ',x)))
                   t)
      (setq name-num (+ 1 name-num)))
    choice-list))

有几点需要注意:

  1. 您希望在设置 project-headers 时使用 ,x,而不仅仅是 x,因为后者在调用 lambda 时将无效。
  2. 你想在构建时附加到 choice-list,这就是上面 add-to-list 的最后一个 t 参数所做的,否则你的 read-char-choice 提示将是以相反的顺序。