ADR-34: label: 付与式の束縛規則——ラムダは窓の先頭点を受ける
判断: label: 付与式(窓生成時にラベルを与える named-arg。名と大枠は ADR-30 (5) で確定済み)の
束縛規則を次のとおり確定する。
-
ラムダは「窓の先頭点」(代表点)を受ける。
label:を取るのは窓を生む形——premise 層の 窓生成語span・split・grid(後置 named-arg)と本体層のsegmentBy(括弧内 named-arg)——で、cycleは自前のラベル列を持つため取らない(明示エラー)。label: (p => 式)のpは各窓の 先頭点であり、意味論は一行の定義的等式で尽きる:名前(d) ≡ 付与式(d の属する窓の先頭点)束縛名がそのまま射影名(ADR-30)・読み書きとも「点 → 値」で型が閉じる。
snapTo(w)が同じ 「点 → 属する窓の先頭点」写像のストリーム版である(F41 の整理)ことと噛み合う。 - 評価は射影時・遅延。窓生成時に全窓分を評価しない(I7 のオンライン性・被覆域の端で不要な
エラーを踏まない)。付与式内の裸名は premise 相対・遅延解決(ADR-17)——派生が
yearNoを 上書きすればラベルも追従する。「同じ窓の全点が同じラベル」の一貫性は、引数が代表点に正規化される ことから構造的に立つ。 - ラベル値の型域は値型(数値・列挙名・文字列・リスト要素)。年度ラベルは数値でよい。
- 点±幅の値式算術(
p + 3d等)は導入しない。導入動機だった「ISO 週の木曜→年」(ADR-30・ spec §4.9 の例示)は F57 の等価変形で label: 自体が不要と実証済み。導入するとp - 1dで 隣接窓参照の禁止(I7・ADR-27 却下案)への抜け道が開き、幅規約(ADR-12/28)と tz 依存算術 (ADR-33)を値式層へ持ち込む三重のコストを払う。これに伴い spec §4.9・ADR-30 の「別の点の窓参照は 可」は「代表点に対する任意の窓・射影の参照」に精密化する(全動機が代表点で書けることは実証済み ——年度ラベル・旧暦月名は stdlib(fiscal §5・kyureki §7)、節気名は 40-examples/04 と impl のテスト。 意味論の縮小ではなく明文化。ADR-30 に改訂節を追記)。 - 窓序数の入手は補助束縛経由。並行リスト(旧暦の
monthNos)は無ラベルの補助窓束縛を先に立て、label: (p => monthNames[epochOrdinal(lunarMonthW, p)])と読む。あわせて F60 を確定する:epochOrdinalは、窓列が紀元を含むなら従来どおり紀元窓 = 0(以前は負)、紀元まで届かない データ由来窓では「存在する最初の窓 = 0」(ADR-31 改訂 2)。 字面が重ければ 2 引数形(p, n) =>を将来の追加拡張として足せる(1 引数の意味は不変)。 - 自己参照は禁止。付与式が定義中の束縛名自身(または相互)のラベル射影を呼ぶ形は明示エラー
(隣接窓参照禁止の裏面。序数計算
epochOrdinal(自窓, p)はラベルに依存しないため対象外)。
代表用例(すべて確定語彙のみ・追加機構ゼロ):
# 年度ラベル(開始暦年)——読み側の値関数 fiscalYearNo と観測一致
year = month span (_ => 12) phase: 3 label: (p => yearNo(p))
# 旧暦月名——並行リスト(データ側=F37 の現実解)を序数で引く
lunarMonthW = day |> segmentBy(lunarStart, edges: drop, empties: error)
kyuMonth = day |> segmentBy(lunarStart, edges: drop, empties: error,
label: (p => monthNames[epochOrdinal(lunarMonthW, p)]))
背景: RC2 は label: の名と大枠(本体層の式・別点窓参照可・隣接窓不可)だけを確定し、束縛規則は 未確定のまま stdlib 拡充で仮字面が 2 か所(fiscal・kyureki)に増えた。候補 A(先頭点)・B(窓値)・ C(生成序数)・D(複数引数)を三大用例(年度ラベル・旧暦月名・節気名)+ISO 週番号で書き下ろして 比較した結果、生きている動機は A が全部書け、意味論が定義的等式一つに収まり、型も機構も増えない。
却下した案:
- B: 窓値を受ける(
label: (w => …))。窓の内部・末尾参照ができ隣接窓禁止が構造で立つ利点は あるが、値型に第 4 の型(窓値)とアクセサ族の新設を要し、ADR-25 の三型体系と ADR-30 の「型を一切 増やさない」(レコード型却下)の論拠を崩す。F57 以後、B 固有の表現力の生きた動機はない。 - C: 生成序数を受ける(
label: (n => …))。並行リストの直読みは最短だが点参照が一切できず、 確定済み ADR-30 (5)「別点の窓参照は可」と正面衝突する(採るなら ADR 改訂が要る)。序数の需要は 補助束縛経由(判断 5)で回収した。 - D: 2 引数
(p, n)。実質は A の糖衣(n = epochOrdinal(自窓, p)で復元可能)。必要になったら 後方互換で足せるため 1.0 では見送り。 - 点±幅算術の導入。判断 4 のとおり(隣接窓への抜け道・幅規約と TZ の値式流入)。
帰結:
- spec §4.9 の付与側の記述を確定形に更新(束縛規則・定義的等式・「別点」の精密化)。EBNF は変更なし (label は既存の param-key)。
- stdlib の仮字面を具体化: fiscal.md §5(
label: (p => yearNo(p)))・kyureki.md §7(5)(上の 代表用例の形)。iso-week.md §4.2 の「束縛規則は未確定」を確定に更新。 - リファレンス実装に実装する(射影時遅延・自己参照ガード・窓の先頭点渡し)。切れ端窓(有界実体化の 端。F59 の近似)のラベルは先頭点由来の値になり真の暦とずれる——実装制約として注記。
- 射影はラベル付き束縛名に限る——ラベル付き窓を
withinで被せた別名の束縛からは読まない (ADR-30「束縛名がそのまま射影名」の範囲を広げない)。 shiftBoundaryは base のlabel:を保存して展開する(spec §3.7 の展開式に追記)——切断ノブと ラベルノブは直交(本 ADR の年度ラベルの整理)なので、位相をずらしても付与式は新しい窓の先頭点で 評価され続ける。- 束縛名射影の一般化により
year(d)(点→年度)が立つ一方、宿題 F9 はyear(2020)(値→窓)を 望んでいる——同名適用の二義の芽を F64 として記録(型で振り分け可能だが要規定)。
改訂(2026-07-09・ADR-42)
- 判断 6(自己参照ガード)の対象を拡張:
label:付与式内の自束縛への値引数適用 (窓インスタンス参照自束縛(v)——ADR-42)もガードの対象とする(相互参照含む)。逆像は 定義上ラベル射影を内包する(W(v) ≡ 要素点列 |> filter(d => W(d) == v))ため、字面どおり 「射影を呼ぶ形」だけを検査する実装はW(v)経由の無限再帰を見逃す——検証(ADR-42)で発見。 - 帰結末尾の F64(同名適用の二義)は ADR-42 で確定——引数式の型による dispatch
(判定時点は糖衣展開後・実引数束縛後)。
year(2020)(F9)も同 ADR の窓インスタンス参照 (逆像)として確定。