## 目的 ファイル・ソケットなど Drop が必要なリソースに対し、明示的に「スコープ終了時の後処理」を書ける構文を導入する。 ## 背景 - 現在 `tcp_close(fd)` などは手動呼び出しで、忘れると fd リーク - stdlib のファイル I/O (#33) を入れる前にリソース管理パターンを決めないと、ライブラリ API シグネチャが定まらない ## 設計選択肢 | 方式 | 例 | 特徴 | |---|---|---| | Python `with` | `with open("a") as f:` | コンテキストマネージャ プロトコル | | Go `defer` | `defer close(f)` | 関数末尾で逆順実行、明示的 | | Rust `Drop` | `let f = ...; // 自動` | 暗黙、所有権が前提 | | Zig `defer` | `defer f.close()` | Go 風だがスコープ末で実行 | ## 提案 (drafting) 第一歩としては **`defer` 文(Go/Zig 風)** が rw の現状(所有権なし・GC 議論未決)に最も馴染む。 ``` def read_file(path: str) -> Bytes: f: File = file_open(path) defer file_close(f) return file_read_all(f) ``` 将来 #15 / #67 (メモリ管理 RFC) で所有権が入ったら `Drop` 自動化に移行可能。 ## 受け入れ条件 - [ ] `defer expr` 構文を parser/sema/irgen で実装 - [ ] 複数 `defer` は LIFO で実行 - [ ] return / 例外パス (#14) でも実行される - [ ] examples / tests を追加 ## 関連 - 前提: #33 (ファイル I/O) のブロッカー - 影響: #14 try/except の例外伝搬と組み合わせる必要
目的
ファイル・ソケットなど Drop が必要なリソースに対し、明示的に「スコープ終了時の後処理」を書ける構文を導入する。
背景
tcp_close(fd)などは手動呼び出しで、忘れると fd リーク設計選択肢
withwith open("a") as f:deferdefer close(f)Droplet f = ...; // 自動deferdefer f.close()提案 (drafting)
第一歩としては
defer文(Go/Zig 風) が rw の現状(所有権なし・GC 議論未決)に最も馴染む。将来 #15 / #67 (メモリ管理 RFC) で所有権が入ったら
Drop自動化に移行可能。受け入れ条件
defer expr構文を parser/sema/irgen で実装deferは LIFO で実行関連