你猜对了。
报价
特殊运算符quote 定义了一个表达式,该表达式计算为它的子形式,字面意思。例如:
(quote (looks like a function call))
内部形式看起来像一个函数调用,但对于 Lisp 阅读器来说,这只是一个符号列表。表达式(quote ...) 计算为该列表,而不尝试将该列表作为代码进行计算。
引用表达式有特殊语法,即引号字符,因此'exp 与(quote exp) 相同。当您不想评估符号时,这通常是您编写符号的方式。
反引号/逗号
准引用是一种只引用表达式的一部分的方法。
反引号的作用类似于引号:不评估其中的数据,除非它们以逗号为前缀,在这种情况下,评估会重新打开。
下面的表达式
`(format t "~s" ,exp)
...可以写成:
(list 'format 't '"~s" exp)
为了完整起见,我在文字之前添加了引号,否则会自我评估,但实际上您会编写如下相同的列表:
(list 'format t "~s" exp)
这里exp 被求值,整个表单给出了一个类似于对format 的调用的列表,其中env 被替换为其值。
引用逗号
您在示例中看到的引号/逗号组合是一个常见的习惯用法,您希望将在宏扩展时(即代码)给出的参数按字面意思放在正在扩展的代码中,而不对其进行评估。如果你通过宏扩展来测试你的宏,你可以看到生成的代码:
(macroexpand '(test-exp (+ 5 8)))
=> (FORMAT T "~&~S => ~S~%" '(+ 5 8) (+ 5 8))
文字 (+ 5 8) 表单被放置在 (quote ...) 表单中,使其在运行时未计算。同时,相同的表达式按原样放在它旁边,从而在运行时对其进行评估。如果您评估结果表达式,它会打印:
(+ 5 8) => 13