Tag: macros

项目特定的DSL是否是责任?

我从一个类似的问题中提出了这个问题,我在评论中提到了我收到的许多很棒的答案之一。 我最初询问AST宏,这主要引起了Lispers非常详细和深思熟虑的回应。 谢谢。 懒惰评估与宏 我在评论中提出的问题是项目特定的DSL是否真的是一个好主意。 当然,这是完全主观的 – 毕竟,当你用一种真正富有表现力的语言写作时,你在哪里画出富有表现力的API和实际的DSL? 例如,我认为大多数Rubyist称之为“DSL”的实际上只是精心设计的API而已。 请注意,我说项目特定的 API。 我认为很多人不会反对使用正则表达式或SQL这样做有意义。 但尽管如此,我认为我们都可以在API和DSL之间划清界限。 当然,它们都是真正的API,但无论如何。 在一个极端你有Lisp,似乎通过宏积极鼓励DSLs。 另一方面,你有像Java一样的DSL,这几乎是不可能的。 DSL的支持者认为它们可以提高灵活性,表现力并增加一致性(例如,使用与语言自身数字相同的运算符的自定义数字对象)。 批评者会说他们可以导致除了DSL编写者之外没有人知道的子语言,从根本上杀死了拥有不同编程语言的观点,并导致无人能理解的代码,因为与API 接口的方式不同。 我得说,我在很多方面同意双方的意见。 由于缺乏表现力,一些Java API只是简单的讨厌。 尽管如此,我通常可以在不阅读文档的情况下总结出正在发生的事情 – 这对于定制的DSL来说是丝毫不可能的。 也许DSL的支持者认为你应该总是阅读API文档。 我不同意,但我也离题了。 但是让我们来看看目前的一些大语言。 C#和Java,即。 他们都没有真正“做”DSL,但他们非常受欢迎。 这是因为他们不允许像DSL这样的东西,允许平庸的编码人员制作出仍然可以理解的代码吗? 事实上DSL是否允许平庸的编码器产生难以穿透的垃圾,这就是为什么Lisp没有尽可能多地使用它的原因,尽管DSL在右手中看起来像什么?