Common Lisp中的读取宏 ' #' `( , ,@) #( ) #na( ) #<OBJECT> :Keyword

当你把  xx 当做符号使用时   'xx  ,  这个符号是没有任何函数/变量语义的, 仅仅是一个 符号而已(就像一个string一样)

但你可以对这个string有其他的用法,比如使用它所binding的同名函数、使用它所binding的同名动态变量

(要知道,“代码” 不过是 一串String, 这就是 Macro所做的事)

你把Symbol当成一种可绑定函数、变量的东西就可以了!


 


 可以看到,  上图的 defun inc 和 defmacro inc 的内部实现时一模一样的。 它们其实都是接收 symbols作为参数, 然后基于这些symbols 构建 list-of-symbols (Cons/ Tree) , 而构建的目标是可以eval的 Symbols-tree!即如同正常代码一样的一串符号。

另外,它们的调用方式是不同的:  对于defun inc, 调用时要以 symbol的形式:   (inc  'x) ====>   '(setq x (1+ x)) ,此时得到的是一个列表, 必须显式写 eval 将其转为 代码,随后才可对之求值。

                                               对于defmacro inc,  调用时直接     (inc x)  ----宏展开---->  (setq x (1+ x)) , 此时相当于这里写的是这行代码,可以直接对其 C-M-x 求值。


The Common Lisp Cookbook - Macros and Backquote

http://cl-cookbook.sourceforge.net/macros.html

说白了:Macro的作用是 根据提供的几个 symbol去构建完整的 symbols-Tree,  在这过程中对一些 符号可以进行 求值—— 即使用它的实际语义来计算一下。。

 

转载于:https://www.cnblogs.com/nanlan2017/p/9669109.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值