CL中'和`的区别

来源:互联网 发布:图腾网络机柜 9u 编辑:程序博客网 时间:2024/05/11 05:14

CL中有两种符号非常相似..那就是'和`..今天在实践MACRO的代码的时候稍微思考了下他们的区别..


其实在很多时候下,`(反引号)可以代替'(单引号)..二者共同的作用都是指示后续的整体(以括号为界)为数据对象,而不要求值..'(单引号)的功能只限于此..而且这个数据..必须确确实实的是CL的正常数据..一个普通的情况是'(单引号)之后的列表中不能出现,(逗号)..CL会提示说"出现了不该出现的逗号"


在其他情况下..一般的考虑都是`(反引号)..它具备所有'(单引号)的所有功能..而且还有自己的独特功能..就是逗号求值功能..

如(let ((x y)) `(x ,x)) 第一个x和普通的单引号情况类似..仍然是x..而第二个x则进行了逗号求值..x的值是y..所以上式结果是(x y)..


处理宏的时候..我们需要注意三层的求值范围..如(defmacro test (form) `(do-some form ,form) form)..然后进行调用(test actual)..我们得注意到..反引号之后的求值分成了三类..一种是直接字面值..如第一个form..在单引号内..而且没有逗号求值..它就是字面form不变..第二种是逗号求值..如第二个form..此时求值是得到actual的字面..也就是不对actual求值..而是直接把actual的字面(例如actual的字面是(+ 1 2))直接求值..比如第二个form就有可能是(+ 1 2)..第三种是最终求值..比如第三个form..它没有在反引号内..因此就直接是其actual的求值了..如果actual是(+ 1 2)..那么此处的form就直接是3了..


其实统一的一个想法就是宏是在操作源代码..更准确点说是操作参数..参数在宏中一般是不求值的..除非反引号逗号求值..或者直接暴露出来求值..而这两种求值是由层次差别的..希望各位仔细的体会..


我还在思考..这只是一个小的心得

原创粉丝点击