假设我们想要定义一个 Lisp 结构来递增变量的值,效果类似于 C 语言中的 ++ 运算符。我们希望编写 (inc x) 就能实现 (setq x (1+ x)) 的效果。以下是实现该功能的宏定义:
(defmacro inc (var) (list 'setq var (list '1+ var)))
当以 (inc x) 调用该宏时,参数 var 是符号 x——而非 函数调用时那样取 x 的值。宏的体部利用这个符号构造出展开式,也就是 (setq x (1+ x))。宏定义返回这个展开式后,Lisp 会接着对其求值,从而完成 x 的递增操作。
这个谓词函数用于检测其参数是否为宏:如果是,返回 t;否则返回 nil。