日本語 · English

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

落とし穴

関連

strideBy(点で数える/幅で刻む、の対)・nth(窓相対の「第 N」)・ordinalIn(窓リセット版の還元先)・ADR-11/31/38。