ADR-42: 位置依存の名前解釈と窓インスタンス参照——適用の型規則
判断: 名前の解釈規則を「位置依存の名前解釈」の型規則として統一し、その新設面として
窓インスタンス参照 W(v)(year(2020)=その年の日々)を導入する(draft §1.25 の候補設計=
3 視点検証〈整合性コーパス・敵対・実装〉・指摘計約 40 件反映済み。設計者裁定 4 件〈2026-07-09〉:
意味論=逆像・dispatch=展開後判定・標準ラベル=year+month+Fiscal.year・ゼロマッチ=域外は
静的エラー。F64・F9 の解消、ADR-35 判断 4〈F53〉の統一受け皿)。
-
統一原理(受け皿): 名前の解釈は候補集合を出現位置の期待型で絞り、絞った後に複数の解釈が 残るなら黙って選ばない=曖昧エラー(ADR-17・ADR-35 判断 4 と同じ統治)。既存二面+新設一面:
位置 名前の種別 解釈 出典 軸位置( on:/unit:/axis:)premise 名 実体の正体判定+標準導出への読み替え ADR-35 判断 4(不変) 適用・点引数 W(d)ラベル源つき束縛 束縛名射影(点→値) ADR-30/34/39(不変) 適用・値引数 W(v)ラベル源つき窓束縛 窓インスタンス参照(値→点列) 本 ADR 既存二面の意味論は変えない——本 ADR は受け皿の一般原理を立て、三面をその実例として位置づける (spec には型の節の新設小節として置く)。
-
窓インスタンス参照の意味論=逆像。ADR-34 の定義的等式(点→値)の対:
W(v) ≡ W の要素点列 |> filter(d => W(d) == v)「W の要素点列」=W の定義が窓に束ねた入力点列のうち、W の窓に属する点(内部概念—— ユーザーが直接書く語は増えない)。
grid/span/split連鎖では原子グリッド(ADR-36 の 整列 G)の目盛りと同値、segmentByでは入力ストリームの点。この定義により未 snap マーカーの窓(ティティ級・G=なし)でも定義が立ち、濾過入力の窓で「窓の実要素でない点」が 混入しない(当初案〈原子グリッドの目盛り〉の構造欠陥 F93——検証で発見・修正)。- 解決値は時間ストリーム(型は増えない・I2)。
marineDay & year(2020)(F9 の正準形)が ADR-36 の整列検査と両立する据え方。 - 結果の整列は入力の整列を filter 保存で継承(
lunarMonth(6)=day 整列・ティティ級= 整列なし→&は ADR-36 が安全側で止め、coincidesの S 位置では使える)。 - ラベルが一意でなければ全マッチの和(
kyuMonth("六月")=毎年の六月)。番号ラベルは 一意キーではない——lunarMonth(6)は閏六月(前月番号の繰り返し)を含む。これは 全マッチ和の正しい帰結で、一意が要る問いは名前ラベル側か filter+序数で書く。 - 空窓(欠ティティ級)・ゼロマッチは空(ADR-15・正当な値。ただし判断 7 (g) の域外検査が先)。
- 用語の区別: 本 ADR の「要素点列」は窓の中身の実点、ADR-36 の「要素グリッド」は窓列の 幾何タグ(整列検査用)——別概念で衝突しない。
- 解決値は時間ストリーム(型は増えない・I2)。
-
輸送行の新設(ADR-37 の輸送表に一行): 「窓列 → 要素点列」の出力の註釈区間=窓列の 実効被覆域の補集合(segmentBy 行の継承)。マーカー覆域の外では要素点そのものが無く filter が 一度も走らないため、この行が無いと註釈の湧き口が消えて F61 と同型の黙った退化になる (F94——検証で発見)。F82 の 4 サイトに続く第 5 の窓リーダーサイト。規則由来の窓 (year/month)は覆域完全なので註釈ゼロ=既存例に波及なし。これ以外の輸送・覆域・整列は filter の既存規則(ADR-37 輸送表・F75 逆像拡幅・F82)からすべて従う——評価器の新機構は この一行を除きゼロ・新語彙ゼロ。
- dispatch=適用の型規則(F64 の解消)。引数式の型(ADR-25 の三型)で一意に分岐——
点なら射影、値(数値・列挙・文字列)ならインスタンス参照。
- ラムダ変数の型は束縛サイトの文脈で確定する(
filter/label:のラムダは点・spanの ラムダは窓序数=数値・値関数は本体の型付けから。「ラムダ変数=点型」という当初の字面は誤り ——F95・検証で棄却)。 - 判定時点は「糖衣展開後・実引数束縛後」(裁定=ADR-36 が整列を計算するのと同じ時点)。
判定時点では実引数の型が常に一意なので、判断 1 の曖昧エラーはここでは構造上発火しない。
自由なラッパ(
f = v => year(v))は呼び出しごとに型が確定する=多相を許容。 W(v)はストリーム期待位置のすべてで合法(頭位置・結合子被演算子・on:/unit:・coincidesの S スロット等)。純値位置(x = year(2020) + 1)のみ型エラー——ストリームは 値式に混ざれない(ADR-18 の型分離から従う)。year(2026-05-15)=射影=2026(日付リテラルは点)。日付リテラルの裸の値束縛 (d0 = 2026-05-15)の型は未規定の既存穴——F97 として F66(字句)と束ねて宿題。- EBNF はほぼ変更なし——頭位置の
name(args)は stream-atom に既在(糖衣適用が使用中)で、 弁別は意味規則。唯一の追補は stream-atom への修飾適用形C.W(args)(機構 A の修飾ピンGregorian.year(2020)——Fiscal 下で暦年を指す唯一の手——が頭位置に書けなかった穴の解消。 修飾ピンは射影・インスタンス参照の両面に同一に効く)。
図解(2026-07-13 追補・判断 1/2/4/7 の分岐——判断内容の変更なし):
flowchart TD APP["適用 W(arg)——判定は糖衣展開後・実引数束縛後(判断 4)"] APP --> T{"実引数の型は?(ADR-25 の三型)"} T -- "点(日付リテラル・点変数)" --> PROJ["束縛名射影(点→値): year(2026-05-15) = 2026<br/>(ADR-30/34/39・不変)"] T -- "値(数値・列挙・文字列)" --> W{"W はラベル源(label:/labels:)を<br/>持つ窓束縛?"} W -- "はい" --> INV["窓インスタンス参照=逆像(判断 2):<br/>W(v) ≡ W の要素点列 |> filter(d => W(d) == v)<br/>一意でなければ全マッチの和・整列は filter 保存"] W -- "いいえ(ラベル源なし・cycle・テーブル・点列束縛)" --> E1["静的エラー(判断 7 (a)(b))<br/>誘導: label: を付けるか filter 正準形で書く"] INV --> DOM{"ラベル値域が静的に列挙可能で<br/>v が域外?(labels: リテラル等)"} DOM -- "はい" --> E2["静的エラー(判断 7 (g)——month(2020) 級の<br/>タイポが黙って空になるのを封じる)"] DOM -- "いいえ" --> S["時間ストリーム(ゼロマッチ・空窓は正当な空)"] T -- "ストリーム" --> E3["静的エラー(判断 7 (e)——year(mondays) 級)"] - ラムダ変数の型は束縛サイトの文脈で確定する(
-
適用範囲=ラベル源(
label:/labels:)を持つ窓束縛のみ(表現力の必然基準)。cycle・ ラベル付きテーブルの逆像は台の点列が手元にあり filter 一行で書ける(everyDay |> filter(d => weekday(d) == Mon)・sekki |> filter(s => sekki(s) == 立春)——コーパス全数掃引で 全用例が既にこの形=退行ゼロ)。窓束縛だけは要素点列が premise 相対(原子が day とは 限らない)で、書き手が原子を知らずに済む自己完結の式が現行に無い。cycle・テーブルへの対称 拡張は将来糖衣の枠(意味論は判断 2 がそのまま延びる)。 -
stdlib への標準ラベル(裁定): Gregorian の
yearにlabel: (p => yearNo(p))・monthにlabel: (p => monthNo(p))、Fiscal のyear上書き行にも同時付与(fiscal 解説 §5 の字面を §1 の正式定義へ昇格)。統治の明文化: 上書きはラベルを継承しない(label:は定義の一部)。 同時付与を怠ると (a) Gregorian で動き Fiscal で落ちる stdlib 内非一貫、(b)shiftBoundaryは base のlabel:を保存する(F65)ため「year 一行と同じ展開」の等価主張が観測可能に破れる (F96——検証で発見)。quarter・week は見送り(week は WKST・ISO 系と絡む・quarter は需要待ち ——誤導つきエラーで書き手に見える)。付与式は自己参照ガードに掛からない(yearNo/monthNoはepochOrdinal経由でラベル射影を呼ばない——ADR-34 判断 6 の除外どおり・impl 実証済み)。 - 静的検査群: (a) ラベル源なし窓束縛への値引数(「
label:を付けるか filter で書く」誘導。 ISOWeek 級はfilter(d => isoYearNo(d) == 2026)へ)、(b) 窓束縛以外(cycle・テーブル・点列 束縛)への値引数=filter 正準形へ誘導、(c) ラベル値の型域と引数型の不一致、(d) 細粒度 ストリームとの&は既存の整列検査がそのまま守る(誘導: 値述語yearNo(t) == 2020かcoincides——ADR-38 の使い分け規範に合流)、(e) 窓束縛へのストリーム引数(year(mondays)級)、(f)label:付与式内の自束縛への値引数適用(逆像は射影を内包するため無限再帰の 抜け道——ADR-34 判断 6 のガードを拡張・相互参照含む。ADR-34 に改訂節)、(g) ラベル値域が 静的に列挙できる束縛(labels:リテラル)では域外の値引数=静的エラー(裁定。month(2020)・month(0)級のタイポが「註釈なしの空」で黙って流れるのを封じる——射影側の ミスが硬エラー〈ADR-36 判断 7 の前提〉なのに値引数側だけ緩い非対称の解消。計算ラベル 〈label:式〉は列挙不能なので「該当なし=空」のまま=多マッチ設計の裏面として明文化)。
却下した案:
- 窓値型の新設(
year(2020)を「窓オブジェクト」で返す)——ADR-30(レコード型)・ADR-34 (案 B=窓値)で二度却下した型拡張と同じ筋。点列で返せば&の正準形(F9 の動機)に直結する。 - 窓記法の拡張(
within(year, instance: 2020)級)——新 named-arg が増え、動機から遠い。 - 暦座標への暗黙フォールバック(ラベル源なしでも
yearNoに黙って落ちる)——ADR-16 「省略の統治」に反する魔法。ラベル源の明示が premise 相対の意味(ADR-16)を守る。 - 全ラベル源への値引数適用——表現力の必然が無い(filter 一行)。将来糖衣の枠として空ける。
- 要素点列=原子グリッドの目盛り(当初案)——segmentBy 窓で未定義・濾過入力で混入 (F93・検証 critical)。入力点列ベースへ修正。
- 引数型が定義体から一意でない束縛の静的エラー(dispatch の代替案)——明示志向には合うが、 ラムダ本体の型推論という新しい静的機構が言語に入る(ADR-25 はラムダの型規則を持たない)。 展開後判定は ADR-36 の先例に乗り機構ゼロ。
検証記録: 候補設計を 3 視点並列(整合性+コーパス全数掃引・敵対・実装可能性)に掛け、
critical 2 件を含む指摘計約 40 件を裁定前に反映した。当初案の構造欠陥は F93(要素点列の
原子グリッド定義が segmentBy 窓で未定義・濾過入力で混入)・F94(輸送行の欠け=覆域外で黙って空)・
F95(dispatch の「ラムダ変数=点型」根拠崩れ)、stdlib 波及は F96(Fiscal.year のラベル非継承と
shiftBoundary 等価の破れ)、新出の宿題は F97(日付リテラルの裸の値束縛の型が未規定——F66 と
束ねる)。コーパス全数掃引(ラベル源束縛 20 件の表)で cycle・テーブルの締めは退行ゼロ、
過去の投機的字面 everyDay & sekkiMonth(寅)(02 §2.5)が本 ADR でそのまま立つことを確認。
impl 試作(約 70 行)で全正準例(year(2020)・month(5) & year(2026)・F9 の元例・
kyuMonth("五月"))の動作と 301 テスト無傷・逆像の窓単位評価最適化(naive filter の 1/5〜1/25)を
実証済み。
帰結:
-
F9 の正準例が立つ:
# 2020 年だけ海の日を移動(東京五輪)——「移動元」を式で指す marineDayActual = (marineDay \ year(2020)) | [2020-07-23] covering: .. kyuMonth("六月") # 旧暦の六月の日々(毎年・名前ラベル) month(5) & year(2026) # 2026 年 5 月——インスタンス参照どうしの積(同一 G) - spec: §2(型と層)に統一原理+dispatch 表の新設小節・§4.9 に逆像の意味論本体(束縛名射影の
双対として射影一族の表に行を追加)・§5.6 EBNF は stream-atom の修飾適用形のみ・glossary に
「窓インスタンス参照」「要素点列」。§4.9 の残骸
lunarMonthNo(d)(ADR-39 廃止語)も同時修正。 - stdlib: gregorian(year/month の label:)・fiscal(year 上書き行の label:・§5 の字面を §1 へ 昇格・US 型の終了年ラベル例)。
- ADR-34 に改訂節(自己参照ガードの拡張=判断 7 (f))。ADR-35/36/37/38 は不変(本 ADR は 受け皿の一般原理と新設面のみ・既存面の意味論を変えない)。
- reference: 分岐案内の追補——
sekkiW("立春")〈節の期間〉vssekki |> filter〈節気点〉の対比・coincidesの S 位置エラー文言に「特定インスタンスなら W(v)」・roll の軸に短い軸 (on: year(2020))で着地なし=註釈なしの空・premise 相対の罠(Fiscal 下のyear(2020)は 年度——逃げは修飾ピンGregorian.year(2020))・year(d)とyearNo(d)の二綴りは暦座標糖衣が 正準(label:は主に逆像の資格付与)。 - impl: dispatch(WindowsV/StreamV+wins の二表現に対で実装)・逆像(窓単位評価の最適化は 「ラベルは窓ごとに一定」〈ADR-34 の構造保証〉から外延等価で合法)・輸送行(判断 3)・静的 検査群 (a)〜(g)・stream-atom の修飾適用・stdlib 同期。切れ端窓(impl 制約)のラベルずれは インスタンス参照で「別の年への漏れ」に増幅される——除外か警告(impl/README 注記)。繰り返し 使う参照は premise 束縛に置く誘導(F80)。
- 残る宿題: F97(日付リテラルの裸の値束縛——F66 と束ねて字句・型の同時確定)・cycle/テーブルへの 対称糖衣(需要待ち)・F51/F66(純命名の一括——本 ADR は新語彙ゼロのため合流物なし)。
改訂(2026-07-09・ADR-43)
- F97 解消: 日付リテラルの裸の値束縛は合法と確定(時点は値型の一員=ADR-43 判断 3)。 判断 4 の dispatch 表は「点→射影・点以外の値→インスタンス参照」と読む(変数経由の点も 展開後判定で正しく射影に分岐——「点は値束縛できない」という暗黙前提は不要になった)。