【发布时间】:2011-01-05 10:00:09
【问题描述】:
我看到了这个nice blog post about a Scala continuations,它“模拟”了Scala 语言中的GOTO 语句。 (阅读更多关于Continuations here的信息)
我希望在编程语言 Groovy 中也有同样的效果。我认为在Groovy compiler phase transformation 内是可能的。
我正在研究一种领域特定语言 (DSL),并且首选嵌入在 Groovy 中。我想要GOTO 语句,因为 DSL 是一种非结构化语言(并且是从工作流程图生成的)。我需要一个“标记”的 goto 语句,而不是行号。
DSL 是一种用于工作流定义的语言,因为节点之间的箭头没有限制,所以需要goto。 (或带有while 等的不可读代码)
作为 Groovy 和 Scala 的初学者,我不知道是否可以将 Scala 解决方案翻译成 Groovy,但我认为 Groovy 中还有延续性。
我正在寻找用于在 Groovy 中模拟标记的 goto 的算法/代码。我想到的一种算法是重复使用eval;当您在goto 时,执行eval。
DSL 已使用 eval 进行评估。
我不是在寻找“while”循环之类的东西,而是翻译这段代码以便它工作(其他一些语法没问题)
label1:
a();
b();
goto label1;
PS: 如果我真的应该使用/想要 GOTO 语句,我不喜欢讨论。 DSL 是一种规范语言,可能无法处理变量、效率等问题。
PS2:可以使用除GOTO之外的其他关键字。
【问题讨论】:
-
只是一个旁注,标记为 goto 可以比通过延续更容易模拟...
-
@Gabriel:那你能给我胶水吗?
-
不,我没有胶水:)...我不知道你的 DSL 真的有什么限制,我也不太了解 Groovy,但处理 goto 的一种方法可能是闭包常量的数组/列表/映射和一个执行当前索引/键的方法,可以用 goto 更改。
-
@Gabriel 但为什么贴标签比不贴标签更容易?
-
这是我写的吗?无标签基本上是每个语句都有一个自动分配的标签,例如电话号码。您可以通过让用户在数组文字中写入来模拟它 - Program[]{statement1, stemaent2,...,stetementN};然后,您可以使用递增索引让 while 循环遍历数组,当您在程序数组中检测到具有有效索引的 goto 时,它可能会发生变化。您可以以相同的方式拥有标签,但您必须添加一个 Map
,当检测到标签语句时,它将为标签分配索引。
标签: groovy dsl transformation goto continuations