# Phase 20.18 — Result(ケースバイケース)+ 軽量糖衣 + Null/Void 固定 目的(要約) - 「全部 Result は重い」を回避しつつ、一貫した失敗取り扱いを提供する。 - Null/Void の言語レベル固定(予約語)と VM 値表現(Null タグ)を導入し、欠落/手続きの意味を明確化。 - ケース別の最小主義:検索=sentinel、境界=Fail‑Fast+try_系、変換/I/O=Result 既定。 - 糖衣は左辺だけ(`let a?=/a!=`)に限定し、ゼロアロケーションで Lowering。 適用範囲(MVP) - Null/Void の固定(言語+VM) - 言語: `null`, `void` を予約語にする(リテラル)。 - MIR JSON v0: `Const` に `{"type":"Null"|"Void"}` を追加。 - VM/Interpreter: `VMValue::Null` を追加(0 アロケーション、比較高速)。 - 既定挙動(SSOT) - `String.indexOf/1` → not found は `-1`(sentinelのまま)。 - `Array.get/1` → 範囲外は `null`(Fail しない)。 - `Array.pop/0` → 空配列は `null`(Fail しない)。 - `Array.set/2` → i<0 または i>len は `E_OOB`、i==len は append、0<=ilen は `E_OOB`。i==len は append、0<=i