java - 特定于项目的 DSL 是一种责任吗?

标签 java api macros lisp dsl

关闭。这个问题是off-topic .它目前不接受答案。












想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。


10年前关闭。







Improve this question




我已经从一个类似的问题中分出了这个问题,我在对我收到的许多很好的答案之一发表的评论中提出了这个问题。我最初询问的是 AST 宏,这主要引起了 Lispers 非常详细和深思熟虑的回应。谢谢。

Lazy Evaluation vs Macros

我在评论中提出的问题是特定于项目的 DSL 是否真的是一个好主意。当然,这完全是主观的——毕竟,当您使用一种真正富有表现力的语言编写代码时,您在哪里划定了富有表现力的 API 和实际的 DSL 之间的界限?例如,我认为大多数 Ruby 主义者所说的“DSL”实际上只是精心设计的 API,仅此而已。

请注意,我说 特定项目蜜蜂。我不认为很多人会反对在有意义的地方使用正则表达式或 SQL。

但尽管如此,我认为我们都可以在 API 和 DSL 之间划出一条模糊的、模糊的界线。当然,它们都是真正的 API,但无论如何。

在一个极端,你有 Lisp,其中似乎通过宏积极鼓励 DSL。另一方面,你有 Java 之类的东西,DSL 几乎是不可能的。

DSL 的支持者会争辩说,它们增加了灵 active 、表现力和一致性(例如,使用与语言自己的数字相同的运算符的自定义数字对象)。

批评者会说它们会导致除了 DSL 编写者之外没有人知道的子语言,首先扼杀了使用不同编程语言的意义,并导致没有人可以理解的代码,因为 的方式接口(interface) 与 API 不同。

我得说,我在很多方面都同意双方的观点。由于缺乏表现力,一些 Java API 简直就是令人讨厌。尽管如此,我通常可以在不阅读文档的情况下弄清楚发生了什么——这对于自定义 DSL 一点也不能说。也许 DSL 的支持者认为你应该 总是 阅读 API 文档。我不同意,但我也离题了。

但是,让我们看看目前的一些大语言。 C#和Java,即。它们都没有真正“做” DSL,但它们非常受欢迎。这是否正是因为他们不要允许 DSL 之类的东西,允许平庸的编码人员编写仍然可以理解的代码?

DSL 允许平庸的编码人员产生难以理解的垃圾这一事实是否是 Lisp 没有得到应有的使用的原因,尽管 DSL 在右手中看起来会是什么样子?

最佳答案

当然有支持和反对 DSL 的争论,当然在“库”或“API”和“DSL”之间有一条模糊的界限。您在问题中已经很好地涵盖了那部分,因此我将避免这些主观观点,而只关注它们是否是责任的问题。

一个值得考虑的好项目是Racket以语言建构为主要特征。很容易为“一种语言”的任何定义添加一种语言:DSL 与否,通过解释器从头开始构建,或者(更常见)通过定义新语言的宏以及可能用于不同语法的解析器来完成。因此,Racket 源代码树有一堆语言——其中一些具有根本不同的执行语义。一些例子:

  • Lazy Racket是你所期望的名字的意思,
  • Typed Racket是一种静态类型语言,
  • Scribble是一种用于编写文档和其他散文的语言,
  • Slideshow是一种写作语言...幻灯片,
  • RackLog/DataLog是在语义和语法上更加不同的语言。

  • 事实上,在 Racket 中编写语言非常容易,即使它适合非常有限的用途,甚至只是一种语言,您也可以轻松地拼凑出一种语言。例如,我们有这样的“小语言”用于创建我们的网页,决定哪些文件包含在分布式安装程序中,等等。见 this tutorial有关如何提出一种语言的描述。

    确实,在许多人可以使用的有用 DSL 和只有一个人使用的 DSL 之间有一条细线——但是,当你定义一种语言而不是库时,你可以获得的那种抽象对于指出即使它是“一个人的语言”,它也是一个有用的概念。其中一个难题是考虑互操作性——Racket 允许每个模块用它自己的语言编写,这带来了当这些模块中的几个应该相互通信时会发生什么的问题。例如,当惰性语言和默认语言中的函数交互时,评估如何进行?或者类型化如何确保它可以与默认的无类型语言交互,并且仍然可以获得静态类型语言的通常好处。

    关于java - 特定于项目的 DSL 是一种责任吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052963/

    相关文章:

    java - 检查一个字母是否在一个字符串(单词)中,它在什么位置?

    java - 使用 java/tomcat 在 mysql 5.5 中插入表情符号

    java - 如何更改 java 中的正则表达式搜索以忽略大小写

    Python Flask REST API MySQL 获取游标键和值

    c++ - 在宏中包含#warning 以供稍后评估?

    java - L 形 java 应用程序窗口

    php - 使用PHP中的API使用YouTube搜索YouTube,搜索词中包含多个单词

    python - 是否存在播放 deezer 歌曲的 python 方法?

    c++ - 保存 C++ 预处理器宏的原始值

    vim - 在 80 个字符处换行