diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index cac37356..94c584cf 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -15,7 +15,7 @@ Status Snapshot — 2025‑09‑27 Decision — Variables (Option A; 2025‑09‑27) - 方針: var/let は導入しない。ローカルは常に `local` で明示宣言。 - 目的: SSA/Loop‑Form と Known/Union 解析の単純さを維持し、未宣言代入の混入を防ぐ。 -- 補足: 開発用の糖衣(行頭 `@name = expr` → `local name = expr`)はランナー前処理で提供(既定OFF)。言語仕様には含めない。 +- 補足: 行頭 `@name[:T] = expr` は標準ランナーで `local name[:T] = expr` へ自動展開(既定ON)。言語意味は不変。 - Docs 更新: quick-reference, language reference, tutorials に「var/let 不採用」を明記。 - Tokenizer/Parser デバッグ導線(devトレース)を追加 - json_lint_vm: fast‑pathの誤判定を除去+未終端ガードを追加(PASS) @@ -79,6 +79,10 @@ Work Queue (Next) 6) Router 観測ログの軽追加(dev-only, 既定OFF): class-reroute / special-reroute を DebugHub に emit(サンプル制御対応) 7) LLVM ハーネスの MIR ダンプに certainty 表示(挙動不変の診断整合) +Update — @local expansion promotion (2025‑09‑27) +- すべてのランナーモードに `preexpand_at_local` を適用(common/llvm/pyvm に加え vm/selfhost へも導入)。 +- Docs を更新し、構文糖衣が標準で有効であることを明記。 + Runbook(抜粋) - VM quick: `tools/smokes/v2/run.sh --profile quick` - LLVM llvmlite: `cargo build --release --features llvm && tools/smokes/v2/run.sh --profile integration` diff --git a/docs/quick-reference/syntax-cheatsheet.md b/docs/quick-reference/syntax-cheatsheet.md index f44802c0..4e67e798 100644 --- a/docs/quick-reference/syntax-cheatsheet.md +++ b/docs/quick-reference/syntax-cheatsheet.md @@ -11,6 +11,7 @@ local x = 10, y = 20, z # 混合初期化 ``` 注意: Nyash は `var`/`let` を採用していません。常に `local` で明示宣言してください(未宣言名への代入はエラー)。 +補足: 行頭 `@name[:T] = expr` は標準ランナーで `local name[:T] = expr` に自動展開されます(意味は不変)。 ### Box定義(クラス) ```nyash diff --git a/docs/reference/language/LANGUAGE_REFERENCE_2025.md b/docs/reference/language/LANGUAGE_REFERENCE_2025.md index 60873127..b5946a55 100644 --- a/docs/reference/language/LANGUAGE_REFERENCE_2025.md +++ b/docs/reference/language/LANGUAGE_REFERENCE_2025.md @@ -165,7 +165,7 @@ x = 42 # RuntimeError: 未宣言変数 + 修正提案表示 #### **設計方針(var/let について)** - Nyash は `var`/`let` を導入しません。ローカル変数は常に `local` で明示宣言します。 - 目的: 代入点と定義点を一致させ、Loop‑Form/SSA と解析(Known/Union)を簡潔に保つためです。 -- 補足: 開発用の糖衣として行頭 `@name = expr` を `local name = expr` に前処理で展開する仕組みがあります(ランナー側、既定OFF)。言語仕様の一部ではありません。 +- 補足: 行頭 `@name[:T] = expr` は標準ランナーで `local name[:T] = expr` に自動展開されます(構文糖衣、言語意味は不変)。 ### **2.3 制御構文** diff --git a/src/runner/modes/vm.rs b/src/runner/modes/vm.rs index 66957003..12705ddc 100644 --- a/src/runner/modes/vm.rs +++ b/src/runner/modes/vm.rs @@ -116,6 +116,9 @@ impl NyashRunner { } } else { code }; + // Pre-expand '@name[:T] = expr' sugar at line-head (same as common/llvm/pyvm paths) + let code = crate::runner::modes::common_util::resolve::preexpand_at_local(&code); + // Parse to AST let ast = match NyashParser::parse_from_string(&code) { Ok(ast) => ast, diff --git a/src/runner/selfhost.rs b/src/runner/selfhost.rs index 0def7ad6..f1ba7d5d 100644 --- a/src/runner/selfhost.rs +++ b/src/runner/selfhost.rs @@ -38,6 +38,12 @@ impl NyashRunner { } } + // Promote dev sugar to standard: pre-expand line-head '@name[:T] = expr' to 'local name[:T] = expr' + { + let expanded = crate::runner::modes::common_util::resolve::preexpand_at_local(code_ref.as_ref()); + code_ref = std::borrow::Cow::Owned(expanded); + } + // Write to tmp/ny_parser_input.ny (as expected by Ny parser v0), unless forced to reuse existing tmp let use_tmp_only = crate::config::env::ny_compiler_use_tmp_only(); let tmp_dir = std::path::Path::new("tmp");