第16章 yield、ホストとの対話
この章の目的
この章を終えるころには、プログラムとそのホストとの間のやり取り、およびそれを実行する yield 式を理解できるようになります。
プログラムは単独で実行されるのではない
第1章では、Keleusma プログラムを楽譜に、ホストをオーケストラにたとえました。この描像は今や正確なものとなります。プログラムは単に自身で最初から最後まで実行されるのではありません。それはホストとの対話の中で実行され、yield はその対話の1つのやり取りです。
やり取り
yield は単一のステップで2つのことを行います。値をホストに渡し、そしてプログラムを一時停止します。それからホストは自身の処理を行い、準備ができるとプログラムを再開し、値を返します。その返された値が yield の結果となります。
これはメトロノームのティックです。ティックの際、プログラムはホストに値を渡して停止します。ホストが動作します。次のティックの際、ホストはプログラムに値を渡し、プログラムは続行します。
プログラムでは、このやり取りは let の一部として書かれます。
let reply = yield question;
次のように読んでください。question をホストに渡し、一時停止し、ホストが再開したら、それが返す値を reply とします。
yield を使うプログラム
yield main(input: Word) -> Word {
let reply = yield input;
reply
}
このプログラムは値 input とともに開始されます。プログラムは input をホストに yield して一時停止します。ホストは何らかの値でそれを再開し、その値が reply となります。プログラムはその後 reply を返して終了します。
対話
すべての yield において2つの型が関わります。渡し出される値の型と、返される値の型です。これらが合わさって、プログラムとホストとの対話、すなわち合意された対話の形を形成します。上記のプログラムでは両方とも Word です。プログラムは Word を yield し、Word で再開されます。
yield するプログラムを実行する
上記のプログラムを echo.kel として保存し、実行してください。
keleusma run echo.kel
出力は次のとおりです。
1
コマンドラインツールは、ティックカウンタープロトコルを通じて yield するプログラムを駆動します。ツールは tick = 1 でスクリプトを呼び出し、スクリプトは input(これは 1)を yield し、ホストは次のティックである 2 で再開し、スクリプトは再開された値を返します。ツールは返された値を表示し、プログラムは終了します。yield するプログラムは、終了する前に何度も一時停止と再開を繰り返すことがあります。第VIII部では、より手の込んだもの、すなわち曲を、ピアノロールの中で実行します。
同じプログラムは、後で実行するためにバイトコードファイルにコンパイルすることもできます。
keleusma compile echo.kel -o echo.bin
このツールは wrote echo.bin (2316 bytes) のような行を出力します。その行は、プログラムが字句解析、構文解析、型検査を通過し、構造検証器を通過したことを意味します。
この章のまとめ
- Keleusma プログラムは、そのホストとの対話の中で実行されます。
yield valueはvalueをホストに渡し、プログラムを一時停止します。- ホストが再開すると、ホストが返す値が
yield式の結果になります。 - yield で出される型と再開時に入ってくる型のペアが、対話を構成します。
- コマンドラインツールは、ティックカウンタプロトコルを通じて
yield mainプログラムを駆動します。プログラムはエントリ関数から制御が戻ったときに終了します。 keleusma compileは、後で実行するためのバイトコードファイルを生成します。
次の章では、決して終わらない関数、すなわち loop を扱います。