2012-08-10 9 views
5

私はGroovyを使い慣れていて、特定のタスクのためにミニDSLを作成しようとしています。私は期待Groovyを使用したDSL - >パラメータ値を渡す

give me 5 

:(括弧を使用せずに)このコードを呼び出すことにより、5 I印刷(および/または返却)したいと思い :私は以下のような問題を解決しようとしてきた。この目的のために

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

実際にはそうではありません。 "give me" 5を返すために "give"と "me"を定義する方法を教えてください。私はが閉鎖でなければなりません。を与えるともmetaClass、propertyなどである可能性があります。

ありがとうございます! 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

ありがとう!それはまさに私が探していたものです。 [:]。withDefaultの構築についてもっと読むことができる場所を参照できますか? – ivita

+0

@ivita心配はいりません! [ここ](http://groovy.codehaus.org/groovy-jdk/java/util/Map.html#withDefault%28groovy.lang.Closure%29)に定義されています。知っておかなければならないことの1つは、印刷している「5」が実際には文字列であり、「整数」ではないということです。これはプロパティ名(String)として '5'を取得しようとしているため、文字列も返します。 –

+0

文字列として必要です:-)ありがとう! – ivita

1

あなたの閉鎖は正しいです。中かっこがありません。あなたは完全に、括弧を排除するパーサを正確に渡す必要があるかを理解できるようにするように、変数への部分を割り当てる必要がある場合は、そうでなければ、この

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

を試してみてください。

five = me 5 
give five 
+0

ありがとう、これはうまくいきますが、私のルールは括弧なしで動作させたいと言っています。それをどうやって行うのか考えていますか? – ivita

-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 

あなたは "は閉鎖でなければなりません "と"括弧なしでルールを動作させたい "という構文的制約から始めます。意味の必要条件から常に始めてください:-)

関連する問題