Common Lisp中的读取宏 ' #' `( , ,@) #( ) #na( ) #<OBJECT> :Keyword
2024-09-06 05:11:14
当你把 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, 在这过程中对一些 符号可以进行 求值—— 即使用它的实际语义来计算一下。。
最新文章
- 数据库执行sql报错Got a packet bigger than &#39;max_allowed_packet&#39; bytes及重启mysql
- REST建模语言RAML介绍
- windows下调用外部exe程序 SHELLEXECUTEINFO
- oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中
- Border-radius属性--设置圆角边框
- ios 适应屏幕
- Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
- C#条件语句、循环语句
- 用备份控制文件做不完全恢复下的完全恢复(全备<;老>;--备份控制文件<;次新>;--删除表空间andy--日志文件<;新>;)
- 为什么要使用“var me=this”这样的写法
- Django Form表单组件
- python中类中的@property
- TypeError: ";x"; is not a function
- BTree和B+Tree详解
- [Android] SeekBar---可拖动进度条
- 设计模式(9)--Composite(组合模式)--结构型
- SpringMVC由浅入深day01_5注解的处理器映射器和适配器
- poj3320 Jessica&#39;s Reading Problem
- JDK源码分析(五)——HashSet
- Vim global命令和重复操作