2014-07-09 23 views
5

我经常阅读有关为什么hygenic宏更好,clojure的宏系统是基于Common Lisp并且不卫生的辩论。在clojure中实现方案样式的宏

我的问题是:可以在clojure中实现一个scheme风格的宏系统,以及在其他lisps中植入的scheme风格的宏的一些例子。

+1

对于投票结束这个“太宽泛”的人,我不同意。它不仅要求是否有可能,而且要求正在实施的事例。这是一个具体的问题,可以具体回答(正如我试图做的那样)。 –

回答

5

通过“计划式的宏系统”,我不知道你的意思syntax-rules(简单的图案样式系统)或syntax-case(更灵活的系统,与datum->syntax以来,实际上并让你弯腰或flat-突破卫生)。

另外,Racket有syntax-parse,它比syntax-case稍微简单一些,并且(除其他外)使编写可以理解错误消息的宏变得愉快。

无论你的意思是什么,都有Clojure project that purports to implement aspects of all three。不过,我还没有尝试过,我不能保证它如此成功。

+1

感谢Greg,所以如果两种语言都可以存在,那么人们为什么如此专注于一种语言呢? – zcaudate

+1

@zcaudate考虑到你有一个不成熟的'define-macro',你可以很容易地用它来制作任何其他的宏系统。通过Schemes'syntax-rules'只有标准(R5RS和R7RS-小)你不能。卫生几乎是一种抽象,可以减少错误,有些人需要这种抽象而不是力量。大多数实现都有。 – Sylwester

2

我不确定说Clojure的宏观系统不卫生是正确的。我见过的一个类似的讨论,指的是Common Lisp的阅读器宏系统(Clojure没有这样做),因为它们不卫生,因为它们缺乏一种机制来保持不同模块中的阅读器宏不会互相替换。这是一个明确而有意的设计决策,用于构建语言,使得不包含Scheme的宏。