Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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はそれに依存していません。8durations[2]、つまり配列の位置2にある値で、ループを使わずに計算しています。このプログラムをよく見てください。2つのループは走りますが、結果の8はそれに依存していません。8durations[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;でループを早めに抜けます。

次の章では、値を関数の連なりに通します。