ADR-30: 射影一族の内部設計を確定する(二窓 ordinalIn・labelOf 廃止・点はラベルを格納しない)
判断: ADR-27 で導入した窓→値の射影一族の内部設計を、綻び出し(40-examples/04-projections.md・
F34〜F42)を経て次のように確定する。
ordinalInは二窓引数ordinalIn(u, w, d)——「点dが属するw窓の中で、dが属するu窓が 第何番目か」(1 起点)。数える単位uを明示するため、入力ストリームの粒度に依存しない。epochOrdinal(u, d)は枠を紀元にした版(紀元からのu窓通し序数)。labelOf(汎用語)は廃止。ラベルは「点 → 値の射影」であり、ラベルを持つ窓/サイクルの束縛名を 点に適用して読む(weekday(d)・sekkiName(d)・lunarMonthNo(d))。ADR-27 が「読む側」に置いたlabelOf(w, d)は、ADR-25/§1.16 で確定済みの「cycle 束縛名は点→ラベルの値関数」を全ラベル源へ 一般化すれば不要になる。- 点はラベルを格納しない。時間ストリームの点は基底位置(時刻)のみを持ち、ラベルは点→値の射影として
外にある。源は (i) cycle の律動、(ii) テーブルのラベル列、(iii) 暦座標の値関数の三つで、読む側は一様に
名前(d)。時間ストリーム型も値型も拡張しない(レコード型を新設しない)。 - ラベル付きテーブルリテラルは時点列に並行ラベル列
labels:を添える(ADR-26 の拡張)。時点[i]の ラベル=labels[i]。これが源 (ii) の定義データで、cycle(無限律動)とは別。 label:付与式は本体層の式(窓内の点の射影・他窓参照)を書ける。別の点の窓を参照する ISO 週番号 (週の木曜が属する年)・年度ラベルは可。隣接窓(前後の同種窓)参照は射程外(I7)。snapToは点変換として残す。公開境界語(窓→点)とは入口が違い補完。糖衣化は見送る。
暦座標 yearNo/monthNo/dayNo は epochOrdinal+ordinalIn+既存値関数(yearOf/monthOf)の糖衣で
あり、新規語ではない。読む側の中核は epochOrdinal・ordinalIn の二語+束縛名射影に収束する。
背景: ADR-27 は射影一族を「候補・仮称・綻び出し前」として導入し、labelOf/ordinalIn/epochOrdinal/
snapTo と付与 label: を並べた。40-examples の「要補完」例(六曜・旧暦月名・イースター時点化・固定日
祝日・ISO 週番号・立春選択)を実際に射影で書き直したところ(04-projections)、大半が書けた一方で六点の
内部設計が未決と判明した——引数が「何をどの枠で数えるか」で絡む(F34)、射影値が入力粒度に依存する
(F35/F42)、labelOf が読むラベルの源が三種で未区別(F36)、label: 付与式の表現力(F37/F40)、時点だけの
テーブルでは「立春」を意味的に選べない(F33/F38/F39)、snapTo が公開境界語と重複(F41)。
とりわけ「ラベル付きデータをどう持つか」で、レコード型(第 4 の値型)新設案が浮上したが、これは
時間ストリーム型の拡張と混同した筋の悪い案だった。点は時刻のみを持ち、ラベルは点→値の射影として
束縛名で読む——この一点を据えると、labelOf 廃止(源に依らず束縛名で読む)・テーブルのラベル列
(射影の定義データ)・cycle との統一(律動 vs データの違いは源だけ)がすべて同じ原理から出る。
却下した案:
ordinalIn(w, d)の一窓のまま。入力要素をそのまま数えるため「月の第何日」が入力粒度(日か時刻か)で 変わり、サイレント誤結果の余地を残す。二窓で数える単位を明示すれば消える。labelOf(w, d)の汎用語を残す。cycle 束縛名weekday(d)と二重になり、「どちらで読むか」の使い分けが 生じる。束縛名一本化なら源に依らず一様。- レコード型(
[{at:…, name:…}, …])を値型に新設。数値・論理・列挙・リストに次ぐ第 4 の型を導入し、 かつ「点が属性を帯びる」=時間ストリーム型の拡張とも読める二重の型変更を招く。点はラベルを格納せず 射影で読む方針なら、型を一切増やさずに済む。 snapToを「点→属する窓 |> first」の糖衣として廃止。「点→属する窓」を指す語が別に要り、かえって 語が増える。点変換として残し、公開境界語(窓→点)と役割分離するほうが素直。
帰結:
- 読む側の新規語は
epochOrdinal・ordinalInの二つ(ともに二窓/枠つき)に絞られ、labelOfは消える。 暦座標・六曜・イースター・固定日祝日・窓リセットは束縛名射影+既存語で書ける。 - 六曜の月名・旧暦月名は
label:付与(源 ii/データ併用)+束縛名で読む。閏月名は隣接窓参照が要るため データ(月名列)に倒す(ADR-27 の F24 と一貫)。 - ISO 週番号・年度ラベルは
label:付与式の「別点の窓参照」で書ける(隣接窓は不可)。 - 節気名は ADR-26 拡張(
labels:付き)で持ち、立春選択filter(s => sekkiName(s) == 立春)が書ける (F33 解決)。 - 時間ストリーム型・値型は不変(レコード型を作らない)。ADR-05/ADR-18 の型体系に触れない。
- 具体構文と各語の名(
ordinalIn/epochOrdinal/snapTo/label:/labels:)は 30-syntax §1.17 で確定。 名はなお仮称(1.0 で一括確定)。 - ADR-27 の「読む側」記述(
labelOfを含む表)は本 ADR で更新される(ADR-27 に改訂ポインタを追記)。
改訂(2026-07-07・F48): 本文 4 と帰結の例は、束縛 sekki = […] labels: […] に対し sekkiName(d) と
読んでおり、束縛名から Name 接尾辞の射影名を導出する規則があるかに見える(リファレンス実装で顕在化)。
規則はそのようなものではなく、束縛名がそのまま射影名(cycle 束縛名と同一の規則)——上の例は sekki(d) と
読むのが正しい。導出規則は存在しない。spec §3.8/§4.9・glossary は修正済み。
改訂(2026-07-08・ADR-34): 本文 5 の「別の点の窓を参照する ISO 週番号(週の木曜が属する年)・
年度ラベルは可」の「別点」を精密化する。束縛規則の確定(ADR-34=ラムダは窓の先頭点を受ける)に伴い、
付与式から名指せる点は代表点(先頭点)であり、「別点の窓参照」とは「代表点に対する任意の窓・射影の
参照」(例: 先頭点の属する暦年 yearNo(p))を意味する。例示していた「週の木曜→年」は点±幅算術を
要するため字義どおりには書けないが、ISO 週番号自体が F57 の等価変形(isoYear 窓の張り直し)で label:
なしに書けると実証されたため、生きた反例はない。点±幅算術は導入しない(隣接窓参照禁止への抜け道。
ADR-34 の却下案)。
改訂(2026-07-08・ADR-39): 本文 4 の並行ラベル列 labels: の適用先をテーブル(点)から
segmentBy 窓列へ一般化する(F62 の器=同長性検査を宣言に錨する。窓列序数・前提条件・締めの詳細は
ADR-39)。「点はラベルを格納しない」の原理は窓版でも維持——窓列は区間のみ・ラベルは束縛に付く射影の
定義データ。あわせて ADR-34 判断 5 が示した補助束縛パターン(label: ラムダ+epochOrdinal の
並行リスト引き)は「labels: に乗らない計算ラベル用」に位置づけを再配置する(データ列を貼るだけの
用途は labels: が正準・添字式が要る計算だけ label: ラムダ)。