S-JIS[2010-10-23/2013-06-08] 変更履歴

scalaコマンド

Scalaでは、scalaコマンドによってクラスを実行する他に、対話型インタープリターとしてコマンドを入力して実行することが出来る。


REPL(Read Eval Print Loop)

REPLとは、コマンドラインからコマンド(Scalaの命令)を入力して、その場でインタープリターが解釈して実行してくれるもの。
ちょっとしたクラス・メソッドを試したい時に重宝する。
(Read=コマンド読み込み、Eval=解釈・実行、Print=結果表示、Loop=それらを繰り返す)

引数なしでscalaコマンドを実行すると、REPL(インタープリター)が起動する。

> scala
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

:help」と入れると、ヘルプが表示される。
exit」で終了できるが、ヘルプを見る限りでは、「:quit」が正式な終了方法かな? (exitはREPLのコマンドではなく、Scalaの関数)
(「:q」や「:qu」でも終われるようだが、「:h」はエラーになるが「:he」でヘルプが表示されるので、他のコマンドと区別がつく範囲では省略できるのかも)

コマンド 説明
:cp クラスパスにjarファイルもしくはディレクトリーを追加する。    
:help ヘルプを表示する。    
:history コマンド履歴(今までに入力したコマンド)を表示する。 :his 10 直近10行分のコマンド履歴を表示する。
:h? コマンド履歴を検索する。 :h? zzz 履歴の中で「zzz」が含まれているコマンドを表示する。
:imports 2.9〜 インポートした履歴を表示する。[2011-09-18] :imports  
:implicits 2.9〜 インポートされている暗黙変換を表示する。[2011-09-18]
REPLのトップレベルで自分で定義した暗黙変換は表示されない模様。
object内に定義してimportすれば表示される。by xuwei-kさん
:implicits -v Predefで定義されている暗黙変換が表示される。
:javap 2.9〜 クラスの情報を表示する。[2011-09-18] case class A(n:Int)
:javap A
:javap A$
コンパニオンオブジェクトも指定可能。
:javap java.lang.String 既存クラスも指定可能。
:keybindings 2.9 キーに割り当てられている内容を表示する。[2011-09-18]
-Xnojlineを付けてREPLを起動している場合は無効。
:keybindings  
:load scalaファイルをロードする。    
:paste 2.9〜 複数行(複数の式)をまとめて入力できる。[2011-08-26] :paste
class A
extends T {
}
trait T {
  self:A=>
}
^D
Ctrl+Dで入力を終了する。
(-Xnojlineを付けてREPLを起動していた場合はCtrl+Zで終了)
:power パワーユーザーモードを使えるようにする。    
:quit REPLを終了する。    
:replay 直前のScalaの命令(メソッド呼び出し)を再実行する。    
:reset 2.10 それまでに入力された内容(変数の値やクラス・関数定義など)をクリアする。[2013-06-08]    
:sh OSコマンドを実行する。
Scala2.9からは結果の取得方法が変わった。[2011-09-18]
:sh dir
:sh cmd /c dir
使用例
:silent 結果の表示有無を切り替える。   使用例
:type 2.9〜 評価(式の実行)をせず、結果の型を表示する。[2011-09-18] :type 123
:type List(1).par.seq
:type -v 123
 
:warnings 2.10 直近に出た警告の内容を表示する。[2013-06-08]
何らかの演算を実行して
「warning: there were 1 feature warning(s); re-run with -feature for details」
というメッセージが出た場合、「:warning」を実行すると詳細な警告内容が表示される。
:warn  
:completions 〜2.8 パワーモードで使用可能。[2010-12-30]
指定したオブジェクトのメソッド一覧が取得できるようだ。
:comp "abc"
:comp 123
:comp res1
 
:dump 〜2.9 パワーモードで使用可能。[2010-12-30]
現在のREPL内で定義されている名前(識別子)の一覧が表示される。
:dump  
:phase 2.9〜 パワーモードで使用可能。[2011-09-18]    
:wrap 2.9 パワーモードで使用可能。[2011-09-18]
REPLの式をラップして、独自処理を実行できる。
  →xuweiさんのScala2.9.0のREPLで、すごく便利な裏技を発見した件

REPLの使い方の基礎

REPLで組み込まれているコマンド以外のものを入力すると、Scalaの命令として解釈・評価(実行)される。

まずは定数(数値や文字列)を入力すると、そのまま表示される。

scala> 123
res0: Int = 123

scala> "abc"
res1: java.lang.String = abc

「res0」「res1」は、命令を実行した結果が格納される変数。REPL内で暗黙に定義されるようだ。
実行する度に番号は増えていく。(先回りして大き目の番号を使った変数を使っておくと、その分はちゃんとスキップされる)

res0: Int = 123」は、変数res0は型がIntで値が123であることを示す。


res0等は変数なので、その内容を表示したり演算に使ったりすることが出来る。

scala> res0
res2: Int = 123

scala> res0 + res1
res3: java.lang.String = 123abc

:silent」を実行すると、実行結果が表示されなくなる。

scala> :silent
Switched off result printing.

scala> 456

scala> :silent
Switched on result printing.

scala> 456
res5: Int = 456

REPLコマンド「:sh」

REPLでシェル(DOSやUNIX)のコマンドを実行する例。[2011-09-18]

Scala2.8

Scala2.8では、実行結果(標準出力への出力内容)はstdoutという変数(型はList[String])に入る。

scala> :sh dir "C:\"
stdout: List[String] = List( ドライブ C のボリューム ラベルがありません。, ボリューム シリアル番号は〜, , C:\ のディレクトリ〜

scala> stdout.mkString("\n")
res1: String =
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は〜

 C:\ のディレクトリ
〜

Scala2.9

Scala2.9では、Windowsの(DOSの)組込コマンドは実行できなくなった。cmd.exe経由で実行する。

実行結果はProcessResultというクラスで返ってくる。

scala> :sh cmd /c dir C:\
res2: scala.tools.nsc.interpreter.ProcessResult = `cmd /c dir C:\` (81 lines, exit 0)

scala> res2.show
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は〜

 C:\ のディレクトリ
〜
ProcessResultのメソッド
メソッド名 備考
line 実行したコマンドラインが返る。 cmd /c dir C:\
exitCode 実行したコマンドの戻り値が返る。 0
lines 実行結果(標準出力/標準エラーへの出力内容)をList[String]で返す。
(Scala2.8での結果取得方法と同様)
 
show 実行結果を表示する。
.lines.foreach(println)」と同様。
 

また、ProcessResultからList[String]への暗黙変換が定義されているので、Listのメソッドを直接指定することも出来る。

scala> res2.mkString("\n")

クラスファイルの実行方法

コンパイルされたScalaのクラスを実行する方法は、Javaにおけるjavaコマンドの実行と同様。

>scala クラス名

スクリプトファイルの実行方法

また、Scalaのスクリプトファイルを実行することも出来る。

>scala スクリプトファイル名

スクリプトファイルは、REPLで実行できるScalaの命令を書いたファイル。
拡張子は「.scala」にするので、Scalaのソースファイルと同じ。

スクリプトファイルの場合、暗黙の配列変数argsが定義され、実行時の引数が格納される。

(例)sample_script.scala:

println(args.length)
for(arg <- args){ println(arg) }
C:\temp\scala>scala sample_script.scala aa bb cc
3
aa
bb
cc

scalaコマンドのオプション

scalaコマンドの起動時のオプションについて。[2010-12-12]

オプション 説明
-help オプション一覧を表示する…ところだと思うのだが、scalacのオプションは全部使えるのでそちらも見ろ、ということらしい。
「scalac -help」を参照。
-X 拡張オプションの一覧を表示する。
-Xnojline REPLで日本語入力が出来るようになる。
ただしタブキーによる補完が出来なくなる模様。
(そもそもはJLineを無効にするオプションらしい。が、JLineって何ぞ?)
-i ファイル REPL起動時に最初にファイル(スクリプトファイル等)を実行する。[2011-09-30]
Scala2.9.1〜2.9.2ではバグっていて使えない(ファイルを読み込もうとして固まる。SI-4945)。
-Yrepl-sync Scala2.9.1〜2.9.2で「-i」を使う際に一緒に指定すると、スクリプトファイルが実行できる。[2012-09-02]

Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま