当你把  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,  在这过程中对一些 符号可以进行 求值—— 即使用它的实际语义来计算一下。。

最新文章

  1. 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql
  2. REST建模语言RAML介绍
  3. windows下调用外部exe程序 SHELLEXECUTEINFO
  4. oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中
  5. Border-radius属性--设置圆角边框
  6. ios 适应屏幕
  7. Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
  8. C#条件语句、循环语句
  9. 用备份控制文件做不完全恢复下的完全恢复(全备<老>--备份控制文件<次新>--删除表空间andy--日志文件<新>)
  10. 为什么要使用“var me=this”这样的写法
  11. Django Form表单组件
  12. python中类中的@property
  13. TypeError: "x" is not a function
  14. BTree和B+Tree详解
  15. [Android] SeekBar---可拖动进度条
  16. 设计模式(9)--Composite(组合模式)--结构型
  17. SpringMVC由浅入深day01_5注解的处理器映射器和适配器
  18. poj3320 Jessica's Reading Problem
  19. JDK源码分析(五)——HashSet
  20. Vim global命令和重复操作

热门文章

  1. commons-dbutils【不推荐】
  2. STM32芯片命名规则
  3. Pinctrl子系统之一了解基础概念【转】
  4. 其他综合-Kickstart无人值守安装系统CentOS 7
  5. ansible 软件相关模块,剧本
  6. 201871010106-丁宣元 《面向对象程序设计(java)》第十四周学习总结
  7. java web问题总结
  8. java实体 和 xml相互转换
  9. Hello 2019 D 素因子贡献法计算期望 + 概率dp + 滚动数组
  10. [ Python入门教程 ] Python的控制语句