日本語 · English(未訳)

ADR-21: roll と shift は同じ点変換族。各段が premise を自足し伝播に頼らない

判断: rollshift を別動詞・専有動詞とせず、同じ点変換族の二メンバーとする。両者とも一般操作で、 参照する premise を引数で選ぶ(shiftunit:rollon:)。方向は動詞ではなく符号(データ)で表す。 各段は自らが参照する 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 を伴わない)に 有用性があり、統合するとそれが埋もれるため却下。別語のまま同じ族・同じ引数規約に属させる。

帰結:

注記(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。