是否与ELisp中的Scheme define-syntax
类似?
在define-syntax
中,我可以指定一些关键字,而在elisp defmacro
中,我不能。
编辑:似乎我要么不太了解你,要么我的问题不清楚。
在方案中,可以使用保留字定义宏,例如
(循环for
一个in
某些列表
(循环while
…
在Emacs Lisp中,我发现无法引入这种糖。
最多,我可以创建宏,它必须像
(循环获取列表
(做很多事情...)
可读性很重要
最佳答案
Scheme和Elisp都有宏系统。
“关键字” define-syntax
和defmacro
都为用户定义的宏引入了名称。
在实际代码中使用宏foo时,例如(foo 1 bar)
,宏扩展程序必须确定如何将给定的(foo 1 bar)
重写为不包含用户宏的更简单形式。宏扩展器调用在定义宏foo
时定义的函数。即它将调用您使用define-syntax
或defmacro
指定的函数,其形式为(foo 1 bar)
。该表示形式可以是“语法对象”或纯列表(这在不同的宏系统中有所不同)。
这是我对define-syntax
和defmacro
之间的相似性的看法。
但是,R5RS方案和Elisp的宏系统是不同的。
可以在foo
的帮助下,在R5RS Scheme中指定与syntax-rules
关联的宏扩展器。这使您可以使用模式匹配来指定重写规则(内部语法规则表单将评估为起作用)。
其他区别:R5RS方案中的宏扩展算法将再次帮助您无意中引入与程序其他部分的名称冲突的名称(例如,从库中提取出来的,不是您自己编写的)。历史上
由于命名空间在Lisp中的工作方式,这个问题在Lisp中并不是什么大问题,但是可能会出错。
从历史上看,Scheme和Elisp都使用相同的宏扩展算法,但是Schemers随后开始尝试其他算法。 R5RS中引入了“语法规则”系统,但发展并不仅限于此。如今,所有现代Scheme实施都具有“语法案例”系统(的各种形式)。
一些实现已使该扩展算法与模块一起工作(机架,R6RS实现和其他)。
简而言之,当您阅读有关Scheme宏系统时,请务必仔细检查要阅读的变量。如果您正在阅读有关限制的文章,那么很可能已经在syntax-rules
系统上找到了一个文本(现在已经很旧了)。
关于emacs - Emacs Lisp定义语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10663667/