ADR-52: 末尾 N 選択——takeLast(n, until:)(直近 N 発火)
判断: 数える族に第 4 の語 takeLast(n, until:) : Stream -> Stream を採用する——until:
以前(until: の点を含む)の入力点のうち末尾 n 点だけを通す(take の鏡像)。ADR-49
判断 6 が「需要未確認・終端起点の数えが covering 依存になる」として見送った「後ろから N 個」に、
還流第 12 便 A-3/B-3(収蔵 13)が実需要の第 1 号(レシピの「直近の発火例」表示——年数回
レシピで 366 日窓評価の代替運用・窓幅の当てずっぽうへの漏れ)を立てたことによる導入。
判断 6 の却下理由は until: の明示錨が構造的に解消する(終端が式に書かれる=covering 依存で
なくなる)——本 ADR は ADR-49 判断 6 を改訂参照する(ADR は不変・追記型)。
- 族の較正: stride「点で数えて間引く」・take「先頭で打ち切る」・takeLast「末尾で 打ち切る」・strideBy「幅で刻む」。錨は一族必須(ADR-31 の対称拡張——take の from: に 対し takeLast は until:・第 0 歩=until: 以下の最後の入力点=ADR-38 判断 11 の鏡像)。錨の 取り違えは専用静的エラーで双対を教示(takeLast(from:)→「錨は until:」・take(until:)→ 「錨は from:」)。
- 意味論: 出力=until: 以前(含む)の入力点のうち、until: から逆向きの通し順位(1 起点)が n 以下のもの。出力は(入力・n・until:)だけの純関数で、評価範囲はその外延の切り取り窓 (ADR-49 判断 2 の対称)。「今」は言語に無い——until: は明示リテラルで、動的な「直近」は 利用側が until: を注入して式を生成する(供給側テンプレート層の既存の型・決定性不変)。
- n の域・窓付き入力: take と同規約——
takeLast(0)・負値・非整数は静的エラー(ADR-38 判断 12)。窓付き入力は誘導つき静的エラー: 「窓ごとの最後の 1」は within の後の last で・ 「最後の N」は窓境界点からのshift(-k, unit: 軸)の和で(within+nth への誘導は不成立—— nth は前方 1 起点のみ。「窓内 lastN/逆向き序数」は隣接需要として採録〈90-open-questions〉・ 今は解かない)。 - 輸送行(ADR-49 判断 5 の鏡像): 逆向き数えが註釈区間に交差したら、交差点から過去側 すべてを註釈(head 拡幅 (-∞, …])。縮小——逆向き数えが交差せず第 n 点(過去端)が確定 した場合に限り、それより過去で完結する註釈区間は輸送しない(出力は [第 n 点, until] の 入力にしか依存しない。条件節は整合性の要件——無条件形は幻点〈註釈内の点は消え得る=ADR-37 判断 3〉で真の第 n 点が過去へ動く場合に過小近似)。使用場面の対称が要: 順方向 take の motivating example は covering の尾(未来側)に定常交差する(判断 5)が、takeLast の motivating example(直近 N・until ≤ 覆域尾)は確定済みの過去側を数えるため定常状態では 交差しない=直近 N は註釈なしで確定的に出る。until: が覆域尾を越えると全出力が暫定化 (未知の「より直近」があり得る——正しい挙動)。
- 実装地平線ガード 2 面(ADR-37 判断 8・F107 同族): (a) endless 入力×until: ≥ 計算範囲は 「実体化済みの末尾」の取り違えで誤った点が表示窓に出得る——horizon-clip 警告して実体化末尾 から数える (b) 実体化下限で n 個に満たない生成子入力は「黙って n 未満」になる——「n 個中 k 個のみ」を明示する horizon-clip 警告(判定は tz 相対=F107)。三者の切り分け: 正当に 有限な入力の n 未満=註釈なしの空(ADR-15)/covering の頭=範囲外註釈/実装地平線=警告。 静的エラーへの昇格は不可(言語に存在しない地平線の昇格=ADR-37 判断 8)。
- 粒度の規約: until: の包含は点包含——日付リテラルは 00:00 錨なので、当日の時刻付き
発火は含まれない。正道は (a) 数える段は日の層・時刻付与は後
(
takeLast(3, until: …) |> at(T07:00)——ADR-51 と組む標準合成)(b) 定義末尾で数えるなら until: は時刻付きで注入(「これから発火する分を直近に入れない」意味でも正)。 - 整列・有限性: 整列保存(ADR-36 の表に take と同じ行)。出力は静的に有限(≤ n)—— ADR-39 の有限性分類に行を追加。併せて既存 take が入力の endless を素通ししていた点を修正 (表との一致・本 ADR の検証での発見)。
- 名は
takeLast。take(n, until:)(同語の named-arg で方向切替)は「until まで先頭 n」の 誤読が立つ上、1 語で意味が反転する式は差分レビューで危険——不採。last(n, until:)は窓 選択子 last と衝突(ADR-49 のfirst(n)不採と同型)。recentは「今」を内蔵する響きが 判断 2 と衝突(recent(3, until: 2020-01-01)が矛盾文になる)——不採。
経緯: ADR-49 判断 6(需要未確認で見送り・受け皿明文化)→還流第 12 便 A-3/B-3 が実需要第 1 号 (2026-08-21・収蔵 13)→裁定「候補設計着手」→draft §1.33→4 視点並列検証(支持——縮小規定の 条件節復元・実装地平線ガード 2 面の発見〈「誤った点が合法な顔で出る」新種の黙りの実測〉・ until 包含の粒度罠の特定・366 日窓代替の成立条件〈評価範囲は覆域の頭から〉)→設計者裁定→実装 (take の鏡像+ガード 2 面+専用診断・テスト 15 本)。