ADR-21: roll と shift は同じ点変換族。各段が premise を自足し伝播に頼らない
判断: roll と shift を別動詞・専有動詞とせず、同じ点変換族の二メンバーとする。両者とも一般操作で、
参照する premise を引数で選ぶ(shift は unit:、roll は on:)。方向は動詞ではなく符号(データ)で表す。
各段は自らが参照する premise を引数で明示し、後段からの推論(premise 伝播)に頼らない。
背景: 検討の過程で三つが確定した。
第一に shift の採用。「3 営業日前」を shiftBack(3) のように方向を語で固定すると、将来 3 が変数に
なったとき負値と語が二重に方向を持って衝突する。方向は符号で表し動詞は方向を持たない。ゆえに shift(符号つき)
一本を採り、shiftBack/shiftForward は却下(この将来対応は、リリース後に引数用の変数要望が来て数値・文字列・
列挙の値型が芋づる式に要る、という予測に基づく。ADR-05「型は一本」は時間ストリームの原則で、値型を将来開く
ことと矛盾しない)。
第二に、roll はカレンダー専有ではないこと。当初「TSE.roll() は存在するが Gregorian.roll() は存在しない」と
考えたが、それでは「暦日で動かす」ケースが書けず矛盾する。正しくは roll も shift と同じ一般操作で、on: で
premise を選ぶ。roll(Preceding, on: bizDay) は TSE を、roll(Preceding, on: weekday) は曜日サイクルを、
roll(on: day) は暦日を参照する。roll が非恒等になるのは「無効点を持つ premise」でのみ(暦日には無効点が無く
恒等になる)。この「実際に働くのはカレンダー上」という経験的偏りが、roll をカレンダー専有と誤らせる。
第三に「後段でないと判別できない」構造の解消。当初 roll(Preceding) は引数を省くと後段の unit: bizDay を
見に行かないと基準が決まらない非局所構造だった。roll に on: を持たせ各段を自足させることで、後段参照が消えた。
(なお、仮に後段推論を採る場合でも実装は「保存して後で読む」逐次処理ではなく、式全体を見て premise 要求を
双方向伝播させる型推論として実現され、実装上の問題はない。ただし非局所性は ADR-16「意味は局所的に」と緊張する
ため、各段自足を採る。)
却下した案: roll と shift を統合して一動詞にする案。roll 単品(月末を営業日へ寄せるだけ、shift を伴わない)に 有用性があり、統合するとそれが埋もれるため却下。別語のまま同じ族・同じ引数規約に属させる。
帰結:
monthEndとmonthEnd |> roll(Preceding, on: TSE)の時間ストリームは異なる(5-31 が日曜なら後者は 5-29)。 roll は恒等でなく単品で意味を持つ。- roll: 条件付き・移動量は結果次第(無効なら動く、有効なら 0)。shift: 無条件・移動量は固定。同じ「点を動かす」 族の、移動量の決め方が違う二モード。引数規約(参照 premise・ロール規約・量)を共通化する。
- 各段が premise を自足するため premise 伝播は不要。式は左から右へ各段が完結して読める(ADR-16 と調和)。
on:/unit:の反復(複数段が同じbizDayを書く冗長)は、スコープ既定(ADR-16 の入れ子スコープ)で畳む。 伝播に頼らず局所性を保ったまま省略を許す(未解決はエラー)。
注記(ADR-26/35 による精密化): 本文の roll(Preceding, on: weekday) の字面は「曜日で決まる有効日の列を
軸に」の意で、確定後の体系では軸に立つのは有効点ストリーム(ADR-26・F7)である——cycle 名(weekday)は
ラベルでありストリームに解決されないので、軸には導出ストリーム(everyDay |> filter(x => weekday(x) == Fri)
等)を渡す(nextWeekday の確定形=§1.16 補・F31)。軸位置に立てられる名前の型規約は ADR-35 判断 4。