uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovy 2.4のgroovyshでは、defが効くようになった。

https://jira.codehaus.org/browse/GROOVY-6623
で対処されました。

% groovysh
Groovy Shell (2.4.0-beta-1, JVM: 1.8.0_11)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------------------------------------------------------
groovy:000> def x = 3
===> 3
groovy:000> x
===> 3
groovy:000> :set
Preferences:
    interpreterMode=true
groovy:000> x.class
===> class java.lang.Integer
groovy:000> String x = 3
===> 3
groovy:000> x.class
===> class java.lang.String
groovy:000>

こうです。
(2014/07/31追記)
もちろん、defに限らず

groovy:000> String t = "abc"
 000> String t = "abc"
===> abc
groovy:000> t
 000> t
===> abc

のように型を指定してもOKです。ローカル変数のスコープが、1行単位ではなく、セッションを通じて有効になる、という話。今までは一行ごとだった、つまり

groovy:000> String s="a"; s
 000> String s="a"; s
===> a

はエラーにならなかった。
(2014/07/31追記終り)

前の動作に戻すには、

groovy:000> :set interpreterMode false
groovy:000> def y = 3
===> 3
groovy:000> y
Unknown property: y

こうします。なんで今まで…、っていう話はあるんでしょうが、行ごとにnew GroovyShell()してたから、という実装の都合で、まあ、あれだ。

また、別件ですが、
https://jira.codehaus.org/browse/GROOVY-6754
によれば、
groovyshに、groovyコマンドと同様に-eオプションが指定でき、groovysh起動のタイミングで固有の初期設定コードが実行できるようになりました。