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

第17章 loop 関数

この章の目的

この章の終わりまでに、決して終わらない関数と、それを正直に保つ規則を理解できるようになります。

ストリームのためのプログラム

yield 関数は一時停止と再開を行いますが、最終的には終了します。loop 関数は決して終了しません。これは、ホストが実行し続ける限り続くもの、すなわちオーディオエンジン、ゲーム、制御ループなど、あらゆるものにふさわしい形です。それは実行し、実行し、実行し続けます。

loop main(input: Word) -> Word {
    let _ = yield input;
    0
}

先頭への復帰

loop の本体の最後の文が実行されても、プログラムは停止しません。実行は本体の先頭に戻り、全体を再び実行します。この先頭への復帰は RESET と呼ばれます。RESET は、Keleusma プログラムにおいて実行が後方へジャンプする唯一の地点です。

本体を通過する各回が1サイクルです。上記のプログラムは input を yield し、再開時に渡される値を _ に束縛して無視し、最後の 0 に到達し、その後 RESET が次のサイクルのために先頭へと運びます。

パラメータは更新されます

パラメータ input は要求されるものではありません。各サイクルの先頭で、ホストがそのサイクルの input の値を渡します。ゲームは最新のコントローラ状態を渡すかもしれません。オーディオシーケンサは現在のティック番号を渡すかもしれません。プログラムは input を読み取り、毎サイクル、ホストからの新しいデータに応答します。

生産性規則

loop 関数は、毎サイクル yield でホストに値を渡さなければなりません。これは助言ではありません。強制されるものです。1サイクル全体を yield に到達せずに実行しうる loop は、実行される前に拒否されます。第19章でその拒否を示します。

音楽的な解釈は正確です。オスティナートを保持する演奏者は、毎小節何かを鳴らさなければなりません。復帰する計画もなく沈黙してしまう演奏者は、グルーヴを壊し、音楽を止めてしまったのです。生産性規則とは、言語がそれを起こさせないよう拒否することです。

プログラムごとに1つの loop

プログラムは最大でも1つの loop 関数を持ち、それを持つとき、その関数がエントリポイントになります。作品はその中心に1つのグルーヴを持ちます。

loop プログラムの実行

上記のプログラムを pulse.kel として保存し、実行してください。

keleusma run pulse.kel --tick-interval 1s

コマンドラインツールは、yield プログラムと同じティックカウンタプロトコルを通じて loop を駆動しますが、loop は決して終了しない点が異なります。ツールは tick = 1 でスクリプトを呼び出し、yield された各 Word を受け取り、次のティック間隔まで待機し、次のティック番号でスクリプトを再開します。--tick-interval フラグは 100ms1s1m1h1d1w のような人間が読める形式の期間を受け付けます。このフラグがない場合、loop はスクリプトが yield する速度で実行されます。実行中の loop を停止するには Control-C を押してください。loop は shell::exit(code) を呼び出すことで自身を停止することもできます。

同じプログラムは、後で実行するためにバイトコードファイルにコンパイルすることができます。

keleusma compile pulse.kel -o pulse.bin

このツールは wrote pulse.bin (2372 bytes) を出力し、プログラムが有効であることを確認します。第VIII部では、ピアノロールの中でより手の込んだ loop プログラム、すなわち楽曲を実行します。

この章のまとめ

  • loop 関数は決して終了しません。その本体を通過する各回が1サイクルです。
  • RESET は、各サイクルの終わりに本体の先頭へ復帰することです。
  • パラメータは、毎サイクルの先頭でホストによって更新されます。
  • loop は毎サイクル yield しなければなりません。この生産性規則は強制されます。
  • プログラムはloop関数を最大1つ持ち、それがエントリーポイントになります。プログラムはloop関数を最大1つ持ち、それがエントリーポイントになります。

上記の loop は、あるサイクルから次のサイクルへ何も記憶しないため、毎サイクル同じことを行います。次の章では、それに記憶を与えます。