ADR-23: 本体層は core 族と糖衣の二層。糖衣は core への展開で消せる
判断: 本体層の演算子を、core 族(生成子・点変換・結合子・フィルタ・窓・選択子・ストライドの最小集合)と、
糖衣(monthEnd・businessDays・nextWeekday など、core 合成に名前を付けた略記)に分ける。糖衣は core への
展開規則として定義され、全て core に展開すれば消える。core は糖衣に依存しない(片方向依存)。
背景: 題材を core 族に忠実に書くと、便利語が実は複数の core 演算子の畳み込みだと判明した。bizDays は
フィルタ+窓の畳み込み(ADR-06 の畳み込み禁止に抵触しかけていた)、month は生成子と窓の混同、monthEnd は
within(month) |> last の略記。これらを core に開くと、代表例はいずれも少数の core 族の合成に落ちる。
# 糖衣で書いた姿
month |> bizDays(on: TSE) |> nth(2) |> nextWeekday(Fri)
# core に展開した姿
everyDay |> filter(on: TSE) |> within(month) |> nth(2) |> nextWeekday(Fri)
この二層は、premise 層の原始/派生(ADR-19)と同じ向きの階層をなす。糖衣=本体層の派生定義。知識レベル (premise 層)に顕現した構造が操作レベル(本体層)にも現れる。ただし完全な鏡像ではなく片方向の非対称を持つ (下記)。
却下した案: 糖衣を認めず core 族だけで書かせる案。「一行で書きたい」志向を殺すため却下。糖衣を入れる メリットが大きく、かつ下記の片方向依存により崩壊リスクが限定される。
帰結:
- 日常の式は糖衣で短く、意味論は core 族で厳密。「一行志向」と「族の純粋性」が両立する。
- 片方向依存による安全性: 糖衣は core に展開して消せるが、派生 premise は原始 premise に展開できない (新しい規則だから)。この非対称ゆえ、糖衣層のバグは core に伝播しない。core が正しい限り崩壊は糖衣内に閉じる。 「綺麗すぎて全崩壊が怖い」に対する構造的な歯止め。
- 複雑さは core に宿り糖衣は薄い。例えば
nextWeekdayの WKST 依存は、展開先の corewithin(week)が背負い、 糖衣自身は WKST を知らず継承するだけ(ADR-18「複雑さは premise 層が引き受け本体は薄い」の、本体層内での再現)。 - 糖衣の定義(core への展開規則)を書く層が新たに要る。これは premise 層の派生定義と対称の位置づけ。