ADR-46: 外部供給宣言 external——実行時に解決されるテーブルリテラル(socket の確定)
判断: 外部供給宣言(socket)を言語に採用し、次のとおり確定する(発報層実装からの第一次
還流〈生成方式の実測痛点 2 件=静的ソース不可・統治の焼き忘れ〉を受けた要否込みの裁定。候補設計
draft §1.27=3 視点検証済み・設計者裁定 2026-07-14〈採用・宣言語 external 確定〉を経た ADR 化。
ADR-26 が先送りした「式に埋める/器で受ける」の使い分けの確定であり、ADR-36 帰結〈器は整列の
主張を含む〉・ADR-37 帰結〈器は被覆主張を含む〉の受け皿)。
-
設計の核=「実行時に解決されるテーブルリテラル」。新しい型・新しい代数は導入しない。 external 束縛の解決値はテーブル値そのもの(点列・covering・asof・labels?)であり、テーブル リテラルが字面で運ぶ静的性質だけを、字面が無い代わりに宣言で先取りする。解決値には リテラルと同一の統治検査が供給契約として課される。観測面(範囲外註釈・被覆サマリ・残走路・ 整列検査・正体判定)は既存の器のまま——新設ゼロ。
-
形と位置:
名 = external(kind: dates | instants [, labels: [値域]] [, source: "…"])。 premise 束縛の右辺(先頭)限定——本体層・前文下の top-level 束縛・ラムダ内・引数位置・ 引数つき束縛は静的エラー(誘導つき。source:/tz: の統治が premise に要る——文法で縛らず意味層 検査に置く=ADR-45 判断 5 と同型)。パイプ合成は可(external(…) |> snapTo(day))で、出自の 焼印は external 評価点で束縛名を焼く。externalは予約語(core 語再定義エラーの面)。 EBNF の変更は無し(頭位置name(args)は stream-atom で導出済み・named-arg のキーは param-key にkindを追加・kind 値dates/instantsは列挙ラベルと同じ位置依存のキーワード 解釈=ADR-42 の統一原理)。 -
kind: =整列の主張(静的・宣言が字面の代役):
dates=定義側 tz の市民日グリッド整列/instants=整列なし(ADR-36 判断 2 のテーブル規則の二分類に正確に対応)。整列は宣言から 静的に決まり、解決値の行数・中身に依存しない——空でも宣言どおり。ADR-45 の空虚適合は 字面規則の帰結であり external には適用しない(宣言があるのに使わないのは主張の放棄)。 帰結として、ADR-45 が原理的限界として引き受けた「0 行→1 行で整列が変わる」非連続を external は宣言で解消する。契約検査は字面でなく幾何(dates=定義側 tz の各市民日の最初の瞬間 ——wire が日付字面のため錨打ちの構成で保証される)。 -
labels: =値域の列挙宣言: ラベル語彙は静的知識(裸名の比較の名前解決・ADR-42 判断 7 の 域外検査)のため、有無フラグでなく値域を列挙する。解決値のラベルは値域内・時点列と同長。 無宣言の external にラベルが到着したら契約違反(ADR-39「黙って捨てない」の統治)。
-
統治の随伴——「要求は器・内容はデータ」:
source:は必須(premise メンバー・束縛ごとの named-arg 上書き可)。covering と asof は解決値が必ず運ぶ(欠落=契約違反——asof 焼き忘れ 〈還流痛点 (2)〉を契約で消すには asof も必須。ADR-37 帰結の精密化=器が含むのは被覆の要求・ 主張の内容はデータが運ぶ)。解決値 asof の効力は当該束縛の出自属性(註釈・被覆サマリ)に 限り、premise の静的asof:(版ピン)と食い違うときは被覆サマリに常時表示(黙って上書き しない)。external を持つ premise はtz:宣言必須(ADR-37 判断 1 の延長——covering 端と dates の錨は定義側 tz で解決=ADR-35 判断 8)。束縛後置の covering:(ADR-37 判断 5)は従来 どおり付けられる(必要条件検査は解決時に走る)。 -
解決の意味論(純粋性 I7 との整理): 解決は評価文脈の随伴であり評価中の副作用ではない (先例=
asof: latest・tzdb の版供給〈ADR-33 判断 3〉)。要求駆動=評価内の初回参照時に 一回解決(ADR-33 判断 8 の tz と同型・未参照の external は解決されない)。スナップショットの 単位は〔定義側 premise・束縛名・上書き後の source:〕——with 派生・多文脈・修飾参照は同一 スナップショットを見る(解決子に渡すのも定義側 premise 名)。錨打ち・covering 端の解決は評価 文脈ごと(リテラルの再錨と同型)。スナップショット識別(解決値 asof)はメモ化の文脈キーに 参加する(ADR-35 帰結の延長——常駐評価器での版差の誤共有の封じ。run ごと生成の参照実装は 構成で適合)。評価はスナップショット相対で純粋・決定的——spec §7.8 の決定性は「同一 スナップショット相対」の条件つきに改稿する。解決の手段は言語が規定しない(ADR-15—— 言語は器〈宣言・契約検査・エラー分類〉まで)。 -
エラー分類: (a) 解決失敗=評価エラーの機械可読な部分類(供給エラー)——実装系は本 部分類を boot 検査から除外して劣化運転に落としてよい(還流 §3-1 の実測「インフラ失敗を boot throw に含めるとプラットフォーム全体を巻き込む」に適合するための識別の器。言語が規定するのは 「黙って空にしない」まで)。(b) 契約違反(covering/asof 欠落・kind 不一致・乱順/重複・包含・ labels 同長/域外/無宣言到着・日付の実在〈ADR-43 の字句検査の解決値向け再執行〉・数値の 有限性)=評価エラー(ソース/契約の不正=boot 検査対象。リテラルと同一の文言体系・根拠は ADR-33 判断 9〈データ相対エラーの並置は拡張〉)。(c) 空データ(0 行+covering)=正当な値 (ADR-45——「まだ無い」と「解決失敗」が型で区別される)。
-
wire 形式は kind ごと:
dates=市民日付の字面("YYYY-MM-DD")——言語側が錨打ちする (派生の tz: 上書きで再錨可能・DST 隙間日の day 開始も言語側に一元化)。instants=epoch ms (壁時計字面は DST 重複で二意になり得るため)。covering は covering-list の字面(端の含意・ 年略記・開端・区間リストの意味論をリテラルと完全共有)。
背景: 第一段(発報層)はソース生成方式で回ったが、(1) ソースが静的でいられない(日次再実体化 ごとに再生成=プロバイダ形・ソース差分検査・毎回再パースの回り道)、(2) 統治の焼き忘れ(asof を 生成器が焼くまで観測面が欠けた)の 2 痛点が実測で確定した。external の採る価値は検証で較正済み—— 統治の検査が言語に移る(評価器は従来から昇順・包含・同長を検査済みで、新規は covering 必須化・ asof 必須随伴・整列主張の宣言・ラベル値域の静的化の 4 点)のであって、写経そのものが消えるのでは ない(覆域の算出・昇順化・asof の正しさ・版規律は解決子に残る)。対価は「実行時解決」の概念 (評価文脈の随伴に整理でき純粋性は保てる)と、監査・再現の担い手の移動(生成方式では生成 ソースが完全な証跡・external ではスナップショット保存が実装系の責務)。
却下した案:
- 生成方式の継続+作法の文書化。写経(生成器が言語統治を肩代わり)が残り、焼き忘れクラスは 規約頼みのまま。
- 生成方式の継続+検査ツール(linter)。焼き忘れ検出は得るが、式が静的に戻らない(プロバイダ 形・差分検査の回り道は残る)。
- 宣言語
socket。英語版文書の ADR-15 の比喩 “socket” と同綴り別義になる(掃引で確認)。 - labels の有無フラグ。ラベル語彙が静的知識にならず、裸名比較の名前解決が評価順依存で壊れる (検証の発見)。
- 空解決値への空虚適合の適用。整列という静的性質がデータの行数で変わり ADR-36 の原則に反する (検証の視点間衝突を「宣言どおり」で裁定)。
帰結:
- 既存の式の意味は変わらない(新宣言の追加=追加拡張。リテラル・生成方式の挙動も不変)。
- spec: §3.8(external の規範新設)・§5.2/5.3(シグネチャ)・§5.4(命名確定行)・§5.6(param-key
へ
kind追加・注記)・§7.8(決定性の「同一スナップショット相対」条件)・glossary。 reference/external.md 新設(doctest 込み)・table-literal.md(使い分け)・README(# resolve:規約)。ADR-26 に改訂節(使い分けの確定)。 - impl: 解決子フック(RunOptions.resolve・同期)・SupplyError(機械可読部分類)・evalExternal+
契約検査・スナップショット(socketCache=定義側単位)・位置/tz/source の静的検査・予約語。
external.test.ts 35 本(観測等価・契約違反 12 種・スナップショット一回性・位置/統治)+doctest
# resolve:ディレクティブ。 - 90-open-questions の socket 項・供給モデル項は確定で消し込み。発報層への指示書に追補 (第二段で生成方式から乗り換え可)。