两个有助于理解Common Lisp宏的例子

在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定义一个宏函数. https://segmentfault.com/q/1010000002875509

(2)Common Lisp. https://baike.baidu.com/item/Common%20Lisp/7786268?fr=aladdin

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章