问题标签 [dsl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 Java 中创建自然 DSL 的最佳工具是什么?
几天前,我阅读了一篇博客文章 ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ),其中作者讨论了使用 .NET 的通用自然语言 DSL 解析器。
在我看来,他的想法的绝妙之处在于,文本被解析并与使用与句子同名的类进行匹配。
以下面几行为例:
将使用“已知”对象的集合进行转换,该集合采用解析结果。一些示例对象将是(在我的示例中使用 Java):
因此,在处理第一句时,CreateUser 类将是一个匹配项(显然是因为它是“create user”的串联),并且由于它在构造函数上接受一个参数,因此解析器会将“user1”作为用户参数。
之后,解析器将识别下一部分“with email”也匹配一个方法名称,并且由于该方法带有一个参数,它会将“test@email.com”解析为电子邮件参数。
我想你现在明白了,对吧?至少对我来说,一个非常明确的应用是允许应用程序测试人员用自然语言创建“测试脚本”,然后将句子解析为使用 JUnit 来检查应用程序行为的类。
我想听听关于可以使用 Java 编写此类解析器的工具或资源的想法、提示和意见。如果我们可以避免使用复杂的词法分析器,或者像 ANTLR 这样的框架,我认为这可能会用锤子杀死苍蝇,那就更好了。
不仅如此,如果有人愿意为此启动一个开源项目,我肯定会感兴趣。
dsl - DSL 工具:在自定义代码中创建新图表
我正在为 Visual Studio 2005 使用 DSL 工具。
我有一个 DSL,在某个时候我想使用自定义代码创建一个新图表。
到目前为止,我能够通过覆盖当前已打开的图表来创建一个新图表。代码如下:
但是,我真正想做的是,
用一个新的实例 FEGeneratorDiagram 创建一个新的 DSL 文档,然后继续我添加元素和设置属性的逻辑。
有什么帮助吗?
ruby - 需要帮助改进 Ruby DSL 以控制 Arduino 控制的饮料分配器(酒吧猴子)
我正在用 Ruby 编写 DSL 来控制我正在从事的 Arduino 项目;巴迪诺。这是一个酒吧猴子,将由软件控制以提供饮料。Arduino 通过串行端口接收命令,告诉 Arduino 要打开哪些泵以及打开多长时间。
它当前读取一个配方(见下文)并将其打印出来。串行通信的代码以及我在下面提到的其他一些想法仍然需要处理。
这是我的第一个 DSL,我正在处理前面的示例,所以它的边缘非常粗糙。任何批评、代码改进(对于 Ruby DSL 最佳实践或习语有什么好的参考吗?)或任何一般性评论。
我目前有一份 DSL 的草稿,所以饮料配方如下所示(Github 链接):
这反过来被解释,目前结果如下(Github 链接):
这对于 DSL 来说是一个好的开始,但是,我确实认为它可以实现得更好一些。我有以下一些想法:
- 使用成分的名称和它所连接的数字泵来定义可用的“成分”。也许使用哈希?成分 = {“水” => 1,“伏特加” => 2}。这样,当一种成分被解释时,它可以 a)通过串行端口发送泵号,然后是 Arduino 分配的盎司数 b)告诉用户成分不存在并中止,因此没有分配 c)如果它们被改变,很容易有能力改变或添加新的成分。
- 让菜谱看起来不像代码,这是 DSL 的主要目的,也许构建一个菜谱构建器?使用可用的成分提示用户输入饮料名称、涉及的成分和多少?
Github 项目在这里,请随时 fork 并提出拉取请求,或在此处发布您的代码建议和示例以供其他用户查看。如果您完全好奇,这里是使用 Ruby Arduino 开发框架的 Arduino 代码。
更新
我修改和清理了一些东西,以反映 Orion Edwards 对食谱的建议。现在看起来如下所示。
我还添加了一个哈希(键是成分和它所连接的泵号的值)。我认为这提供了很大的进步。我暂时将这个问题留待任何进一步的建议,但最终会选择 Orion 的答案。更新的 DSL 代码在这里。
orm - 实现关系代数的语言特性
我一直在尝试在 Scala 中编码一个关系代数(据我所知,它是最先进的类型系统之一),但似乎没有找到一种方法来达到我想要的位置。
由于我对编程语言设计的学术领域没有那么丰富的经验,所以我真的不知道要寻找什么功能。
那么,实现静态验证的关系代数需要哪些语言特性,哪些语言具有这些特性呢?
一些要求: 元组是一个函数,将名称从一组静态定义的元组有效名称映射到名称指定类型的值。让我们将此名称类型称为设置域。
关系是一组具有相同域的元组,因此任何元组的范围在集合中都是唯一的
到目前为止,模型可以很容易地在 Scala 中建模
Tuple 中的 vals、vars 和 defs 是上面定义的名称类型集。但是元组中不应该有两个同名的定义。vars 和 impure defs 也应该受到限制。
现在是棘手的部分:
两个关系的连接是一种关系,其中元组的域是来自操作数元组的域的并集。这样只保留它们域的交集具有相同范围的元组。
应该做的伎俩。
关系的投影是一个关系,其中元组的域是操作数元组域的子集。
这是我不确定是否有可能找到解决方案的地方。你怎么看?定义项目需要哪些语言特性?
上面暗示的是 API 必须是可用的。层层叠叠的样板是不可接受的。
c# - 领域特定语言 (DSL) 和领域驱动设计 (DDD)
领域特定语言 (DSL) 和领域驱动设计 (DDD) 之间有什么区别和相似之处?
dsl - 构建规范语言表示的一般复杂性是多少?
拥有语言的规范表示通常很方便(在我的情况下,它们通常是特定领域的语言);但是,我相信所涉及的语言的表达能力有严格的限制,这些语言决定了是否可以为该语言的任意程序确定和/或创建规范形式。不幸的是,我一直找不到我(模糊地)记得在其中读过的参考资料。
一方面,创建语言的规范表示与许多硬图问题(例如:图同构)具有相当的复杂性似乎是合理的,但另一方面,iirc、gcc、yhc 和 ghc 等编译器使用中间表示生成各种格式的输出(程序集、javascript 等),所以这至少在某些形式下是一个已解决的问题。
何时可以确定/生成给定语言的规范形式?(该语言的表达能力如何,语言表达能力如何影响规范形式的效用?)如果可能,请提供参考或证明。
编辑:例如,正则语言(例如:正则表达式的“纯”形式)不能表达图灵完备语言所能表达的许多相同的东西。换句话说,您不能用常规语言编写 Web 服务器,但可以使用 lambda 演算)。我的问题是关于理论上的可能性,并且确实有与复杂性理论有关的具体答案。如果我有一个 DSL 需要传输到另一个系统,那么在传输它之前生成该代码的规范形式通常是有益的,因为这将解耦两个不同系统使用的独立表示。 然而,如果将图灵完备语言翻译成规范形式是 P-Space 完备或 NP-Complete,那么您不应该浪费时间尝试构建规范形式——要么找到另一种方法,要么减少可以在多项式时间内规范化的语言复杂性。
virtual-machine - 将内部 DSL 转换为外部 DSL 反模式吗?
在我们的遗留系统中,我们编写了自己的虚拟机来在运行时执行我们的内部 DSL。内部 VM 旨在仅运行我们的内部 DSL。我们正在重写我们的遗留应用程序。我们正在考虑的想法之一是将我们的内部 DSL 转换为外部 DSL(C# 或 Java)并利用他们的 VM。
何时为我们的内部 DSL 编写我们自己的 VM 与何时转换为外部 DSL 并在该 VM 上运行,并没有明确的指导方针。
metaprogramming - Nemerle 宏的中缀格式
假设我需要一些非常特殊的乘法运算符。它可以在以下宏中实现:
我可以像这样使用它
及其工作。
但我真正想要的是我现在正在开发的 DSL 的一些类似“英语”的运算符:
如果我尝试像这样使用它
编译器因“预期;”而失败 错误
问题是什么?如何实现这个中缀格式的宏?
dsl - 用于模型驱动开发的工具(最佳实践?)?
模型驱动的软件开发。
据我了解,它提高了设计的抽象级别,以更好地反映软件将尝试运行的领域。一句话就可以说很多。
领域专家(客户)和开发人员之间的沟通对于使这种方法发挥作用至关重要。我想知道的是,是否有工具套件或一组最佳实践有助于 MDSD 的初始推进?一旦领域被充实,如何将该模型映射到 ORM(或其他)?
我只是潜入 MDSD 和 DSL 领域,因此任何建设性的想法或评论都会受到重视。
c# - C# 创建隐藏事务
我正在为 VS2005 使用 C# 和 DSL 工具。
我需要创建事务来更改一些数据,但我希望它们对用户隐藏,这意味着不显示在 VS2005 的 UNDO 列表中。
我尝试禁用 UndoManager
但是通过禁用它,撤消列表中所有现有的先前操作都将被清除。
事务有一个名为“isHidden”的属性,但它是只读的,我不知道如何将其设置为隐藏。我也尝试创建一个新的 UndoManager 但它也是一个只读属性......
如何创建未出现在撤消列表中的事务?
我很乐意写更多细节以澄清任何疑问,非常感谢你,Luís Filipe
[添加]
我根据属性值绘制每个形状的背景。例如,如果为真,则为绿色,如果为假,则为红色。我需要打开一个事务来绘制形状的背景,但对我来说它表现为一个计算的(只读)属性。