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

49 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
- proposals/scope-reuse.md — local scope reuse blocks (MVP)
- design/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