【发布时间】:2011-11-10 21:13:08
【问题描述】:
我必须为非程序员(我们公司的客户)创建一个 DSL,它需要提供一些高级语言特性(循环、条件表达式、变量...... - 所以它不仅仅是一个“简单”的 DSL) .
使用 DSL 应该很容易;人们应该能够尝试并通过玩耍来学习它。我们希望实现类似于 Microsoft Excel 中的宏 - 许多 Excel 用户可以创建简单的公式、求和或计算,但从未使用过“真正的”(通用)编程语言。
显然不是每个 Excel 用户都理解更复杂的内置方法(如 When()),但他们可以使用简单的方法,如 SUM() 或 AVG()。我想用 DSL 实现类似的效果——用户应该能够直观地使用它并定义简单的规则或执行简单的计算。同时,DSL 应该为更倾向于技术的人提供更高级别的特性——比如循环、if 语句、可能的方法或 lambdas。
这引出了我的问题:哪些语言结构是直观的、易于学习和理解的?
在当前的 DSL 实验版本中,我们尝试了方法链方法,例如:list.where(item -> item.value > 5).select(item -> item.name + " " + item.value))。
将where 和select 视为foreach 构造,其中item 是表示循环中当前项的变量。
我们首先尝试这种方法的原因是它很容易支持代码完成 - 每当用户输入句点 (.) 时,都会显示可能的方法列表。但是,我不确定这个概念是否符合我的标准,即直观且易于理解和阅读。
如果没有大括号,用户是否更容易/更易读? (如在 LINQ 中:from item in list where item.value > 5 select item.name + " " + item.value)。然而在这种情况下,没有“边界”——在前面的例子中,用户知道语句以最后一个右括号结束——在这种情况下,如果他在语句的select 部分之后键入更多代码,他不会'- 知道它是否属于语句(除了解析器也不知道并且必须有某种闭包的事实)。
我希望通过这 2 个示例让我的问题更清楚一些 - 我正在寻找 设计指南、最佳实践、实际经验,可能是研究材料哪些语言结构对其他人有利 - 或对某些语言结构的优缺点进行一些评估。
我不是在寻找关于如何创建 DSL、我可以使用哪些解析器生成器等信息,而且我也无法使用现有的通用语言(Ruby、Python、 ...) 而不是因为使用 DSL 的方式。 (解析后的 DSL 直接与我们的对象模型一起工作——我不会在这里详细介绍,因为这个问题已经足够长了)。
编辑: 或许我应该指出,“语言结构”是指语法、编写方式,而不是语言应该提供什么样的功能——我们已经有一个列表DSL 必须提供的功能。问题是如何最好地表达这些功能以允许创建(和维护)简单和复杂的公式。
【问题讨论】:
-
这正是我现在寻找信息的原因,Bart。我只是想说我不知道当前的方法是否直观,因为坦率地说我不知道,因为我是创建 DSL 的人,我将永远知道如何使用它。我们将与部分客户密切合作,以确保语言直观。但是,在这种情况下,我们的客户对语言的初始设计几乎没有帮助 - 如果我现在问他们是否方法链方法很好,他们可能会说是,当它完成并且他们必须使用它时,他们可能会说不。
-
enzi,对不起,我删除了我的评论,因为我认为你或多或少地通过编辑你的原始问题来回复它...... :)
-
我是这么认为的,但我会留下我的评论,以防其他人想知道为什么我是判断 DSL 是否直观的人 - 我在问题中对此不够清楚。
标签: language-design dsl