ADR-28: 日付・幅リテラルの字句を確定する
判断: 日付リテラルは ISO 8601 のサブセット YYYY-MM-DD・YYYY-MM-DDThh:mm(:ss(.fff)?)? とし、
TZ 指定子を持たない——基底への錨は在圏 premise の tz: が打つ(I6)。幅リテラルは 数値+単位 の
並びで、d=市民日(規約幅)、h/m/s=経過時間とし、市民時と経過時間の混合は静的エラー
(1d12h は不可、24h39m35.244s は可)。値式に整数除算 div・リストリテラル […]・添字 l[i]
(0 起点)・所属述語 in を加える。識別子・列挙ラベルの字句は Unicode 文字を許す(漢字ラベル可)。
値束縛の置き場は premise ブロック内とファイル top-level の二箇所(top-level は糖衣定義と同じく在圏
premise で遅延解決)。
背景: 日付リテラルは anchor: 2000-01-03(cycle の位相)以来、例のあらゆる場所で使われながら一度も
定義されていなかった(spec §5.4 も「未確定」と明記)。テーブルリテラル(ADR-26)の導入で使用箇所が
一挙に増え、字句の未定義が RC の穴として顕在化した。幅リテラルも同様で、1d(市民日)と 86400s
(経過時間)の規約の区別は ADR-11/12 で確定済みなのに、字句そのものは未規定だった。div・リスト・
添字は stdlib/gregorian.md の Gregorian 定義自体が既に依存している(yearOf(m) = 紀元年 + m div 12、
monthLengths(...)[monthOf(m)])——標準ライブラリが使う語彙が目録に無い状態の解消は RC の前提。漢字
ラベルは干支(甲・子…)の検証(40-examples 02)で浮上した(綻び F14)。in は選日の対応表(F20)。
却下した案:
- 日付リテラルに TZ 指定子(
2026-02-11+09:00やZ)を許す案。同じ式の意味が premise 相対である (ADR-16)のが言語の背骨で、リテラルに錨を埋めると premise と二重供給になり、取り違えがサイレント 誤結果を生む。錨はtz:の一元管理とする。 - 月日のみの年次再帰リテラル(
--02-11。ISO 8601 の再帰表記)。固定日祝日は射影(ADR-27)+窓序数で 書け、テーブルリテラルの要素としては完全な日付しか現れないため、今は不要。糖衣(onMonthDay)で 読みやすさは足りる。 - 市民時と経過時間の混合幅(
1d12h)を許す案。規約集合(ADR-12)をまたぐ幅は「DST の日に何を指すか」が 定義できない。必要ならshiftを二段に分けて書く。
帰結:
anchor:・テーブルリテラル・from:・shift/strideの引数など、時点・幅を書く全箇所の字句が 一つの定義に揃う。- 同じ日付リテラルが premise(
tz:)により基底上の別の点を指すのは仕様(「意味は premise 相対」の 帰結)と明文化される。 Gregorianの完全定義(stdlib)が使う語彙がすべて目録に載り、「標準ライブラリだけが使える未定義語」が 消える。- EBNF の字句部(spec §5)はこの ADR を正とする。
改訂(2026-07-09・ADR-43)
- 日付部の値域は字句エラー(F66 (a)): 月 01–12・日は月と閏年規則(proleptic Gregorian)の
実在日のみ。
2026-02-30級は字句層で拒否(時刻部の23:59:60検査=ADR-33 と同じ層)。 詳細は ADR-43 判断 1。