第8章. 有限の繰り返し
この章の目的
この章を読み終える頃には、ループを書けるようになり、Keleusmaのループが他のほとんどの言語のループと違う、たった一つのルールを理解しているはずです。この章を読み終える頃には、ループを書けるようになり、Keleusmaのループが他のほとんどの言語のループと違う、たった一つのルールを理解しているはずです。
回数の決まったループ
楽譜の繰り返し記号は、何小節繰り返すかを示します。「とりあえずしばらく繰り返してみる」とは決して書きません。Keleusmaのループも同じです。すべてのループは、開始する前に回数が決まっています。これがこの章のタイトルにある「有限の」という言葉の意味です。楽譜の繰り返し記号は、何小節繰り返すかを示します。「とりあえずしばらく繰り返してみる」とは決して書きません。Keleusmaのループも同じです。すべてのループは、開始する前に回数が決まっています。これがこの章のタイトルにある「有限の」という言葉の意味です。
ループはforで書きます。数の範囲か、配列の要素を一つずつたどります。
fn main() -> Word {
let durations = [4, 4, 8, 2];
for d in durations {
let _step = d * 2;
}
for beat in 0..4 {
let _tick = beat;
}
durations[2]
}
keleusma runで実行します。出力は次のとおりです。
8
最初のループは配列durationsの4つの要素を順に巡り、毎回dに束縛します。次のループは範囲0..4を巡ります。これは0、1、2、3という4つの数字です。どちらのループも、ループが始まる前に回数が決まっています。配列には決まった長さがあり、範囲は自分の上限を宣言しています。最初のループは配列durationsの4つの要素を順に巡り、毎回dに束縛します。次のループは範囲0..4を巡ります。これは0、1、2、3という4つの数字です。どちらのループも、ループが始まる前に回数が決まっています。配列には決まった長さがあり、範囲は自分の上限を宣言しています。
正直な制限
このプログラムをよく見てください。2つのループは走りますが、結果の8はそれに依存していません。8はdurations[2]、つまり配列の位置2にある値で、ループを使わずに計算しています。このプログラムをよく見てください。2つのループは走りますが、結果の8はそれに依存していません。8はdurations[2]、つまり配列の位置2にある値で、ループを使わずに計算しています。
これは意図的なもので、第5章から直接導かれます。束縛は再代入できません。だからループは合計を加算していくことができません。なぜなら、合計とは毎回の周回で変わる値だからです。fnという種類の宣言で書かれた、原子的な関数の中では、ループは値を巡ることはできても、結果を積み上げていくことはできません。これは意図的なもので、第5章から直接導かれます。束縛は再代入できません。だからループは合計を加算していくことができません。なぜなら、合計とは毎回の周回で変わる値だからです。fnという種類の宣言で書かれた、原子的な関数の中では、ループは値を巡ることはできても、結果を積み上げていくことはできません。
ではなぜループを今学ぶのかというと、ループは第4部で活躍するからです。そこではloopという別の種類の関数の中で、ループの各周回がホストに値を渡したり、保存された状態を更新したりして、繰り返しが本当の仕事をするようになります。この章ではループの形を学んでおきます。あとで本当に必要になったときには、形が見覚えあるものになっているはずです。ではなぜループを今学ぶのかというと、ループは第4部で活躍するからです。そこではloopという別の種類の関数の中で、ループの各周回がホストに値を渡したり、保存された状態を更新したりして、繰り返しが本当の仕事をするようになります。この章ではループの形を学んでおきます。あとで本当に必要になったときには、形が見覚えあるものになっているはずです。
ループを早めに抜ける
ループは回数に到達する前に止めることもできます。breakを使います。
for beat in 0..16 {
if beat == 4 {
break;
}
}
beatが4に到達すると、breakがループを即座に終わらせます。breakのあとにあるセミコロンに注意してください。breakでループを早めに止められたとしても、回数はやはり有限です。ループは最大でも宣言した回数まで(あるいはそれより少なく)しか走らず、それを超えることはありません。beatが4に到達すると、breakがループを即座に終わらせます。breakのあとにあるセミコロンに注意してください。breakでループを早めに止められたとしても、回数はやはり有限です。ループは最大でも宣言した回数まで(あるいはそれより少なく)しか走らず、それを超えることはありません。
この章のまとめ
for name in 0..n { ... }は数の範囲を巡ります。for name in array { ... }は配列の要素を巡ります。- すべてのループは、開始する前に回数が決まっています。
- 原子的な
fnの中では、ループは結果を積み上げることはできません。束縛が変わらないからです。ループが本当の仕事をするのは第4部です。原子的なfnの中では、ループは結果を積み上げることはできません。束縛が変わらないからです。ループが本当の仕事をするのは第4部です。 break;でループを早めに抜けます。
次の章では、値を関数の連なりに通します。