Scheme和Elisp都有宏系统."关键字" define-syntax和defmacro两者都引入了用户定义的宏的名称.
在实际代码中使用宏foo时,(foo 1 bar)宏扩展器必须确定如何将给定表单重写为(foo 1 bar)不包含用户宏的更简单形式.宏扩展器调用在定义宏foo时定义的函数.即它调用您指定的函数define-syntax或defmacro表单的表示,(foo 1 bar).表示可以是"语法对象"或普通列表(这在不同的宏系统中有所不同).
这是我对之间的相似define-syntax和defmacro.
R5RS Scheme和Elisp的宏系统虽然不同.
foo在R5RS Scheme 中与can 关联的宏扩展器可以在syntax-rules.的帮助下指定.这允许您使用模式匹配来指定重写规则(语法规则表单将在内部评估为函数).其他差异:R5RS Scheme中的宏扩展算法会帮助您无意中引入与程序其他部分名称冲突的名称(例如来自库,您没有写自己的名字).历史上由于命名空间在Lisp中的工作方式,这个问题在Lisp中并不是一个大问题,但它可能会出错.
历史上,Scheme和Elisp都使用相同的宏扩展算法,但随后Schemers开始尝试其他算法.R4RS中引入了"语法规则"系统,但进化并未止步于此.目前,所有现代Scheme实现都具有"语法案例"系统的(变体).
一些实现已经完成了使扩展算法与模块(Racket,R6RS实现等)一起工作的工作.
简而言之,当您阅读有关Scheme宏系统的信息时,请注意仔细检查您正在阅读的变体.如果您正在阅读有关限制的内容,那么很可能您已经在(现在相当旧的)syntax-rules系统上找到了一个文本.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |