stride — 入力の点を「n ごと」間引く
分類: ストライド(本体層 core・選択子と別族) / シグネチャ: stride(n, from:) : Stream -> Stream / 名は確定(spec §5.4)
意味
入力ストリームの点を走査し、起点 from: から数えて n 個ごとに 1 点を残す(入力相対=
ADR-38 判断 10。軸引数は持たない——何を数えるかは前段が決める)。選択子(nth)が
窓を消費して窓ごとにリセットしながら「第 N」を選ぶのに対し、ストライドは窓を消費せず
境界を無視して連続に数える——「月境界を無視して 3 営業日ごと」は選択子では書けず、これが
ストライドの存在意義(ADR-11)。「第 N」ではなく「N ごと」。
起点(位相アンカー)from: は必須(無ければ静的エラー)。かつての「前段の窓の起点から供給」は、
窓が複数あるとき多義で評価範囲依存になるため廃止された(ADR-31・F49)。from: の規約: from: 以上の
最初の入力点が数え起点(第 0 歩=残る)——from: が入力の点であることは要求しない(位相の
取り違えは F32 で踏んだ危険域。ADR-38 判断 11)。n は 1 以上の整数——さもなくば静的エラー
(stride(0) の「黙って空」は根絶対象。ADR-38 判断 12)。
例
3 営業日ごと(1/12 は祝日。月をまたいでもリセットしない):
# eval: 2026-01-01..2026-01-23
@JP
everyDay |> filter(on: bizDay) |> stride(3, from: 2026-01-05)
#=> 2026-01-05 2026-01-08 2026-01-14 2026-01-19 2026-01-22
「特定日起点の隔週」は from: の位相そのもの(還流第 3 便 F103 への回答)——年アンカー偶奇の
回避形は不要で、52/53 週の年跨ぎ位相反転も起きない(位相は from: が持つ=ADR-31/38):
# eval: 2026-01-01..2026-03-01
@JP
everyDay |> filter(d => weekday(d) == Mon) |> stride(2, from: 2026-01-05)
#=> 2026-01-05 2026-01-19 2026-02-02 2026-02-16
窓ごとにリセットしたいとき
「各月の 1, 8, 15, … 日」のような窓ごとに数え直す n 個ごとは、ストライドではなく
ordinalIn への還元で書く(専用記法は持たない。ADR-27):
# eval: 2026-01-01..2026-02-01
@JP
everyDay |> filter(d => (ordinalIn(day, month, d) - 1) mod 7 == 0)
#=> 2026-01-01 2026-01-08 2026-01-15 2026-01-22 2026-01-29
落とし穴
stride(n)は入力ストリームの点を数える(入力カウント。ADR-38 で確定——軸相対の読みは廃止)。 何を数えるかは前段の filter が決める——営業日ごとなら先にfilter(on: bizDay)。軸で数えて入力へ 当てる形が要るなら(軸の stride 列) & input〈day 整列〉かfilter(d => coincides(stride 列, day, d))〈時刻付き。coincides〉で合成する。from:より前の点は出力されない(位相は from: が定める)。- 絶対量(暦に乗らない幅)で刻むなら
strideBy。
関連
strideBy(点で数える/幅で刻む、の対)・nth(窓相対の「第 N」)・ordinalIn(窓リセット版の還元先)・ADR-11/31/38。