Skip to content

Instantly share code, notes, and snippets.

@zhouqiang-cl
Last active December 8, 2016 16:35
Show Gist options
  • Save zhouqiang-cl/a9ae1b43fba1ee639b78c84a23282443 to your computer and use it in GitHub Desktop.
Save zhouqiang-cl/a9ae1b43fba1ee639b78c84a23282443 to your computer and use it in GitHub Desktop.
common lisp 的宏, 函数, 特殊操作符 的比较
宏:可绕过一般的求值规则
函数:不能绕过一般的求值规则
特殊操作符:可绕过一般的求值规则
 
 宏和函数:
一个函数只产生结果,而宏却产生表达式
 特殊操作符:
   特殊操作符是 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