两个有助于理解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定义一个宏函数. common lisp定义一个宏函数 - SegmentFault 思否  

(2)Common Lisp. Common Lisp_百度百科 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alexabc3000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值