我们需要创建复杂的固定长度和可变长度的字符串。这些字符串可能代表客户档案,订单等。您建议使用哪种基于JVM的编程语言?
想法是让最终用户使用此DSL创建字符串。所以我正在寻找验证,代码完成等。
答案 0 :(得分:8)
答案 1 :(得分:7)
Use a Lisp。你有一些选择:
答案 2 :(得分:6)
有两种类型的DSL;外部和嵌入式。
外部DSL与您的宿主语言完全分开,即您在语言之外编写它,但通常用于生成宿主语言的代码。对于这种方法,带有XPand的XText可能是最好的工具,因为简单的语法文件为新的DSL生成一个完整的基于Eclipse的编辑器,您可以在XP中使用代码模板来生成实际的Java代码。 XTend和XPand是用Java编写的,但这是偶然的,因为它们可以用任何东西编写,只要你在流程结束时最终得到Java代码。这种方法的缺点是,对于任何相当复杂的问题,语言将变得非常复杂,语法中将需要大量工作,甚至代码生成模板中也需要更多工作。您不能使用任何主机语言功能,如表达式评估,因此如果您需要,所有这些都需要在DSL中重建。 XText将很快包含XBase,它是一种部分语言,将包含表达式以帮助解决此问题。
另一种方法是嵌入式DSL,其中高级域功能以宿主语言表示,或者通过功能语言中常见的高阶构造(如HOF和monad)或通过宏等元编程工具(例如Lisp) )。 Java既没有这些,也不适合DSL工作(或大多数其他形式的抽象编程)。 Spring Roo为使用生成的java提供了元编程类型工具,因此可能是一个选项。如果做不到这一点,Scala可能是最受Java欢迎的Java语言,并且拥有您需要的设施。
嵌入式DSL通常比外部DSL容易得多,因为您完全支持宿主语言,因此我的建议是尝试使用Scala。
答案 3 :(得分:5)
使用Xtext(http://www.eclipse.org/Xtext/),您可以在指定DSL时免费获得一个漂亮的编辑器。
答案 4 :(得分:4)
Scala一路走来! Scala特别适用于内部DSL(请参考this)。
答案 5 :(得分:2)
我会为此推荐Groovy。
答案 6 :(得分:0)
我会建议jruby。我做了一些,总是很容易得到我想要的东西。
答案 7 :(得分:-2)
听起来像Apache Velocity模板引擎的问题。如果你愿意的话,它是一个带有模板语法或DSL的Java库。