日本語 · English

roll — 無効点を有効点へ寄せる

分類: 点変換(本体層 core) / シグネチャ: roll(conv, on: P) : Stream -> Stream / 名は確定(spec §5.4)

意味

各点が軸 P 上の有効点でなければ、規約 conv に従って有効点へ寄せる。有効点は動かない。 「休日なら前営業日」「日曜の祝日は翌平日に振り替え」の核となる演算子。

ロール規約は軸非依存(ADR-13)——営業日にも DST にも同じ体系が乗る。規約と軸は必須引数 (I3: 無効・不在に着地し得る演算子は解決を必須引数に取り、既定で黙って選ばない)。

規約 意味
Following 次の有効点へ
Preceding 前の有効点へ
Modified 上位窓を引数に取り、その窓内に留めて寄せる(月をまたぐなら反対側へ。ADR-14)

on: には軸名のほか導出ストリームをそのまま渡せる(ADR-26)——これが振替休日の鍵になる。

給料日: 毎月 25 日、休日なら営業日(2026-01-25 は日曜 → 1/23 金曜):

# eval: 2026-01-01..2026-02-01
@JP
everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay)
#=> 2026-01-23
#~> 範囲外 2026-01-01..2026-01-02(holidays2026 covering 2026-01-01..2026-12-31, asof 2026-01-05)

振替休日: 日曜の祝日を「祝日でない日」という導出軸で前方に寄せる。連休(5/4・5/5 も祝日)を 自動で飛び越えて 5/6 に着地する:

# eval: 2026-05-01..2026-06-01
@JP
statutory   = [2026-05-03, 2026-05-04, 2026-05-05] covering: 2026..2026
nonHoliday  = everyDay \ statutory
statutory |> filter(d => weekday(d) == Sun) |> roll(Following, on: nonHoliday)
#=> 2026-05-06

匿名軸(インライン・ストリーム式)も受ける——named-arg は stream-expr を取り(spec §5.6)、 導出ストリームは軸と同じ型(F7・ADR-26)。名前を付けずに「月内最終金曜」が書ける (実装系還流第 3 便の「良い発見」を保証として明文化):

# eval: 2026-01-01..2026-03-01
@JP
month |> last |> roll(Preceding, on: (everyDay |> filter(d => weekday(d) == Fri)))
#=> 2026-01-30 2026-02-27

落とし穴

関連

shift(同じ点変換族——寄せるか動かすか)・filter・I3・ADR-13/14/21/26。