Files
hakorune/docs/guides/core-principles.md

2.5 KiB
Raw Blame History

Nyash Core Principles — Minimal Syntax, Zero Runtime, Visual Flow

Status: design-only during the featurepause (no implementation changes)

Core (one page summary)

  • Minimal syntax: { … } + -> + |args| or _ for flow; guard chains as the canonical first-match form. No new match construct; normalize instead.
  • Zero-runtime lowering: always desugar to let/if/call/ret/phi. No new opcodes, no implicit closures.
  • Capture policy: capture by reference by default; mutation requires mut on the captured binding. Captures remain within the defining scope.
  • ASI/format: treat -> as a low-precedence line-continue. Formatter aligns arrows vertically.

Before/After (normalize view)

  • Each example documents Ny → normalized Ny → MIR intent (design-only):
    1. Flow serial: {read} -> { |x| validate(x) } -> { |x| save(x) }
    2. Guard chain: guard c1 -> {A}; guard c2 -> {B}; else -> {C}
    3. If horizontal: if cond -> {A} else -> {B}
    4. Range pattern: guard ch in '0'..'9' -> { ... }
    5. Digit helper: acc = acc*10 + ch.toDigitOrNull() (null-guarded)

nyfmt alignment (visual flow)

{ fetch() }
  -> { validate(_) }
  -> { save(_) }

Domain demos (≤20 lines each)

  • ETL pipeline: read -> validate -> normalize -> save
  • Text/number parse: guard ch in '0'..'9' -> { acc = acc*10 + ch.toDigitOrNull() }
  • Mini state machine: guard-first horizontal description with else fallback

Observability (spec hooks; design-only)

  • NYASH_SCOPE_TRACE=1|json: enter/exit + captures (JSONL: sid, caps, ret).
  • NYASH_FLOW_TRACE=1: desugared steps like t0=B0(); t1=B1(t0);.

Runtime/API additions (docs-only during the featurepause)

  • StringBox/Utf8Cursor: toDigitOrNull(base=10), toIntOrNull() — compile to simple comparisons/arithmetic.
  • Guard sugar: Range ('0'..'9') and CharClass (Digit, AZ, az, Alnum, Space) — compile to bound checks.

Acceptance & guardrails (featurepause)

  • “No new grammar beyond sugar” and “no new VM opcodes” as hard rules during the featurepause.

  • Golden texts (Ny → MIR fragments) to lock compatibility where practical.

  • Lint proposals are documentation-only: single-use scope, long -> chains, duplicated side effects.

  • Related docs

  • development/proposals/scope-reuse.md — local scope reuse blocks (MVP)

  • development/design/legacy/flow-blocks.md — arrow flow + anonymous blocks

  • reference/language/match-guards.md — guard chains + range/charclass sugar

  • reference/language/strings.md — UTF8 first; proposed digit helpers