できたよ!

Grails goes on: 惜しいリストの、

def merge = { x, y, r = [] -> x == [] ? r : merge(x-x[0], y-y[0], r+[[x[0] , y[0]]]) }

まぁ記法がいいかどうかは別として, 意味は分かると思う. ところが Groovy1.5 でこれは動かないのだ. merge の定義中に再帰的に現れる merge を理解できないのだ. そこで次のようにすれば動く.

def merge; merge = { x, y, r = [] -> x == [] ? r : merge(x-x[0], y-y[0], r+[[x[0], y[0]]]) }

馬鹿でしょ. ま, いいけど.

て言うのが出来そうなのをちょっと思いつきました。

merge = { x, y, r = [] -> x == [] ? r : merge(x-x[0], y-y[0], r+[[x[0] , y[0]]]) }

assert merge([1,2,3], [4,5,6]) == [[1,4],[2,5],[3,6]]

やっぱりできた!…まぁ、アレですね。
たぶん1.5でも動きそうな気がします。


まぁ、クロージャは「その時点でのコンテキストを引き継ぐ」もので、代入の右辺は左辺よりも先に解決されるから

def merge = { x, y, r = [] -> x == [] ? r : merge(x-x[0], y-y[0], r+[[x[0] , y[0]]]) }

で右辺が解決される時点ではまだmerge変数が定義されてなくて見えないのは仕様的には正しいんでしょうけど…不便ですねー。
宣言 -> 右辺解決 -> 代入、の順で評価してくれれば済むのに…