takeLast — 末尾 n 点の打ち切り(直近 N)
分類: ストライド(本体層 core・選択子と別族) / シグネチャ: takeLast(n, until:) : Stream -> Stream / 名は確定(ADR-52)
意味
until: 以前(until: の点を含む)の入力点のうち、末尾 n 点だけを通す。take が
「先頭で打ち切る」の鏡像で、「直近 N 発火」を式で言う語(ADR-52——ADR-49 判断 6 の見送りを、
実需要〈レシピの発火例表示〉の成立を受けて改訂)。
終端 until: は必須(take の from: の双対・一族の錨規約)。出力は
(入力・n・until:)だけの純関数で、評価範囲はその外延の切り取り窓。「今」は言語に無い——
動的な「直近」は、利用側が until: に現在時刻のリテラルを注入して式を生成する(決定性は不変)。
例
年数回の暦注(天赦日級)の直近 3 発火——「何日分の窓を取れば n 個入るか」の当てずっぽうが消える:
# eval: 2026-01-01..2026-12-31
@JP
tensha = [2026-01-06, 2026-03-05, 2026-05-25, 2026-07-24, 2026-10-06, 2026-12-21] covering: 2026-01-01..2026-12-31
tensha |> takeLast(3, until: 2026-08-21)
#=> 2026-03-05 2026-05-25 2026-07-24
until: ≤ 覆域の尾なら確定済みの過去側だけを数えるので、答えは註釈なしで確定的に出る
(順方向 take の「covering の尾が常に今の近傍」と対照的な、鏡像の利点)。時刻を付けるなら
数える段は日の層・時刻付与は後(at との標準合成):
# eval: 2026-01-01..2026-12-31
@JP
tensha = [2026-01-06, 2026-03-05, 2026-05-25, 2026-07-24, 2026-10-06, 2026-12-21] covering: 2026-01-01..2026-12-31
tensha |> takeLast(2, until: 2026-08-21) |> at(T07:00)
#=> 2026-05-25T07:00 2026-07-24T07:00
落とし穴
- until: の包含は点包含。日付リテラルは 00:00 の錨なので、時刻付きの発火列に直接使うと
当日の発火が数えから外れる(
T07:00発火列にuntil: 2026-08-21→ 8/21 分は入らない)。 正道は上の合成順(数える段は日の層)か、until: を時刻付きで注入する(「これから発火する分を 直近に入れない」意味でも正しい)。 - 評価範囲は覆域の頭からが定石。評価範囲は外延の切り取り窓なので、狭い範囲は答えを黙って 欠けさせる——「366 日で足りるか」の穴を評価範囲の穴に移し替えないこと。
- until: が覆域の尾を越えると全出力が暫定(範囲外註釈——「未知のより直近」があり得るため。 正しい挙動)。覆域の頭で第 n 点が前に落ちる(運用開始直後の「まだ n 個ない」)も註釈で可観測。
- 窓付き入力は静的エラー。「窓ごとの最後の 1」は
withinの後のlastで・「最後の N」は窓境界点からのshift(-k, unit: 軸)の和で(takeLast は 通し数え。窓内の逆向き序数は隣接需要として採録済み・現行語彙には無い)。 takeLast(0)・負値は静的エラー(ADR-38 判断 12 と同規約)。from:を渡すと専用診断(錨は until:——先頭からは take)。- 生成子(everyDay 級)入力で until: が計算範囲や実体化下限に掛かると horizon-clip 警告 (「n 個中 k 個のみ」まで明示——実装の地平線であって言語の地平線ではない。ADR-37 判断 8・F107)。
関連
take(先頭で打ち切る=双対)・stride(間引く)・
strideBy(幅で刻む)・at(時刻付与の標準合成)・ADR-31/38/49/52。