Files
hakorune/docs/specs/language/index-operator.md

1.4 KiB
Raw Blame History

Index Operator — Design (Phase20.31 scoped)

Scope (Phase1)

  • Support bracket indexing for Array/Map:
    • Read: expr[index]
    • Write: expr[index] = value
  • Semantics (lowering):
    • Array
      • Read → nyash.array.get_h(handle, idx)
      • Write → nyash.array.set_h(handle, idx, val)
    • Map
      • Read → nyash.map.get_hh(handle, key_any)
      • Write → nyash.map.set_hh(handle, key_any, val_any)
  • Out of scope in Phase1: String indexing/ranges.

Parser/AST

  • Add IndexExpr(target, index)
  • Permit Assign(IndexExpr, value) on the LHS.

MIR Lowering (FailFast contract)

  • If receiver is neither Array nor Map → error: "index operator is only supported for Array/Map".
  • For Map keys/values:
    • If arguments are SSA values (handles), pass as is; otherwise wrap primitive i64 as IntegerBox via available builder utilities.

Error Policy

  • FailFast, no silent fallback.
  • Stable diagnostics for unsupported types and malformed LHS.

Rollout / Flags

  • Implement in Rust parser first; Ny parser later.
  • If needed, guard with a dev flag for initial rollout (HAKO_INDEX_OPERATOR_DEV=1), default ON in dev profile, OFF in prod profiles.

Tests (canaries)

  • arr_read: [1,2][0] == 1 → true
  • arr_write: arr[1]=3; arr[1]==3 → true
  • map_rw: m[10]=7; m[10]==7 → true
  • negative: "hello"[0] (Phase1) → error

Notes

  • This leverages existing NyRT dotted externs already implemented for Array/Map, minimizing surface area and risk.