runner: promote @local expansion to first-class (default ON) across vm & selfhost; docs updated to reflect standard sugar
This commit is contained in:
@ -15,7 +15,7 @@ Status Snapshot — 2025‑09‑27
|
|||||||
Decision — Variables (Option A; 2025‑09‑27)
|
Decision — Variables (Option A; 2025‑09‑27)
|
||||||
- 方針: var/let は導入しない。ローカルは常に `local` で明示宣言。
|
- 方針: var/let は導入しない。ローカルは常に `local` で明示宣言。
|
||||||
- 目的: SSA/Loop‑Form と Known/Union 解析の単純さを維持し、未宣言代入の混入を防ぐ。
|
- 目的: 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 不採用」を明記。
|
- Docs 更新: quick-reference, language reference, tutorials に「var/let 不採用」を明記。
|
||||||
- Tokenizer/Parser デバッグ導線(devトレース)を追加
|
- Tokenizer/Parser デバッグ導線(devトレース)を追加
|
||||||
- json_lint_vm: fast‑pathの誤判定を除去+未終端ガードを追加(PASS)
|
- json_lint_vm: fast‑pathの誤判定を除去+未終端ガードを追加(PASS)
|
||||||
@ -79,6 +79,10 @@ Work Queue (Next)
|
|||||||
6) Router 観測ログの軽追加(dev-only, 既定OFF): class-reroute / special-reroute を DebugHub に emit(サンプル制御対応)
|
6) Router 観測ログの軽追加(dev-only, 既定OFF): class-reroute / special-reroute を DebugHub に emit(サンプル制御対応)
|
||||||
7) LLVM ハーネスの MIR ダンプに certainty 表示(挙動不変の診断整合)
|
7) LLVM ハーネスの MIR ダンプに certainty 表示(挙動不変の診断整合)
|
||||||
|
|
||||||
|
Update — @local expansion promotion (2025‑09‑27)
|
||||||
|
- すべてのランナーモードに `preexpand_at_local` を適用(common/llvm/pyvm に加え vm/selfhost へも導入)。
|
||||||
|
- Docs を更新し、構文糖衣が標準で有効であることを明記。
|
||||||
|
|
||||||
Runbook(抜粋)
|
Runbook(抜粋)
|
||||||
- VM quick: `tools/smokes/v2/run.sh --profile quick`
|
- VM quick: `tools/smokes/v2/run.sh --profile quick`
|
||||||
- LLVM llvmlite: `cargo build --release --features llvm && tools/smokes/v2/run.sh --profile integration`
|
- LLVM llvmlite: `cargo build --release --features llvm && tools/smokes/v2/run.sh --profile integration`
|
||||||
|
|||||||
@ -11,6 +11,7 @@ local x = 10, y = 20, z # 混合初期化
|
|||||||
```
|
```
|
||||||
|
|
||||||
注意: Nyash は `var`/`let` を採用していません。常に `local` で明示宣言してください(未宣言名への代入はエラー)。
|
注意: Nyash は `var`/`let` を採用していません。常に `local` で明示宣言してください(未宣言名への代入はエラー)。
|
||||||
|
補足: 行頭 `@name[:T] = expr` は標準ランナーで `local name[:T] = expr` に自動展開されます(意味は不変)。
|
||||||
|
|
||||||
### Box定義(クラス)
|
### Box定義(クラス)
|
||||||
```nyash
|
```nyash
|
||||||
|
|||||||
@ -165,7 +165,7 @@ x = 42 # RuntimeError: 未宣言変数 + 修正提案表示
|
|||||||
#### **設計方針(var/let について)**
|
#### **設計方針(var/let について)**
|
||||||
- Nyash は `var`/`let` を導入しません。ローカル変数は常に `local` で明示宣言します。
|
- Nyash は `var`/`let` を導入しません。ローカル変数は常に `local` で明示宣言します。
|
||||||
- 目的: 代入点と定義点を一致させ、Loop‑Form/SSA と解析(Known/Union)を簡潔に保つためです。
|
- 目的: 代入点と定義点を一致させ、Loop‑Form/SSA と解析(Known/Union)を簡潔に保つためです。
|
||||||
- 補足: 開発用の糖衣として行頭 `@name = expr` を `local name = expr` に前処理で展開する仕組みがあります(ランナー側、既定OFF)。言語仕様の一部ではありません。
|
- 補足: 行頭 `@name[:T] = expr` は標準ランナーで `local name[:T] = expr` に自動展開されます(構文糖衣、言語意味は不変)。
|
||||||
|
|
||||||
### **2.3 制御構文**
|
### **2.3 制御構文**
|
||||||
|
|
||||||
|
|||||||
@ -116,6 +116,9 @@ impl NyashRunner {
|
|||||||
}
|
}
|
||||||
} else { code };
|
} 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
|
// Parse to AST
|
||||||
let ast = match NyashParser::parse_from_string(&code) {
|
let ast = match NyashParser::parse_from_string(&code) {
|
||||||
Ok(ast) => ast,
|
Ok(ast) => ast,
|
||||||
|
|||||||
@ -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
|
// 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 use_tmp_only = crate::config::env::ny_compiler_use_tmp_only();
|
||||||
let tmp_dir = std::path::Path::new("tmp");
|
let tmp_dir = std::path::Path::new("tmp");
|
||||||
|
|||||||
Reference in New Issue
Block a user