如何评估 Emacs Lisp 中引用表达式的部分

5

假设我有一个返回带引号列表的函数,就像这样:

(defun create-structure (n l)
  '(structure (name . n)(label . l)))

我希望这个函数能够返回以下内容:
(create-structure foo bar)
-> '(structure (name . foo)(label . bar))

但实际上我得到的结果与预期相同:

-> '(structure (name . n)(label . l))

我认为你可以在 n 前面加上 ,,就像这样 '(structure (name . ,n)(label . ,l))) - Patrick
2
@Patrick,你还需要使用反引号。 - Sigma
1个回答

8
至少有两种方法可以实现这个功能,一种是使用反引号语法,另一种是显式调用列表。
(defun create-structure-1 (n l)
  `(structure (name . ,n) (label . ,l)))

(defun create-structure-2 (n l)
  (list 'structure (cons 'name n) (cons 'label l)))

GNU Emacs Lisp参考手册提供了有关此主题的良好阅读材料:http://www.gnu.org/software/emacs/manual/html_node/elisp/Backquote.html#Backquote

3
您无需为此使用宏,您也可以在函数中使用反引号和逗号。反引号意味着单引号,因此您不需要同时使用两者。您可以这样替换宏:(defun create-structure (n l) \(structure (name . ,n) (label . ,l)))` - Tyler
不错!我是stackoverflow的新手,应该怎么做比较好呢:根据您的改进更新我的答案还是不更新? - Daniel Landau
我想更新你的回答,因为defmacro可能会让读者感到困惑。 - Tyler
你把反引号语法和宏扩展搞混了。它们是正交的 - 在defmacro之外也可以很好地使用反引号。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接