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 ループ構文で置き換えられています。