关于这个问题,我另起了一个主题[elisp 符号表 与 namespace]
关于本主题
为了使记号简洁,lisp 中有一个特殊的宏‘,称为 backquote。在这个宏里,所有的表达式都是引用(quote)的,如果要让一个表达式不被直接引用(也就是列表中要计算该表达式的值),需要在前面加 “,”,如果要让一个列表作为整个列表的一部分,可以用“,@”把它展开。
'(a list of ,(+ 2 3) elements) ; => (a list of 5 elements)
(setq some-list ’(2 3)) ; => (2 3)
'(1 ,some-list 4 ,@some-list) ; => (1 (2 3) 4 2 3)
提个问题
(defmacro when (cond &rest body)
(list 'if cond (cons 'progn body)))
; 按理说,是可以替换成
(defmacro when (cond &rest body)
'(if ,cond (progn ,@body)))
; 但提示下面错误
Error running timer 'aggressive-indent--indent-if-changed': (void-function \,)
; 找不到名字为"\,"的函数