如何在emacs中使用defvar构建列表

coo*_*ate 6 lisp emacs elisp list

我使用这样的代码:

(defvar my-defvar "test")
(completing-read "input: " '("1" "2" my-defvar))
Run Code Online (Sandbox Code Playgroud)

然后M-x eval-region.我my-defvar在迷你缓冲区中得到了"1","2" .

我的问题是如何my-defvar在列表中转换为字符串.

Lin*_*cer 12

在Lisp中,´-symbol将引用表达式的其余部分.这意味着该值将完全按照写入的方式表达,不评估函数调用,不替换变量值等.

最直接的方法是list在评估它的参数后使用创建元素列表的函数,例如:

(completing-read "input: " (list "1" "2" my-defvar))
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用引用语法,如另一个答案所示.这可以让你引用一个复杂的表达式,但所享有(即评估),它的一部分.但是,在这个简单的案例中,我认为这不是适合这项工作的工具.


MGw*_*nne 6

my-defvar 未被评估为变量,它被解释为符号.

请参阅Emacs Lisp:在alist中评估变量.

所以:

(defvar my-defvar "test")
(completing-read "input: " `("1" "2" ,my-defvar))
Run Code Online (Sandbox Code Playgroud)

应该管用.

更新:在@ Lindydancer的答案中给出了一个更合适的解决方案,但我将其留在此处以供参考.