Scala 2.8では対話型コマンドインターフェイス(REPL)がかなりいい感じになっています。
タブでコード補完
REPL上で下記のように入力してから
scala> “a”.
タブを入力すると、Stringメソッドが持つメソッドが一覧でみられます。
また、下記のようにメソッドが一意に決められる場合は
scala> “a”.to
一覧ではなく、メソッドがそのまま補完されます。
scala>”a”.toString
上記はStringリテラルに対してコード補完を行っていますが、他にもコード補完ができるものがあるので確認していきます。
インスタンスのメソッド、フィールド
scala>class Person(val firstName:String, val lastName:String) { def fullName = firstName + ” ” + lastName }
scala>val person = new Person(”yoshinori”, “ishii”)
scala>person.l
scala.person.lastName
→lastNameが保管される
scala>person.f
→firstNameとfullNameが一覧で出る。
privateメソッドは補完されませんが、protectedメソッドは補完されます。
パッケージ
scala>import scala.collection.
→scala.collectionパッケージ以下のパッケージ名とクラス名の一覧
型エイリアス
scala>type StrList = List[String]
scala>val strList:StrList = List(”a”,”b”,”c”)
scala>strList.sor
→sort、sortBy、sortWith、sorted の一覧
シェル上のパス
カレントディレクトリに script.scalaというファイルがある場合
scala>:load scr
以下のように保管されます。
scala>:load ./script.scala
もちろん :load がなくても、普通のシェルと同じ様にパスが補完できます。
追加されたコマンド
scala>:help
を実行すると、:cp、:history、:power、:sh、:silent というコマンドが追加されているのが確認できます。
:cp コマンド
クラスパスにJarまたはディレクトリを追加することができます。
scala>:cp myFantasticProgram.jar
コード補完も効くのでこの機能はうれしいですね。
環境変数の展開とかをやってくれるかと思いましたができませんでした。。
:history コマンド
実行したコマンドの履歴が一覧で表示されます。
scala>:history
…
498 :cp myFantasticProgram.jar
499 import jp.co.patentbureau.util._
500 :history
さらに履歴番号を入力することで、コマンドを再実行できます。
scala>:history 499
:h? コマンド
実行したコマンド履歴を検索出来ます。
scala>:h? List
161 val ls = List(”a”,”b”,”c”)
171 val l = List(1,2,3)
259 List(null).headOption
:power コマンド
パワーユーザモードで実行できるようにするコマンドで、:dumpや:searchなどのコマンドが追加されます。
このコマンドに関しては情報が少なすぎる上に、1エントリくらいの分量がありそうなので、説明は省略します。(時間あったら調べます^^;)
:sh コマンド
シェルを起動して、シェルのコマンドを走らせることができます。
scala>:sh mv myFantasticProgram.jar myFancyProgram.jar
:silent コマンド
結果を自動で出力する機能をON/OFFします。
scala>:silent
Switched off result printing.
OFFにすると、「res0:List[Int] = List(1)」などの出力がなくなります。
再度 :silentコマンドを実行すると、もとに戻ります。
scala>:silent
Switched on result printing.
感想
追加された機能は実用的なものばかりで、新規Scalaユーザの勉強にも役立つ思います。
コマンドがプラグインとかで追加できて
scala> :mvn net.liftweb.lift-util:2.0-M2
とかで、コード補完しながらmavenリポジトリのjarが追加できたりするといいなぁとか思いました。