【发布时间】:2014-09-18 19:13:22
【问题描述】:
在 Scala 中,如果有一个对象 Foo 具有 apply(x: Int),我可以用 Foo(42) 调用它(作为 Foo.apply(42) 的简写)。
是否可以在 Java 或 Groovy 中复制它?我原以为 Groovy 的 call 功能可能类似,但 def call(int x) 或 static def call(int x) 都没有导致调用 call
编辑:根据要求添加示例 DSL
典型/现有 DSL:alter 't' add 'a' storing BAR(其中BAR 是一个枚举)。
尝试在上面添加一些代替 BAR 的内容,但会接受一个参数,但语法不会有太多差异 ,理想情况下:alter 't' add 'a' storing FOO(42)
我已经将 FOO 创建为一个具有接受 int 的构造函数的类 - 我现在正在寻找一种通过 FOO(42) 而不是 new FOO(42) 或 FOO.call(42) 调用该构造函数的方法
【问题讨论】:
-
很酷的问题你能提供更多信息吗
-
@KickButtowski 它适用于通常调用枚举但需要添加带有参数的内容的 DSL - 因此它被实现为类而不是枚举。但理想情况下,我希望这种特殊情况的 DSL 语法尽可能接近其他情况。
FOO(42)比new FOO(42)或FOO.call(42)更接近FOO -
@Exupery 你能发布一些你的 DSL 的例子吗?可能有一些解决方法
-
一般来说 DSL 是一个不错的主意,但在搞砸了一些之后,我绝对讨厌将某些语言混为一谈以制作一种既不能识别为原始语言也不能识别为“自然语言”的混合语言的想法”。如果您要编写 DSL,为什么不直接自己解析呢?这样你就可以得到你正在寻找的确切语言和.not_some random english_like.text.with bizarre_syntax_requireme.nts??
-
@WillP 添加示例 DSL