- Fix condition_fn resolution: Value call path + dev safety + stub injection - VM bridge: handle Method::birth via BoxCall; ArrayBox push/get/length/set direct bridge - Receiver safety: pin receiver in method_call_handlers to avoid undefined use across blocks - Local vars: materialize on declaration (use init ValueId; void for uninit) - Prefer legacy BoxCall for Array/Map/String/user boxes in emit_box_or_plugin_call (stability-first) - Test runner: update LLVM hint to llvmlite harness (remove LLVM_SYS_180_PREFIX guidance) - Docs/roadmap: update CURRENT_TASK with unified default-ON + guards Note: NYASH_DEV_BIRTH_INJECT_BUILTINS=1 can re-enable builtin birth() injection during migration.
3.2 KiB
3.2 KiB
Nyash Quick Reference (MVP)
Purpose
- One‑page practical summary for writing and implementing Nyash.
- Keep grammar minimal; clarify rules that often cause confusion.
Keywords (reserved)
- control:
if,else,loop,match,case,break,continue,return - decl:
static,box,local,using,as - lit:
true,false,null,void
Expressions and Calls
- Function call:
f(a, b) - Method call:
obj.m(a, b)— internally rewritten to function form:Class.m(me: obj, a, b)- Rewrite is default‑ON; backends (VM/LLVM/Ny) receive the unified call shape.
- Member:
obj.fieldorobj.m
Display & Conversion
- Human‑readable display:
str(x)(推奨)/x.str()- 既存の
toString()はstr()に正規化(Builder早期リライト)。 - 互換: 既存の
stringify()は当面エイリアス(内部でstr()相当へ誘導)。
- 既存の
- Debug表示(構造的・安定):
repr(x)(将来導入、devのみ) - JSONシリアライズ:
toJson(x)(文字列)/toJsonNode(x)(構造)
Operators (precedence high→low)
- Unary:
! ~ - - Multiplicative:
* / % - Additive:
+ - - Compare:
== != < <= > >= - Logical:
&& ||(short‑circuit, side‑effect aware)
Semicolons and ASI (Automatic Semicolon Insertion)
- Allowed to omit semicolon at:
- End of line, before
}or at EOF, when the statement is syntactically complete.
- End of line, before
- Not allowed:
- Line break immediately after a binary operator (e.g.,
1 +\n2) - Ambiguous continuations; parser must Fail‑Fast with a clear message.
- Line break immediately after a binary operator (e.g.,
Truthiness (boolean context)
Bool→ itselfInteger→0is false; non‑zero is trueString→ empty string is false; otherwise trueArray/Map→ non‑null is true (size is not consulted)null/void→ false
Equality and Comparison
==and!=compare primitive values (Integer/Bool/String). No implicit cross‑type coercion.- Box/Instance comparisons should use explicit methods (
equals), or be normalized by the builder. - Compare operators
< <= > >=are defined on integers (MVP).
String and Numeric +
- If either side is
String,+is string concatenation. - If both sides are numeric,
+is addition. - Other mixes are errors (dev: warn; prod: error) — keep it explicit(必要なら
str(x)を使う)。
Blocks and Control
if (cond) { ... } [else { ... }]loop (cond) { ... }— minimal loop formmatch (expr) { case ... }— MVP (literals and simple type patterns)
Using / SSOT
- Dev/CI: file‑based
usingallowed for convenience. - Prod:
nyash.tomlonly. Duplicate imports or alias rebinding is an error.
Errors (format)
- Always:
Error at line X, column Y: <message> - For tokenizer errors, add the reason and show one nearby line if possible.
Dev/Prod toggles (indicative)
NYASH_DEV=1— developer defaults (diagnostics, tracing; behavior unchanged)NYASH_ENABLE_USING=1— enable using resolverNYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1— allowmainas top‑level entry
Notes
- Keep the language small. Prefer explicit conversions (
int(x),str(x),bool(x)) in standard helpers over implicit coercions. - Builder rewrites method calls to keep runtime dispatch simple and consistent across backends.