木曜日, 4月 02, 2009

[Scala] 遅延評価の例

Scalaで遅延評価。引数の型指定部分で":"の後ろに"=>"を挟み込むことで指示できる(参考)。
#!/bin/bash
exec ~/work/scala/bin/scala "$0" "$@"
!#

def until(f: => Boolean)(p: => Unit) {
while (!f) p
}

var i = 0
until (i > 10) {
print(i + " ")
i += 1
}
println
この例で遅延評価を外す("until(f:Boolean)"とやる)と、
・最初に"i>10(でi=0)"がfalseと評価される
・その結果(false)がuntil関数に渡ってしまう
ため、(trueと渡って来たものを再評価できるわけもなく)無限ループに陥ってしまいます。

なお、"(p: => Unit)"もその意味では遅延評価の指定がなされている、つまり「関数とは要するに引数付き遅延評価式で」ということで、具体的にはココを"(p:Unit)"とすると、
・1回だけuntilに渡したブロック(printとか)を処理して
・戻値が無い(Unitな)whileが回り続ける(iは1になったが以後そのまま)
状態に陥ってしまう。なのでここでも遅延評価が活躍している(んだと思う)。