Main・補助再生ヘッド・時計
実行順序、入力所有権、表示寿命と時計ゲート
本ページは 2026-10-22 に確認した新契約です。実装・検証は進行中で、ソース更新だけでは公開 Reader やインストール済みパッケージは更新されません。
実行と表示を分ける
Section titled “実行と表示を分ける”セッションには入力を独占する Main が一つあり、補助再生ヘッドは自動実行します。セクション自体に主/補助の役割はなく、同じセクションを複数のヘッドが実行できます。位置、呼び出し、ループ、既定時計は各ヘッドが保持します。
Main のテキストと空の : は既定で手動入力を待ち、通常の独立した # は自動進行します。クリックは表示方針を経由し、全文即時表示だけになることもあります。補助は出力後、次の at または Core の制御境界まで直ちに続行します。文字表示、読書推定、wait/next/AUTO、duration を待ちません。
#.clock(name="song")#.track(source="Lyrics", name="lyric"): この旋律を聴いてください。#.awaitTrack(name="lyric"): 歌詞の実行が終了しました。-> end
=== Lyrics === : 一行目。 .at(value=1, clock="song").duration(seconds=1) : 二行目。 .at(value=3, clock="song")at のない補助テキストは同じ処理内で連続出力でき、表示先にかかわらず各ヘッドの最後の文だけが残ります。これは有効な書き方です。過去の閾値も副作用を含め通常どおり実行し、効果の種類で自動破棄しません。ゼロ時間ループには実行予算が適用されます。
補助の作成・停止・待機
Section titled “補助の作成・停止・待機”track/stopTrack/awaitTrack は Main だけが実行し、補助では無視します。補助は選択肢コンテナ全体、分岐、付属タグを読み飛ばし、消費履歴も変更しません。Main の選択規則は従来どおりです。
#.track(source="Lyrics", name="lyric") は名前付きインスタンスを作成します。name を省略すると匿名になり、節名をインスタンス名として補いません。同じ節を複数インスタンスで再生できます。名前付きは一つの宣言位置からセッション中一度だけ開始し、終了後に同じ宣言へ戻っても再開しません。匿名は実行するたびに新しく作成し、外部から名前で停止/待機できません。
track はインスタンスを作成してキューに入れるだけで、初期化の実行完了は保証しません。Main が初期化結果を使う場合は #.track(source="Init", name="init").await で節の完了を待つか、共有宣言を Main で先に実行します。匿名の #.track(source="Init").await はそのインスタンスを待ち、awaitTrack(name=...) は先に開始した名前付き補助を待ちます。.await は引数を取らず、同じ通常の # アンカー内で track の直後に置きます。通常の track は並行実行のままです。
#.stopTrack(name="lyric") は実行中の対象を停止します。未作成/終了済みなら何もしません。将来の作成も取り消しません。#.awaitTrack(name="lyric") は停止まで待つ Core ゲートで、advance では越えられません。終了済みなら直ちに続行し、未作成なら将来の作成を待たず位置付き診断を出します。存在しない名前も診断します。
Main の終了はセッションを終了し、補助も停止します。全補助の暗黙 join はなく、必要なら await を記述します。実行の停止は画面消去ではありません。補助が 10 秒で末句を出して EOF に到達した場合、その時点で完了し、表示は 12 秒まで残せます。末句を終了通知より先に届けます。
時計と入口ゲート
Section titled “時計と入口ゲート”#.clock()はそのヘッドの匿名既定時計を新規作成します。新しいヘッドの既定は空で、継承しません。匿名時計は既定から外れれば解放し、過去の既定へ戻るスタックは持ちません。#.clock(name="song")は全体の名前付き時計を宣言し、既定には設定しません。同名の宣言位置は一つです。初回実行で作成し、以後はリセットせずセッション終了まで再利用します。#.defaultClock(name="song")は作成済み時計を選びます。作成/リセットはしません。jump/call は暗黙変更せず、return も以前の既定を復元しません。#.resetClock()は現在の既定、#.resetClock(name="song")は指定時計をリセットします。ID は保持し、内蔵はゼロ、外部の操作はホストが担当します。
at(value=6) は現在の既定時計、at(value=6, clock="song") は名前付き時計を使います。実行が入口に到達してから、既知の値が閾値以上になるのを待ちます。前のセリフの advance を生成しません。Main が 3 秒で確認すれば 6 秒まで入口で待てますが、未確認なら時刻が来ても割り込みません。ゲートは同じアンカーの全タグより先なので、同じ行の時計宣言で最初の参照を満たせません。
source はホストが解釈する文字列で、#.clock(name="song", source="music.position") 自体は音声を再生しません。空文字列は省略と同じで、ホストが生成を引き受けなければ内蔵秒時計を使います。外部は任意の有限数値でよく、単位はホストが決めます。一時的に値がなければ待機し、他の実行可能なヘッドは続行します。値の後退は実行を取り消しません。getter/reset 例外はバックグラウンド診断とし、値を推測したりゲートを飛ばしたりしません。
Web/WASM Reader は music.position を現在の BGM プレーヤーの実際の再生位置(秒)として明示的に解釈します。.bgm(...) で再生してから参照します。一時停止やシークは実際のプレーヤーに従い、停止中、読み込み未完了、エラー時は値がありません。他の未定義の外部数値源は模擬せず、クリックで閾値を代入したりゲートを飛ばしたりしません。VS Code 内蔵プレビューは現在音声を再生しないため、この数値源は利用できません。
BGM の開始/変更は Main の独立した指令で先に行い、後続アンカーで新しい曲に依存する補助を開始してください。同じアンカーや補助内での変更にはメディアの確認境界がなく、同じ Core 処理内では前の曲の値を読む場合があります。
Sequencer.OnOutput の StoryOutput を Sequence 順に処理します。種類は Content/LanguageRefresh/TrackEnded/SessionEnded です。発生元 ID、任意の名前、IsMain、内容 Token を持ちます。処理後の活動ヘッド一覧だけでは、同じ処理で終了した補助の末句を失うため、イベントの代わりにはできません。LastOutputs は直前の操作バッチだけを保持します。
GetRetainedPresentations() は各ヘッドの現在の表示だけを保持し、後続に置き換えられていない終了済み補助の末句も含みます。撤去後は ReleaseOutput(token) で解放します。表示先はタグ/ホスト設定が決め、名前を自動的に UI 名にはしません。次の文に入ると、表示先にかかわらず同じヘッドの前の文を撤去します。空 :、指令出力、選択肢も置き換えます。次の at/await での待機中は前の文を残せます。旧 duration/フェード通知は新しい表示を消せず、表示の存続は古い入力権限を復活させません。
入力は Main の現在の識別にだけ渡します。文字完了は表示コントローラーの責務で、補助を止めません。時計 delta は一フレーム一度だけ供給します。言語更新は進行、数値源の取得、副作用の再実行を行わず、終了済み補助の保留表示も更新できます。
制御フローと移行
Section titled “制御フローと移行”jump はスタックを消去し、call は積み、すべてのヘッドが明示的 return を必要とします。Main の名前付き節 EOF/end は後続ルートへ進み、補助の名前付き節終了は補助自身を終えます。
旧 #parallel/#lane はセクション、track、必要な await へ明示的に移行します。旧実行規則は残さず、入れ子や反復 join は再構成が必要な場合があります。外部ファイルは明示 URL が必要ですが、形式とエンジンの読み込み方式は延期です。source をファイルパスと推測しません。イベント信号、保存、race、pause は別の議題です。
