在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。
一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。
Lisp的宏,是实现上述特色的重要机制。Lisp的宏可以将整个Lisp宏命令作为参数,传递给宏。
执行命令在Lisp中就是对表达式求值。
定义宏times
;定义宏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
;定义宏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)
运行结果如下:
计算m的n次方(递归)
;定义函数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_百度百科