docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)

This commit is contained in:
nyash-codex
2025-10-31 18:00:10 +09:00
parent 1d49e24bf0
commit 8fd3a2b509
433 changed files with 108935 additions and 0 deletions

View File

@ -0,0 +1,34 @@
## Plan — Phase 20.18Null/Void 固定Result ケース別+糖衣)
0) Null/Void の固定P0
- 言語: 予約語 `null`/`void` をリテラルとして受理
- MIR JSON v0: ConstValue に `Null`/`Void` を追加
- VM: `VMValue::Null` を追加boolean/equality/stringify 対応)
- Singletons: `NullBox`/`VoidBox` を Lazy static にto_nyash_box() で変換)
1) API 最小追加Core/GateC 実装→Hakorune VM 委譲)
- Array.try_get/1, Array.try_pop/0, Map.try_get/1
- String.to_i64/0, String.to_f64/0
2) 糖衣の受理と Loweringゼロアロケーション
- Parser: `let a?=/a!=``if let ok(..)` を受理
- Builder: `?``select(ok,value,Void)`, `!``br ok/ trap`, if-let→`br ok/else`
3) 例外タグの安定化
- E_OOB / E_EMPTY / E_NOT_FOUND / E_PARSE を固定
4) スモークoptin, quick
- try_get/try_popok/err+ `?`/`!`/if-let ok
- to_i64/to_f64ok/err
5) Gate & Docs
- Gate: `HAKO_TRY_API=1`既定OFF
- Docs: result-semanticscase-by-case/ optional-semanticslink更新/ testing-guide 補足
- Docs: vm-core に Null/Void/rc 規則を追記、phase-20.18 README/TASKS を同期
6) Plugins互換-段階更新)
- Map/Array の意味論を SSOT に揃えるget/pop 欠落→Null、push/set/clear→Void、delete→値 or Null、set の不正→Fail
- HostHandleRouter/内蔵ルーターで未更新プラグインを回避できる経路を優先Core先行
7) 後段20.19+ 任意)
- Result を“値版”へ({i1 ok, payload})。最適化の効果測定とゼロコストの検証。

View File

@ -0,0 +1,79 @@
# Phase 20.18 — Resultケースバイケース+ 軽量糖衣 + Null/Void 固定
目的(要約)
- 「全部 Result は重い」を回避しつつ、一貫した失敗取り扱いを提供する。
- Null/Void の言語レベル固定(予約語)と VM 値表現Null タグ)を導入し、欠落/手続きの意味を明確化。
- ケース別の最小主義:検索=sentinel、境界=FailFasttry_系、変換/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<=i<len は置換戻りは `void`
- `Map.get/1` 欠落は `null`Fail しない)。
- `Map.set/2` 不正キー= `E_INVALID_KEY`、不正値= `E_INVALID_VALUE`戻りは `void`
- `Map.delete/1` 削除値 or `null``Map.clear/0` `void`
- 追加API5つ
- `Array.try_get/1`, `Array.try_pop/0`
- `Map.try_get/1`
- `String.to_i64/0`, `String.to_f64/0`
糖衣任意軽実装
- `let r = arr.try_get(0)` Resultのまま
- `let x? = arr.try_get(0)` `ok→値 / err→VoidBox`
- `let x! = arr.try_get(0)` `ok→値 / err→即Fail`
- `if let ok(v) = arr.try_get(0) { … } else { … }`
実装方針段階導入
- Phase A本フェーズ
- Null/Void: 予約語MIRVM の三層で固定VMValue::Nullsingleton 変換)。
- Core/GateC: Array/Map SSOT へ挙動を収束上記 既定挙動)。
- Parser: 左辺の `?`/`!` `if let ok(..)` を受理
- Lowering: `?`/`!`/if-let branch/select に展開ゼロアロケーション)。
- Verifier: 例外タグ `E_OOB/E_EMPTY/E_NOT_FOUND/E_PARSE` を安定化
- Gate: `HAKO_TRY_API=1`既定OFFでスモーク有効化
- Phase B20.19+ 任意
- MIR/LLVM 値版Result `{i1 ok, T payload}` に寄せるSROA/mem2reg 合流
- Box化は保存/境界FFI/ABIのみで行いゼロコスト化を徹底
受入れ基準MVP
- quickoptin try_* + 糖衣`?`/`!`/if-let okスモークが緑
- FailFastタグが安定E_OOB/E_EMPTY/E_NOT_FOUND/E_PARSE)。
- Array/Map SSOTNull/void 既定 GateC/Core/VM で一致
---
完了サマリ20251029 現在
- BridgeBNy/Core直行: include ベースで安定GateC(Core) file/pipe は緑
- Core canary直行: array_get/push/set_get は緑string indexOf bang TTL 互換で緑タグ優先未到達時は -1/rc=0 を暫定許容)。
- Runner: Core ラッパー出力はタグ行を優先採用GateC(Core) はタグstderr+rc=1、数値→rc=(num&0xFF)。
- Docs: VM README/Smokes README/CURRENT_TASK を更新BridgeB方針カナリア導線TTL注記)。
残タスク短期
- Core からの FailFast state 経由の戻り値へ統一してタグを必ず last line にするprint 依存解消)。
- 上記完了後string indexOf bang TTL 互換-1容認を撤去しタグ必須に戻す
ノート
- 20.17 selfhosting 完了を優先実装は本フェーズでまとめて入れる
- 糖衣は左辺のみ公開名の二重化を避ける)。Result は段階で値版へ移行予定
---
## Plugins への影響(互換ポリシー)
ABI 変更は不要Box 戻りのまま)。ただし意味論は SSOT に合わせる
- ArrayBoxプラグイン実装がある場合
- get: 範囲外NullBoxpop: NullBoxpush/set/clear: 戻りは VoidBox
- set: i<0 or i>len は `E_OOB`。i==len は append、0<=i<len は置換
- MapBoxプラグイン実装がある場合
- get: 欠落NullBoxdelete: 削除値 or NullBoxclear: VoidBoxset: VoidBox
- set: Null key/不正型 `E_INVALID_KEY`不正値 `E_INVALID_VALUE`暗黙変換は禁止
Core/GateC が先行で SSOT を満たすためプラグインが未更新でも GateC(Core) 直行経路は安定VM 経路でプラグイン実装が呼ばれる場合は上記の意味論に合わせて段階更新する

View File

@ -0,0 +1,42 @@
## Phase 20.18 — Tasks & Checklist
P0 — Null/Void 固定(言語+VM+Core+Docs
- [ ] Parser: `null`/`void` を予約語として受理AST: NullLiteral/VoidLiteral
- [ ] MIR: ConstValue に Null/Void を追加emit/reader/verifier/print
- [ ] VM: VMValue::Null 追加、`to_bool_vm/eq_vm/to_string_vm` に Null を追加
- [ ] Singleton: NullBox/VoidBox の Lazy static 化to_nyash_box で変換)
- [ ] Core: Array/Map の SSOT へ収束get/pop→Null、set/clear/push→Void、delete→値 or Null、set 不正→Fail
- [ ] Smokes: null/void identity/boolean、array/mapget/pop/delete/invalid set
- [ ] Docs: vm-core / gate-c-core-routing / INDEX / phase-20.18 README を更新
Core/API
- [ ] Array.try_get/1ok=value, err=E_OOB
- [ ] Array.try_pop/0ok=value, err=E_EMPTY
- [ ] Map.try_get/1ok=value, err=E_NOT_FOUND
- [ ] String.to_i64/0ok=i64, err=E_PARSE
- [ ] String.to_f64/0ok=f64, err=E_PARSE
Parser/Lowering
- [ ] `let a?=/a!=` の受理
- [ ] `if let ok(v) = …` の受理
- [ ] Lowering: `?` → select, `!` → branch+trap, iflet → branchallocなし
Verifier/Diagnostics
- [ ] 例外タグE_OOB/E_EMPTY/E_NOT_FOUND/E_PARSEの固定
- [ ] `HAKO_TRY_API=1` gate での動作保証
Plugins段階更新
- [ ] MapBox: get 欠落→Null、delete→値 or Null、clear→Void、set→Void不正→E_INVALID_*
- [ ] ArrayBox: get/pop 欠落→Null、push/set/clear→Void、set OOB→E_OOB
- [ ] HostHandleRouter: Core 先行経路の優先(未更新プラグインの影響を遮断)
Smokesquick, optin
- [ ] try_get: ok/err + `a?`/`a!`/if-let ok
- [ ] try_pop: ok/err + `a?`/`a!`
- [ ] map.try_get: ok/err + 糖衣
- [ ] string.to_i64/to_f64: ok/errstdout/rc/タグ)
Docs
- [ ] result-semantics.mdcase-by-case
- [ ] optional-semantics.md に 20.18 方針リンク追記
- [ ] guides/testing-guide.md に観測方法stdout/rc/タグ)補足