最近,当我试图解释为什么Ruby on Rails是我所在组织的实习生的特定领域语言(DSL)时,我无法清楚地表达我想要的效果。 也许我不太了解这个空间来教导细微差别。 将他重定向到马丁福勒的文章或谷歌排名的一个InfoQ或其他材料也没有多大帮助。
有人可以解释为什么Rails是一个具有示例/并行情况的DSL,对于那些对代码世界来说相当新的人来说,这不是巫毒的东西吗? 理解意识形态也可能有助于详细阐述铁路生态系统的复杂性?
从技术上讲,ruby不是DSL,它只是非常干净地编写内部DSL。 这个链接到Martin的Fowler的博客维基应该有助于澄清事情。
Rails被描述为DSL虽然我更准确地认为它是一个很好地利用一些DSL的框架。
编辑: Martin Fowler的DSL书的公开版介绍有一个激励性的例子,虽然它仍然针对程序员更多。
再次编辑:如果您指出ruby允许ruby代码看起来像“voodoo”示例可能很有用
port 2001
respond :resource=>"/hello" do |request, response|
response.body = "<message>hello</message>"
end
这比直接调用方法更干净。 实现DSL可能需要“voodoo”之类的代码(创建DSL要比使用DSL 要困难得多),而且一般来说,编码相对较新的人应首先担心DSL的功能,而不是如何实现。
是什么让ruby擅长内部DSL包括(1)使用块(任何具有干净闭包的语言都具有此优势),(2)不需要括号的方法类,以及(3)能够动态修改类的能力(是什么validates
)。 可能还有更多我没有想过的。
Ruby是一种可用于创建DSL的语言。 Ruby on Rails可以被认为是用于创建Web应用程序的DSL(域特定语言)。
Ruby当然不是DSL。 它是一种通用语言,与DSL相反。 然而,它是一种非常适合作为内部式DSL主机的语言。 那是; 您可以使用Ruby来创建DSL。
在使用Capybara测试“DSL”时,我问过自己同样的问题。 在我看来,当将像Rails这样的Ruby框架称为DSL时,这个术语就是错误的。 所以,你的问题的答案是:因为Ruby程序员的术语,它被称为DSL。
公平地说,遵循Martin Fowler的建议(见此处 ),我们可以将这些框架称为内部DLS (用于特定目的的通用语言的子集)。 但我不认为框架的概念存在很多概念上的差异。
Ruby的独特语法灵活性似乎使得以某种风格编写的框架看起来像一种全新的语言(虽然非常简单)。 就个人而言,我不会将任何域名特定语言称为没有独特语法或仅仅是通用语言的子集(您可以在SO的答案中看到对此有所支持)。
我不太明白这个问题。 Ruby不是领域特定语言,它是一种通用语言。 将它称为DSL是没有意义的,因为它不是一个。 因此,问题的整个前提没有意义。