Files
hakorune/docs/development/selfhosting/index-operator-hako.md
nyash-codex 5e3d9e7ae4 restore(lang/compiler): bring back lang/src/compiler from e917d400; add Hako index canaries and docs; implement Rust-side index operator (Array/Map get/set) with Fail‑Fast diagnostics
- restore: lang/src/compiler/** (parser/emit/builder/pipeline_v2) from e917d400
- docs: docs/development/selfhosting/index-operator-hako.md
- smokes(hako): tools/smokes/v2/profiles/quick/core/index_operator_hako.sh (opt-in)
- smokes(vm): adjust index_operator_vm.sh for semicolon gate + stable error text
- rust/parser: allow IndexExpr and assignment LHS=Index; postfix parse LBRACK chain
- rust/builder: lower arr/map index to BoxCall get/set; annotate array/map literals; Fail‑Fast for unsupported types
- CURRENT_TASK: mark Rust side done; add Hako tasks checklist

Note: files disappeared likely due to branch FF to a lineage without lang/src/compiler; no explicit delete commit found. Added anchor checks and suggested CI guard in follow-up.
2025-10-31 20:18:39 +09:00

1.2 KiB
Raw Blame History

Index Operator in Hakorune Compiler (selfhost)

Scope

  • Bring Hako-side behavior up to parity with Rust parser/MIR builder for Phase20.31.

User-facing spec (Phase1)

  • Read: expr[index] for Array/Map
  • Write: expr[index] = value for Array/Map
  • String indexing/ranges: out of scope in Phase1
  • Unsupported receiver: FailFast with a stable diagnostic

Required changes (Hako compiler)

  • Parser
    • Add IndexExpr(target, index)
    • Permit Assign(IndexExpr, value) on LHS
  • Lowering (MIR emit)
    • Array: index read/write → BoxCall("get"/"set") on ArrayBox
    • Map: index read/write → BoxCall("get"/"set") on MapBox
    • Optional (AOT): dotted extern mapping remains as today (nyash.array.get_h, nyash.map.set_hh …)
  • Diagnostics
    • If receiver type cannot be resolved to ArrayBox/MapBox, emit: "index operator is only supported for Array/Map"

Smokes (optin, external HAKO_BIN)

  • tools/smokes/v2/profiles/quick/core/index_operator_hako.sh
    • Requires HAKO_BIN; skips with WARN when missing
    • Canaries: array read/write, map rw, negative string

Rollout

  • No flags are required; follow Rust side semantics.
  • Keep Phase2 (String/range) for later work.