Emacs lisp 定义语法
题
它与Scheme有什么类比吗 define-syntax
在ELisp中?在 define-syntax
我可以在 elisp 中指定一些关键字 defmacro
看来我不能。编辑:看来我要么不太明白你的意思,要么我的问题不清楚。在方案中,可以使用保留字定义宏,例如
(环形
for
Ain
一些列表(环形
while
…
在 Emacs Lisp 中,我找不到引入此类糖的方法。最多,我可以制作宏,必须像这样调用
(循环列表(做很多东西……)
可读性很重要
解决方案
Scheme和Elisp都有宏系统。“关键词” define-syntax
和 defmacro
两者都引入了用户定义的宏的名称。
当实际代码中使用宏 foo 时,例如 (foo 1 bar)
宏扩展器必须确定如何重写给定的形式, (foo 1 bar)
, ,转换为不包含用户宏的更简单的形式。宏扩展器调用宏时定义的函数 foo
被定义。IE。它调用您指定的函数 define-syntax
或者 defmacro
具有形式的表示, (foo 1 bar)
. 。表示可以是“语法对象”或普通列表(这在不同的宏系统中有所不同)。
这是我对两者相似之处的看法 define-syntax
和 defmacro
.
不过R5RSScheme和Elisp的宏系统是不同的。
关联的宏扩展器 foo
可以在 R5RS 方案中指定帮助 syntax-rules
. 。这允许您使用模式匹配来指定重写规则(内部语法规则形式将评估功能)。其他差异:R5RS 方案中的宏扩展算法将再次帮助您无意中引入与程序其他部分的名称冲突的名称(例如,来自库,您没有自己编写)。从历史上看,由于命名空间在LISP中的工作方式,这个问题在LISP中并不是那么大,但是可能会犯错误。
从历史上看,Scheme 和 Elisp 都使用相同的宏扩展算法,但后来Schemers 开始尝试其他算法。R5RS 中引入了“语法规则”系统,但演变并没有就此停止。如今,所有现代方案的实现都有“语法-大小写”系统(的变体)。
一些实现已经完成了使该扩展算法与模块(Racket、R6RS 实现等)一起工作的工作。
简而言之,当您阅读有关Scheme宏系统的内容时,请注意准确检查您正在阅读的变体。如果您正在阅读有关限制的内容,那么您很可能已经在(现在相当旧)上找到了文本 syntax-rules
系统。