5

我是 Groovy 的新手,我正在尝试为某些特定任务编写一个迷你 DSL。为此,我一直在尝试解决如下问题:我想通过调用此代码(不使用括号)打印(和/或返回)5:

give me 5 

我希望下面这样的定义会起作用:

def give = {clos ->  return clos} 
def me = {clos ->  println clos; return clos} 

但实际上并没有。您能否帮助我如何定义“give”和“me”以便使用表达式“give me 5”返回值 5,其中me必须是一个闭包,give也可以是元类、属性等。

提前致谢!Ⅳ

4

3 回答 3

3

Groovy 1.8+ 需要

give me 5

并且解析器有效地尝试做:

give( me ).5

因此,如果您这样编写代码,它可以工作:

def give = { map ->  map } 
def me = [:].withDefault { it }

a = give me 5

println a

印刷:

5
于 2012-08-10T09:20:17.373 回答
1

您的关闭是正确的。大括号不见了。试试这个

give(me(5)) or 
give me(5)

否则,如果您完全需要消除大括号,请将这些部分分配给一个变量,以便让解析器了解确切需要传递的内容。

five = me 5
give five
于 2012-08-10T09:16:17.770 回答
-1

你的方法是什么意思?您已经编写了一个语法要求:

give me 5

如果可以是,你需要:

give("me", 5)
give "me", 5 //equivalent "DSL" notation
give("you", 7)
give "you", 7 //equivalent "DSL" notation

//or...
def me= "Mickey", you= "Donald"
give(me, 5)
give me, 5 //equivalent "DSL" notation
give(you, 7)
give you, 7 //equivalent "DSL" notation

如果me从未改变,则语义最接近:

giveMe(5)
giveMe 5 //equivalent "DSL" notation

你已经写了“必须是一个闭包”和“我希望我的规则在没有括号的情况下工作”,从句法约束开始。始终从语义要求开始:-)

于 2012-08-10T12:54:20.483 回答