ADR-25: 原始的定義をフル構文とし、値式・変数レイヤーを導入する
判断: 暦法の原始的定義(グレゴリオ暦の閏年規則、月の非一様な境界など、派生元を持たない根の定義)を、
言語自身で書けるフル構文とする。ユーザーも書け、Gregorian は透明な標準ライブラリとして同梱する(組み込みの
ネイティブ実装ではなく、言語で記述された定義)。この帰結として、時間ストリームでない値式(数値・比較・論理・
条件)と変数を、premise 層の第一級として今導入する。値型は時間ストリーム型・premise 型と並ぶ別の型であり、
ADR-05 の「型は一本」は本体層内に限定される(ADR-18 の改訂に従う)。原始的定義で拡充する語彙は層で囲い込まず
本体層と共有し(ADR-18・ADR-19)、既存語彙との統廃合を経て、同等物の無いものだけを足す。
背景: 派生的定義(会計暦=Gregorian.monthStart を +3 ずらす。ADR-19)を書くには、原始 Gregorian の
中で month・monthStart が語として定義・公開されていなければならない。ゆえに派生の書き方は原始的定義の
書き方に従属し、原始を先に決めないと派生は定まらない。そして原始の閏年規則(4 で割れ、100 で割れず、ただし
400 で割れる、という例外の例外)は数値・比較・論理・条件という時間ストリームでない値式を要求し、各要素を
束縛する変数(year の y)も要る。ADR-21 は「将来 3 を変数化したとき数値・文字列・列挙の値型が芋づる式に
要る」と予見していたが、その具体的動機が原始的定義という形で現れた。ユーザーが原始的定義を書けること自体が、
汎用スケジューラの目的(自前暦法。ADR-07)の達成手段である。Gregorian は公知ゆえライブラリとして用意するに
過ぎず、ユーザーはその定義を読んで妥当性を判断してもよく、参考に別の原始的定義を書いてもよい。
却下した案:
- 値式・変数を将来に回し
Gregorianを組み込みネイティブにする案。原始的定義がユーザーに開かれず、 ADR-07(自前暦法)・ADR-19(原始も派生も同じ premise 型で透明)に反する。閏年規則すら言語で書けない。 - 原始層専用の語彙を設け、本体層と分離する案。ADR-18「語彙は共有し型は分離」・ADR-19「層を作り方で分けない」 に反する。同じ「何かを定義するための語」が層ごとに分裂し、将来の変数機能とも語彙が割れる。
帰結:
- 言語の型は「時間ストリーム型(本体層の外延)/premise 型(内包・生成規則)/値型(数値・論理・列挙・将来の
文字列)」の三系統になる。値型は原始的定義の規則で使い、将来は本体層の引数変数(
shift(n)のn)でも使う。 ADR-05 の「型は一本」は本体層内に限定される。 - 変数(値の束縛・参照)を将来ではなく今導入する。原始的定義がそれを必要とするため。
- 原始的定義はブロック・多行で、窓生成語(
span・cycle・幅による基底の刻み)と規則(値式)で暦法を定義し、 公開語(month・monthStart・year・weekday等)を生む。派生的定義はその公開語をパイプで変換する (premise → premiseの閉包。ADR-19)。 - 拡充語彙は既存と統廃合する。
whereはfilter(条件式述語も取る)へ統合、一様粒度の等分は生成子 (strideByと幅概念を共有)へ、cycle(並列サイクル)・span(可変グループ化窓)は同等物が無いため追加。 - 具体構文は 30-syntax で確定する。