Last active
December 8, 2016 16:35
-
-
Save zhouqiang-cl/a9ae1b43fba1ee639b78c84a23282443 to your computer and use it in GitHub Desktop.
common lisp 的宏, 函数, 特殊操作符 的比较
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
宏:可绕过一般的求值规则 | |
函数:不能绕过一般的求值规则 | |
特殊操作符:可绕过一般的求值规则 | |
宏和函数: | |
一个函数只产生结果,而宏却产生表达式 | |
特殊操作符: | |
特殊操作符是 lisp 内部对这些关键字做一些特殊的操作, 对这些操作符的参数的解析不一样 | |
宏的处理方式: | |
1.按照定义的要求构造表达式 | |
2.在调用宏的地方求值该表达式 | |
构造新表达式的那一步被称为宏展开,宏展开之后是第二步:求值 | |
当编写宏的时候,要清楚哪些操作是在宏展开期进行的,而哪些操作是在求值期进行的,通常,这两步操作的对象截然不同。 | |
宏展开步骤处理的是表达式,而求值步骤处理的则是它们的值. | |
求值并不总是立即发生在展开之后, 不过在 toplevel 中确实是这样. | |
一个发生在函数定义里的宏调用将在函数编译时展开,但展开式 或者说它产生的对象代码, 要等到函数被调用时才会求值 | |
在宏定义中, 尽量不要产生副作用. 宏的返回是可以是一个副作用的返回 | |
函数 | |
lisp 的函数是对象.Lisp 里我们可以像对待其他熟悉的数据类型那样来对待函数. | |
在运行期创建一个新函数,把函数保存在变量和结构体里面,把它作为参数传给其他函数,还有把它作为函数的返回值 | |
一些经验: | |
一般带 with 开头的都定义成宏, 比如打开文件的with-open-file, 打开connect的可以定义成with-connection等等 | |
一般不带任何参数和都定义成函数, 业务宏和特殊操作符都会都其参数进行转换和操作。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment