11.2 命令型制御構造 (Imperative Control Structures)

Scala には C や Java で知られる while や do-while のループ構文があります。また else-節のない片側の if や、関数を途中で中止する return 文もあります。これらを使えば、従来の命令型スタイルのプログラミングも可能です。たとえば次の関数は、与えられたパラメータ x の n 乗を計算しますが、while と片側 if を使って実装されています。

def power(x: Double, n: Int): Double = { var r = 1.0 var i = n var j = 0 while (j < 32) { r = r * r if (i < 0) r *= x i = i << 1 j += 1 } r }

これらの命令的な制御構文は、ユーザの便宜を図って言語に入れてあります。それらを無くすこともできました。なぜなら同じ構文を単に関数として実装できるからです。たとえば while ループを関数的に実装してみましょう。whileLoop は2つのパラメータ、Boolean 型の条件と Unit 型のコマンド、をとる関数のはずです。条件とコマンドは名前渡しである必要があります。そうすれば各ループ毎に繰り返し評価されます。以上から、次の whileLoop 定義を得ます。

def whileLoop(condition: => Boolean)(command: => Unit) { if (condition) { command; whileLoop(condition)(command) } else () }

whileLoop は末尾再帰的であり、一定のスタック領域で動作することに注意しましょう。

演習 11.2.1 repeatLoop 関数を書きなさい。次のように適用されるものとします。

repeatLoop { command } ( condition )

また次のようなループ構文は可能ですか?

repeatLoop { command } until ( condition )

C や Java で知られるいくつかの制御構文は Scala にはありません。ループ中にジャンプする break や continue はありません。また Java の意味での for ループもありません。それらは 10.4 節で議論した、より一般的な for ループ構文で置き換えられています。