2012-08-10 43 views
5

我是Groovy的新手,我正在嘗試爲某些特定任務編寫迷你DSL。 爲此我一直在試圖解決這樣下面一個問題: 我想通過調用這個代碼打印(和/或返回),5(不使用括號):帶Groovy的DSL - >傳遞參數值

give me 5 

我的預期那麼下面的定義將起作用:

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

但實際上它沒有。請幫助我如何定義「給」和「我」,以便返回值爲5的表達式「給我5」,其中必須是封閉的,給出也可以是metaClass,屬性等。

提前致謝! Iv

回答

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 
+0

謝謝!這正是我所期待的。 您可以參考一些我可以閱讀更多關於[:]。with with Default構造的地方嗎? – ivita 2012-08-10 09:45:32

+0

@ivita不用擔心!它的定義[這裏](http://groovy.codehaus.org/groovy-jdk/java/util/Map.html#withDefault%28groovy.lang.Closure%29)。有一點需要注意的是,打印出的5''實際上是一個字符串,而不是一個「整數」。這是因爲它試圖將'5'作爲屬性名稱(字符串),所以也返回一個字符串 – 2012-08-10 09:52:21

+0

我需要它作爲字符串:-)謝謝! – ivita 2012-08-10 12:30:51

1

您的關閉是正確的。大括號缺失。試試這個

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

不然,如果你需要完全消除括號,分配部分給一個變量,從而讓解析器瞭解到底需要傳遞什麼。

five = me 5 
give five 
+0

謝謝,這個工程,但我忘了提及,我希望我的規則沒有括號。你有什麼想法如何做到這一點? – ivita 2012-08-10 09:32:24

-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 

如果永遠不會改變,語義最接近到:

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

你寫過「me必須是閉包「和」我希望我的規則沒有括號「,從句法約束開始。始終從語義要求開始:-)