GroovyとRuby

前回作ったマクロはjFD2の作者にも使ってもらえたようだ。
で、「ファイルの表示順を大文字小文字を区別しないようにして欲しい」とのリクエスト。検索では大文字小文字区別していないのだから当然の要求である。自分では小文字のショートカットしか使っていないので気付いていなかった。
該当部分は

files=files.sort()

とりあえず

files=files.sort(){x,y->x.toLowerCase()>y.toLowerCase()?1:-1}

とした。JavaならComparetorを実装して渡すところだしGroovyでも同様にできるのだが、たぶんクロージャを渡してもOKだと思ってやってみたら問題なし*1
後で、リファレンスを見るとRubyのように"<=>"演算子が使えるようなので

files=files.sort(){x,y->x.toLowerCase()<=>y.toLowerCase()}

でもいい。
しかし、ほんとはRubyの"sort_by"メソッドのように記述したかったので"sortBy"とか探したけれど見つからない。
そこで、物は試しと

files=files.sort(){it.toLowerCase()}

で、あっさり出来た。
現時点の最新のリファレンスを、どう読んでもこんな書き方が出来るようには解釈できないのだが・・。
実装にドキュメントが追随しきれないのは何処も同じとはいえ、現時点のGroovyのバージョンは1.5でjFD2に同梱されているバージョンは1.1。1.1での機能くらいは網羅していて欲しいところ。


Groovyの日本語で読める資料を探すとGroovy - Java用スクリプト言語にたどりつく。訳者が角谷さんなのでRuby使いとしては安心して読める。
とはいえGroovyが1.0になる前の資料を訳した物なので、今のバージョン(jFD2の1.1でも)ではエラーになる記述を今のところ2つ見つけた。
(1) クロージャの記述


クロージャを定義する文法は、

{ comma-separated-parameter-list | statements }

との記述があるが、実際は

{ comma-separated-parameter-list -> statements }
でないとエラーになる。


(2) Range(範囲オブジェクト)の記述

3..7 は「3 から 7」を表す Range を生成する。
3...7 は「3 から 6」を表す Range を生成する。
との記述があるが、3...7はエラーになる。


上記2点、エラーになる記述はいずれもRubyと同じ書き方なのだが、それを1.0以降のバージョンで敢えて変えたのは何故なのか、ちょっと気になる。

*1:先にリファレンスを調べるべきなのだが、実家のネット環境が貧弱なので、オフラインで試せることは先