我试图了解Lisp的部分内容,到目前为止我还没有用过很多东西.读宏已经引起了我的注意.没有一个巨大的关于他们的信息的量使用,它会帮看看什么人跟他们做,既能得到它们是如何工作的例子,也看什么类型的问题可以与他们接近.接下来,是否有任何指导方针可以了解读取宏的优缺点是什么?
S表达式是Lisp数据的Lisp语法.使用函数READ读取S表达式,读取宏是Lisp内置的扩展读取器的方法.这意味着最直接使用读取宏是为了实现预定义的数据语法,并开辟了改变或扩展Lisp读取s表达式的可能性.
Lisp为许多数据类型提供了预定义的外部语法:符号,数字,字符串,数组,字符,conses,列表,结构等.它允许打印和回读数据对象.
Lisp缺少其他几种数据类型的语法 - 显着的哈希表和CLOS对象.因此,在用户代码中首次使用读取宏将扩展读取器,以便能够读取数据结构,如哈希表,并行向量,新数字类型,......基本上每个数据类型,开发人员都希望具有外部语法,可以回读.
由于Lisp也将s表达式用于代码,因此读取宏的第二个用途是扩展Lisp程序的表示法.一个典型的例子是使用[和]来编写嵌入式SQL代码.通常的Lisp语法看起来很相似,但[和]的使用有助于SQL表达式在代码中脱颖而出.另一个例子是使用读取宏来为嵌入式编程语言提供标识符,例如Objective C常量,消息等.Clozure CL使用它来表示区分大小写/保留大小写的标识符,并在读取时使用索引查找它们的定义.外部可用标识符.
第三种用法是将不同的语法嵌入到Lisp语法中.一个古老的例子是中缀读取宏,它允许嵌入的中缀表达式.其他示例是嵌入式HTML或XML语法,或其他编程语言语法的嵌入式片段.
有时,读取宏用于实现使用与预定义的Common Lisp语法不同的s表达式语法的其他(相关)语言.一个例子是Scheme s表达式的读者 - 它与Common Lisp略有不同.
当您有可能想要的文字对象的语法时,将使用Reader宏.它们的唯一问题是可能的合成的平面命名空间(但是,有办法解决这个问题).读者宏的用法并不多.我想到的一些例子是:
http://weitz.de/cl-interpol/ - 字符串插值和扩展字符串表示法的语法
http://trac.clozure.com/openmcl/wiki/OpenMclFfi - 从C语言导入符号的语法(FFI的自动形式)
http://clsql.b9.com/manual/sql.html - SQL查询的语法 - 不是非常有用
http://www.agentsheets.com/lisp/XMLisp/ - 将文字XML片段嵌入到Lisp代码中