在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。
一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。
Lisp的宏,是实现上述特色的重要机制。Lisp的宏可以将整个Lisp宏命令作为参数,传递给宏。
执行命令在Lisp中就是对表达式求值。
- ;定义宏times
-
- (defmacro times (&whole form &rest args)
-
- (print "the form is:")
-
- (print form)
-
- (print "the args is:")
-
- (print args)
-
- (cons '* args)
-
- )
-
- ;执行命令 (times 2 3)
-
- (times 2 3)
宏times的功能就是乘法运算。先将参数form和args的值打印出来,然后重新构造一条乘法指令(S-表达式)。
结果如下图所示:
从运行结果可以看出,执行命令 (times 2 3)时,宏参数form的值就是命令“ (times 2 3)”本身(是一个表、一个S-表达式),args的值就是表“(2 3)”。
我们可以在宏函数中将这些参数进行加工、重组,生成一个新的S-表达式(也就是新的Lisp代码),然后执行。对上面的实例(cons '* args)的值就是(* 2 3),Lisp对这个表达式求值,得出的结果就是6。
宏参数的修饰符&whole和&rest的含义可以参看相关的资料。Lisp解释器在处理宏时,遇到这两个修饰符,就将指定的S-表达式作为宏参数传递给宏,我们可以对参数进行处理形成新的代码。
- ;定义宏plus
-
- (defmacro plus (&whole form &rest args)
-
- (print "the form is:")
-
- (print form)
-
- (print "the args is:")
-
- (print args)
-
- (cons '+ args)
-
- )
-
- ;执行命令 (plus 2 3)
-
- (plus 2 3)
运行结果如下:
- ;定义函数add1,加1
-
- (defun add1 (n) (plus n 1))
-
- ;定义函数sub1,减1
-
- (defun sub1 (n) (- n 1))
-
- ;定义函数power,即m的n次方
-
- (defun power (m n)
-
- (cond
- ((zerop n)1)
- (t (* m (power m (sub1 n))))
- )
- )
-
- ;计算3的4次方
-
- (power 3 4)
运行效果如下:
(1)common lisp定义一个宏函数. common lisp定义一个宏函数 - SegmentFault 思否
(2)Common Lisp. Common Lisp_百度百科