phase: 20.49 COMPLETE; 20.50 Flow+String minimal reps; 20.51 selfhost v0/v1 minimal (Option A/B); hv1-inline binop/unop/copy; docs + run_all + CURRENT_TASK -> 21.0
This commit is contained in:
6
.github/workflows/fast-smoke.yml
vendored
6
.github/workflows/fast-smoke.yml
vendored
@ -43,21 +43,21 @@ jobs:
|
||||
- name: EXE smoke (ternary_basic -> 10)
|
||||
run: |
|
||||
mkdir -p tmp
|
||||
./target/release/nyash --emit-mir-json tmp/tb.json --backend mir apps/tests/ternary_basic.nyash
|
||||
./target/release/nyash --emit-mir-json tmp/tb.json --backend mir apps/tests/ternary_basic.hako
|
||||
./target/release/ny-llvmc --in tmp/tb.json --emit exe --nyrt target/release --out tmp/tb
|
||||
set +e; ./tmp/tb >/dev/null 2>&1; CODE=$?; set -e
|
||||
echo "exit=$CODE"; test "$CODE" -eq 10
|
||||
|
||||
- name: EXE smoke (ternary_nested -> 50)
|
||||
run: |
|
||||
./target/release/nyash --emit-mir-json tmp/tn.json --backend mir apps/tests/ternary_nested.nyash
|
||||
./target/release/nyash --emit-mir-json tmp/tn.json --backend mir apps/tests/ternary_nested.hako
|
||||
./target/release/ny-llvmc --in tmp/tn.json --emit exe --nyrt target/release --out tmp/tn
|
||||
set +e; ./tmp/tn >/dev/null 2>&1; CODE=$?; set -e
|
||||
echo "exit=$CODE"; test "$CODE" -eq 50
|
||||
|
||||
- name: EXE smoke (peek_expr_block -> 1)
|
||||
run: |
|
||||
./target/release/nyash --emit-mir-json tmp/pb.json --backend mir apps/tests/peek_expr_block.nyash
|
||||
./target/release/nyash --emit-mir-json tmp/pb.json --backend mir apps/tests/peek_expr_block.hako
|
||||
./target/release/ny-llvmc --in tmp/pb.json --emit exe --nyrt target/release --out tmp/pb
|
||||
set +e; ./tmp/pb >/dev/null 2>&1; CODE=$?; set -e
|
||||
echo "exit=$CODE"; test "$CODE" -eq 1
|
||||
|
||||
4
.github/workflows/min-gate.yml
vendored
4
.github/workflows/min-gate.yml
vendored
@ -203,9 +203,9 @@ jobs:
|
||||
NYASH_MACRO_BOX: "1"
|
||||
NYASH_MACRO_BOX_NY: "1"
|
||||
NYASH_MACRO_BOX_CHILD_RUNNER: "0"
|
||||
NYASH_MACRO_BOX_NY_PATHS: apps/macros/examples/upper_string_macro.nyash
|
||||
NYASH_MACRO_BOX_NY_PATHS: apps/macros/examples/upper_string_macro.hako
|
||||
run: |
|
||||
set -euo pipefail
|
||||
out=$(./target/release/nyash --macro-preexpand --backend vm apps/tests/macro_golden_upper_string.nyash 2>&1)
|
||||
out=$(./target/release/nyash --macro-preexpand --backend vm apps/tests/macro_golden_upper_string.hako 2>&1)
|
||||
echo "$out"
|
||||
echo "$out" | grep -q "HELLO"
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -71,7 +71,7 @@ nyash-rust/
|
||||
/*_error.txt
|
||||
|
||||
# 一時的なテストファイル(ルートに置かない!)
|
||||
/test_*.nyash
|
||||
/test_*.hako
|
||||
|
||||
# HTTP/ネットワークテストログ
|
||||
/http_test*.log
|
||||
|
||||
36
AGENTS.md
36
AGENTS.md
@ -188,8 +188,8 @@ fn check_layer_boundary() {
|
||||
- ここは Nyash の Cranelift JIT/AOT 開発用ブランチだよ。JIT 経路の実装・検証・計測が主対象だよ。
|
||||
- ビルド(JIT有効): `cargo build --release --features cranelift-jit`
|
||||
- 実行モード:
|
||||
- CLI Cranelift: `./target/release/nyash --backend cranelift apps/APP/main.nyash`
|
||||
- JITダイレクト(VM非介入): `./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.nyash`
|
||||
- CLI Cranelift: `./target/release/nyash --backend cranelift apps/APP/main.hako`
|
||||
- JITダイレクト(VM非介入): `./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.hako`
|
||||
- デバッグ環境変数(例):
|
||||
- `NYASH_JIT_EXEC=1`(JIT実行許可)
|
||||
- `NYASH_JIT_STATS=1`(コンパイル/実行統計)
|
||||
@ -206,16 +206,16 @@ fn check_layer_boundary() {
|
||||
**PyVM 主経路(Phase‑15 方針)**
|
||||
- 主経路: Python/llvmlite + PyVM を標準の実行/検証経路として扱うよ。Rust VM/JIT は補助(保守/比較/プラグイン検証)。
|
||||
- 使い分け:
|
||||
- PyVM(推奨・日常確認): `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/APP/main.nyash`
|
||||
- llvmlite ハーネス: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
||||
- パリティ検証: `tools/parity.sh --lhs pyvm --rhs llvmlite apps/tests/CASE.nyash`
|
||||
- PyVM(推奨・日常確認): `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/APP/main.hako`
|
||||
- llvmlite ハーネス: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||
- パリティ検証: `tools/parity.sh --lhs pyvm --rhs llvmlite apps/tests/CASE.hako`
|
||||
- 自己ホスト(Ny→JSON v0): `NYASH_USE_NY_COMPILER=1` は emit‑only 既定で運用(`NYASH_NY_COMPILER_EMIT_ONLY=1`)。子プロセスは Quiet pipe(`NYASH_JSON_ONLY=1`)。
|
||||
- 子プロセス安全策: タイムアウト `NYASH_NY_COMPILER_TIMEOUT_MS`(既定 2000ms)。違反時は kill→フォールバック(無限ループ抑止)。
|
||||
- スモーク(代表):
|
||||
- PyVM Stage‑2: `tools/pyvm_stage2_smoke.sh`
|
||||
- PHI/Stage‑2: `tools/ny_parser_stage2_phi_smoke.sh`
|
||||
- Bridge/Stage‑2: `tools/ny_stage2_bridge_smoke.sh`
|
||||
- 文字列/dirname など: `apps/tests/*.nyash` を PyVM で都度確認
|
||||
- 文字列/dirname など: `apps/tests/*.hako` を PyVM で都度確認
|
||||
- 注意: Phase‑15 では VM/JIT は MIR14 以降の更新を最小とし、PyVM/llvmlite のパリティを最優先で維持するよ。
|
||||
|
||||
## Codex Async Workflow (Background Jobs)
|
||||
@ -260,7 +260,7 @@ Notes
|
||||
- `NYASH_SELFHOST_READ_TMP=1` → 子に `-- --read-tmp`(`tmp/ny_parser_input.ny` を FileBox で読み込む。CIでは未使用)
|
||||
- `NYASH_NY_COMPILER_STAGE3=1` → 子に `-- --stage3`(Stage‑3 構文受理: Break/Continue/Throw/Try)
|
||||
- `NYASH_NY_COMPILER_CHILD_ARGS` → スペース区切りで子にそのまま渡す
|
||||
- 子側(apps/selfhost-compiler/compiler.nyash)は `--read-tmp` を受理して `tmp/ny_parser_input.ny` を読む(plugins 必要)。
|
||||
- 子側(apps/selfhost-compiler/compiler.hako)は `--read-tmp` を受理して `tmp/ny_parser_input.ny` を読む(plugins 必要)。
|
||||
|
||||
## PyVM Scope & Policy(Stage‑2 開発用の範囲)
|
||||
- 目的: PyVM は「開発用の参照実行器」だよ。JSON v0 → MIR 実行の意味論確認と llvmlite とのパリティ監視に使う(プロダクション最適化はしない)。
|
||||
@ -277,7 +277,7 @@ Notes
|
||||
- 非対象(やらない): プラグイン動的ロード/ABI、GC/スケジューラ、例外/非同期、大きな I/O/OS 依存、性能最適化。
|
||||
- 運用ポリシー: 仕様差は llvmlite に合わせて PyVM を調整。未知の extern/boxcall は安全に `None`/no-op。既定は静音、`NYASH_CLI_VERBOSE=1` で詳細。
|
||||
- 実行とスモーク:
|
||||
- PyVM 実行: `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/tests/CASE.nyash`
|
||||
- PyVM 実行: `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/tests/CASE.hako`
|
||||
- 代表スクリプト: `tools/pyvm_stage2_smoke.sh`, `tools/pyvm_collections_smoke.sh`, `tools/pyvm_stage2_dot_chain_smoke.sh`
|
||||
- Bridge 短絡(RHS スキップ): `tools/ny_stage2_shortcircuit_smoke.sh`
|
||||
- CI: `.github/workflows/pyvm-smoke.yml` を常時緑に維持。LLVM18 がある環境では `tools/parity.sh --lhs pyvm --rhs llvmlite` を任意ジョブで回す。
|
||||
@ -339,9 +339,9 @@ Notes
|
||||
- Build (LLVM AOT / harness-first):
|
||||
- `cargo build --release -p nyash-llvm-compiler` (ny-llvmc builder)
|
||||
- `cargo build --release --features llvm`
|
||||
- Run via harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
||||
- Quick VM run: `./target/release/nyash --backend vm apps/APP/main.nyash`
|
||||
- Emit + link (LLVM): `tools/build_llvm.sh apps/APP/main.nyash -o app`
|
||||
- Run via harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||
- Quick VM run: `./target/release/nyash --backend vm apps/APP/main.hako`
|
||||
- Emit + link (LLVM): `tools/build_llvm.sh apps/APP/main.hako -o app`
|
||||
- Smokes (v2):
|
||||
- Single entry: `tools/smokes/v2/run.sh --profile quick`
|
||||
- Profiles: `quick|integration|full`(`--filter <glob>` で絞り込み)
|
||||
@ -391,7 +391,7 @@ Notes
|
||||
|
||||
- using/namespace の解決
|
||||
- using は Runner 側で解決(Phase‑15)。`nyash.toml` の `[using]`(paths / <name> / aliases)を参照。
|
||||
- include は廃止。`using "./path/file.nyash" as Name` を推奨。
|
||||
- include は廃止。`using "./path/file.hako" as Name` を推奨。
|
||||
|
||||
- スモーク/検証の方針
|
||||
- 既定の開発確認は Rust VM ラインで行い、LLVM ラインは AOT/ハーネスの代表スモークでカバー。
|
||||
@ -399,9 +399,9 @@ Notes
|
||||
- PyVM は参照実行器(保守最小)。言語機能の確認や LLVM ハーネスのパリティ検証が主目的で、既定経路では使わない。
|
||||
|
||||
- 実行例(目安)
|
||||
- Rust VM(既定): `./target/release/nyash apps/APP/main.nyash`
|
||||
- LLVM Harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
||||
- AOT ビルド: `tools/build_llvm.sh apps/APP/main.nyash -o app`
|
||||
- Rust VM(既定): `./target/release/nyash apps/APP/main.hako`
|
||||
- LLVM Harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||
- AOT ビルド: `tools/build_llvm.sh apps/APP/main.hako -o app`
|
||||
|
||||
- セルフホスティング指針
|
||||
- 本方針(Rust VM=主、LLVM=AOT)はそのまま自己ホストの軸にする。
|
||||
@ -447,7 +447,7 @@ Flags
|
||||
|
||||
- How to run harness
|
||||
- Build: `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
||||
- Run: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.nyash`
|
||||
- Run: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.hako`
|
||||
- IR dump: `NYASH_LLVM_DUMP_IR=tmp/nyash_harness.ll ...`
|
||||
- PHI trace: `NYASH_LLVM_TRACE_PHI=1 ...` (JSON lines output via `phi_wiring.common.trace`)
|
||||
|
||||
@ -475,7 +475,7 @@ Flags
|
||||
## Testing Guidelines
|
||||
- Rust tests: `cargo test` (add targeted unit tests near code).
|
||||
- Smoke scripts validate end‑to‑end AOT/JIT (`tools/llvm_smoke.sh`).
|
||||
- Test naming: prefer `*_test.rs` for Rust and descriptive `.nyash` files under `apps/` or `tests/`.
|
||||
- Test naming: prefer `*_test.rs` for Rust and descriptive `.hako` files under `apps/` or `tests/`.
|
||||
- For LLVM tests, ensure Python llvmlite is available and `ny-llvmc` is built.
|
||||
- Build (harness): `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
||||
|
||||
@ -504,5 +504,5 @@ Flags
|
||||
- `NYASH_LLVM_PREPASS_LOOP=1` – enable simple while prepass (loopform synthesis).
|
||||
- `NYASH_CLI_VERBOSE=1` – extra trace from builder.
|
||||
- Smokes:
|
||||
- Empty PHI guard: `tools/test/smoke/llvm/ir_phi_empty_check.sh <file.nyash>`
|
||||
- Empty PHI guard: `tools/test/smoke/llvm/ir_phi_empty_check.sh <file.hako>`
|
||||
- Batch run: `tools/test/smoke/llvm/ir_phi_empty_check_all.sh`
|
||||
|
||||
124
CLAUDE.md
124
CLAUDE.md
@ -52,7 +52,7 @@ tools/smokes/v2/run.sh --profile quick --filter "<glob>"
|
||||
bash tools/smokes/v2/profiles/quick/core/selfhost_mir_m3_jump_vm.sh
|
||||
|
||||
# 単発実行(参考)
|
||||
./target/release/nyash --backend vm apps/APP/main.nyash
|
||||
./target/release/nyash --backend vm apps/APP/main.hako
|
||||
```
|
||||
|
||||
#### ⚡ llvmlite ライン(LLVMハーネス)
|
||||
@ -73,7 +73,7 @@ tools/smokes/v2/run.sh --profile integration --filter "<glob>"
|
||||
# 例: --filter "vm_llvm_*" # VM/LLVM比較系のみ
|
||||
|
||||
# 単発実行
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.nyash
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.hako
|
||||
|
||||
# 有効化確認
|
||||
./target/release/nyash --version | rg -i 'features.*llvm'
|
||||
@ -158,26 +158,26 @@ Nyashは「Everything is Box」。実装・最適化・検証のすべてを「
|
||||
### 🎯 **2本柱実行方式** (推奨!)
|
||||
```bash
|
||||
# 🔧 開発・デバッグ・検証用 (Rust VM)
|
||||
./target/release/nyash program.nyash
|
||||
./target/release/nyash --backend vm program.nyash
|
||||
./target/release/nyash program.hako
|
||||
./target/release/nyash --backend vm program.hako
|
||||
|
||||
# ⚡ 本番・最適化・配布用 (LLVM)
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# 🛡️ プラグインエラー対策
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||
|
||||
# 🔍 詳細診断
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||
```
|
||||
|
||||
### 🚀 **Phase 15 セルフホスティング専用**
|
||||
```bash
|
||||
# JSON v0ブリッジ(PyVM特殊用途)
|
||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.hako
|
||||
|
||||
# using処理確認
|
||||
./target/release/nyash --enable-using program_with_using.nyash
|
||||
./target/release/nyash --enable-using program_with_using.hako
|
||||
|
||||
# ラウンドトリップテスト
|
||||
./tools/ny_roundtrip_smoke.sh
|
||||
@ -189,10 +189,10 @@ NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
||||
cargo build --release
|
||||
|
||||
# 開発・デバッグ実行(Rust VM)
|
||||
./target/release/nyash program.nyash
|
||||
./target/release/nyash program.hako
|
||||
|
||||
# 本番・最適化実行(LLVM)
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
```
|
||||
|
||||
### 🪟 Windows版
|
||||
@ -210,7 +210,7 @@ target/x86_64-pc-windows-msvc/release/nyash.exe
|
||||
# TODO: VM/LLVMベースのWASM実装に移行予定
|
||||
|
||||
# LLVM AOTコンパイル(実験的)
|
||||
./target/release/nyash --backend llvm program.nyash # 実行時最適化
|
||||
./target/release/nyash --backend llvm program.hako # 実行時最適化
|
||||
```
|
||||
|
||||
### 🎯 **2本柱ビルド方法** (2025-09-28更新)
|
||||
@ -228,20 +228,20 @@ cargo build --release --features llvm
|
||||
```bash
|
||||
# 1. Rust VM実行 ✅(開発・デバッグ用)
|
||||
cargo build --release
|
||||
./target/release/nyash program.nyash
|
||||
./target/release/nyash program.hako
|
||||
|
||||
# 2. LLVM実行 ✅(本番・最適化用, llvmliteハーネス)
|
||||
cargo build --release --features llvm
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm program.nyash
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# 3. プラグインテスト実証済み ✅
|
||||
# CounterBox
|
||||
echo 'local c = new CounterBox(); c.inc(); c.inc(); print(c.get())' > test.nyash
|
||||
./target/release/nyash --backend llvm test.nyash
|
||||
echo 'local c = new CounterBox(); c.inc(); c.inc(); print(c.get())' > test.hako
|
||||
./target/release/nyash --backend llvm test.hako
|
||||
|
||||
# StringBox
|
||||
echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.nyash
|
||||
./target/release/nyash test.nyash
|
||||
echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.hako
|
||||
./target/release/nyash test.hako
|
||||
|
||||
```
|
||||
|
||||
@ -256,19 +256,19 @@ echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.nyash
|
||||
|
||||
```bash
|
||||
# 🎯 基本実行(まずこれ)- Rust VM
|
||||
./target/release/nyash program.nyash
|
||||
./target/release/nyash program.hako
|
||||
|
||||
# ⚡ 本番・最適化実行 - LLVM
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# 🛡️ プラグインエラー対策(緊急時のみ)
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||
|
||||
# 🔍 詳細診断情報
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||
|
||||
# ⚠️ PyVM特殊用途(JSON v0ブリッジ・セルフホスト専用)
|
||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.hako
|
||||
```
|
||||
|
||||
### 🚨 **Phase 15戦略確定**
|
||||
@ -303,9 +303,9 @@ NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
||||
**✅ 動作確認済み**:
|
||||
```bash
|
||||
# 基本using動作(環境変数・フラグ不要!)
|
||||
echo 'using nyashstd' > test.nyash
|
||||
echo 'console.log("Hello!")' >> test.nyash
|
||||
./target/release/nyash test.nyash
|
||||
echo 'using nyashstd' > test.hako
|
||||
echo 'console.log("Hello!")' >> test.hako
|
||||
./target/release/nyash test.hako
|
||||
# 出力: Hello!
|
||||
|
||||
# 実装箇所
|
||||
@ -342,17 +342,17 @@ src/runner/modes/common_util/resolve/strip.rs # コード生成
|
||||
## 🧪 テストスクリプト参考集(既存のを活用しよう!)
|
||||
```bash
|
||||
# 基本的なテスト
|
||||
./target/release/nyash local_tests/hello.nyash # Hello World
|
||||
./target/release/nyash local_tests/test_array_simple.nyash # ArrayBox
|
||||
./target/release/nyash apps/tests/string_ops_basic.nyash # StringBox
|
||||
./target/release/nyash local_tests/hello.hako # Hello World
|
||||
./target/release/nyash local_tests/test_array_simple.hako # ArrayBox
|
||||
./target/release/nyash apps/tests/string_ops_basic.hako # StringBox
|
||||
|
||||
# MIR確認用テスト
|
||||
./target/release/nyash --dump-mir apps/tests/loop_min_while.nyash
|
||||
./target/release/nyash --dump-mir apps/tests/esc_dirname_smoke.nyash
|
||||
./target/release/nyash --dump-mir apps/tests/loop_min_while.hako
|
||||
./target/release/nyash --dump-mir apps/tests/esc_dirname_smoke.hako
|
||||
|
||||
# 統一Call テスト(Phase A完成!)
|
||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --dump-mir test_simple_call.nyash
|
||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.nyash
|
||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --dump-mir test_simple_call.hako
|
||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.hako
|
||||
```
|
||||
|
||||
## 🚀 よく使う実行コマンド(忘れやすい)
|
||||
@ -360,17 +360,17 @@ NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.n
|
||||
### 🎯 基本実行方法
|
||||
```bash
|
||||
# VMバックエンド(デフォルト、高速)
|
||||
./target/release/nyash program.nyash
|
||||
./target/release/nyash --backend vm program.nyash
|
||||
./target/release/nyash program.hako
|
||||
./target/release/nyash --backend vm program.hako
|
||||
|
||||
# LLVMバックエンド(最適化済み)
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# プラグインテスト(LLVM)
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# プラグイン無効(デバッグ用)
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||
```
|
||||
|
||||
### 🔧 テスト・スモークテスト
|
||||
@ -400,34 +400,34 @@ NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
||||
### 🐛 デバッグ用環境変数
|
||||
```bash
|
||||
# 詳細診断
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||
|
||||
# JSON IR出力
|
||||
NYASH_DUMP_JSON_IR=1 ./target/release/nyash program.nyash
|
||||
NYASH_DUMP_JSON_IR=1 ./target/release/nyash program.hako
|
||||
|
||||
# MIR出力(重要!)
|
||||
NYASH_DUMP_MIR=1 ./target/release/nyash program.nyash
|
||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.nyash # VM実行時
|
||||
./target/release/nyash --dump-mir program.nyash # フラグ版
|
||||
NYASH_DUMP_MIR=1 ./target/release/nyash program.hako
|
||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.hako # VM実行時
|
||||
./target/release/nyash --dump-mir program.hako # フラグ版
|
||||
|
||||
# PyVMデバッグ
|
||||
NYASH_PYVM_DEBUG=1 ./target/release/nyash program.nyash
|
||||
NYASH_PYVM_DEBUG=1 ./target/release/nyash program.hako
|
||||
|
||||
# パーサー無限ループ対策
|
||||
./target/release/nyash --debug-fuel 1000 program.nyash
|
||||
./target/release/nyash --debug-fuel 1000 program.hako
|
||||
|
||||
# プラグインなし実行
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||
|
||||
# LLVMプラグイン実行(method_id使用)
|
||||
./target/release/nyash --backend llvm program.nyash
|
||||
./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# Python/llvmliteハーネス使用(開発中)
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.nyash
|
||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.hako
|
||||
|
||||
# 🚀 **Phase 15.5統一Call完全動作確認済み設定** (2025-09-24)
|
||||
# ❌ モックルート回避 - 実際のLLVMハーネス使用
|
||||
NYASH_MIR_UNIFIED_CALL=1 NYASH_DISABLE_PLUGINS=1 NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 NYASH_LLVM_USE_HARNESS=1 NYASH_LLVM_OBJ_OUT=/tmp/output.o ./target/release/nyash --backend llvm program.nyash
|
||||
NYASH_MIR_UNIFIED_CALL=1 NYASH_DISABLE_PLUGINS=1 NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 NYASH_LLVM_USE_HARNESS=1 NYASH_LLVM_OBJ_OUT=/tmp/output.o ./target/release/nyash --backend llvm program.hako
|
||||
|
||||
# 🔧 Python側で統一Call処理(llvmlite直接実行)
|
||||
cd src/llvm_py && NYASH_MIR_UNIFIED_CALL=1 ./venv/bin/python llvm_builder.py input.json -o output.o
|
||||
@ -439,18 +439,18 @@ cd src/llvm_py && NYASH_MIR_UNIFIED_CALL=1 ./venv/bin/python llvm_builder.py inp
|
||||
|
||||
```bash
|
||||
# 1️⃣ 最も確実: CLIフラグ使用
|
||||
./target/release/nyash --dump-mir program.nyash
|
||||
./target/release/nyash --dump-mir --mir-verbose program.nyash # 詳細版
|
||||
./target/release/nyash --dump-mir program.hako
|
||||
./target/release/nyash --dump-mir --mir-verbose program.hako # 詳細版
|
||||
|
||||
# 2️⃣ VM実行時のMIR出力
|
||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.nyash
|
||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.hako
|
||||
|
||||
# 3️⃣ JSON形式でファイル出力
|
||||
./target/release/nyash --emit-mir-json debug.json program.nyash
|
||||
./target/release/nyash --emit-mir-json debug.json program.hako
|
||||
cat debug.json | jq . # 整形表示
|
||||
|
||||
# 4️⃣ PyVM用JSON(自動生成)
|
||||
NYASH_VM_USE_PY=1 ./target/release/nyash program.nyash
|
||||
NYASH_VM_USE_PY=1 ./target/release/nyash program.hako
|
||||
cat tmp/nyash_pyvm_mir.json | jq .
|
||||
```
|
||||
|
||||
@ -472,16 +472,16 @@ cat tmp/nyash_pyvm_mir.json | jq .
|
||||
### 💡 **実用的デバッグフロー**
|
||||
```bash
|
||||
# Step 1: 基本MIR確認
|
||||
./target/release/nyash --dump-mir gemini_test_case.nyash
|
||||
./target/release/nyash --dump-mir gemini_test_case.hako
|
||||
|
||||
# Step 2: 詳細MIR + エフェクト情報
|
||||
./target/release/nyash --dump-mir --mir-verbose --mir-verbose-effects gemini_test_case.nyash
|
||||
./target/release/nyash --dump-mir --mir-verbose --mir-verbose-effects gemini_test_case.hako
|
||||
|
||||
# Step 3: VM実行時の挙動確認
|
||||
NYASH_VM_DUMP_MIR=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash gemini_test_case.nyash
|
||||
NYASH_VM_DUMP_MIR=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash gemini_test_case.hako
|
||||
|
||||
# Step 4: JSON形式で詳細解析
|
||||
./target/release/nyash --emit-mir-json mir.json gemini_test_case.nyash
|
||||
./target/release/nyash --emit-mir-json mir.json gemini_test_case.hako
|
||||
jq '.functions[0].blocks' mir.json # ブロック構造確認
|
||||
```
|
||||
|
||||
@ -569,7 +569,7 @@ Call { func: ValueId, callee: Option<Callee> } // 段階移行で破壊的変
|
||||
- **MIR compiler bug**: OR patternでInteger/Bool処理不備を発見・修正
|
||||
- **根本原因**: `exprs_peek.rs`でString型以外の型が未対応だった
|
||||
- **完全修正**: 全LiteralValue型(Integer/Bool/Float/Null/Void)対応で根治
|
||||
- **テスト検証**: `test_match_debug_or.nyash`等で完全動作確認
|
||||
- **テスト検証**: `test_match_debug_or.hako`等で完全動作確認
|
||||
- 🚀 **革命的効果達成!**
|
||||
- **保守性向上**: 改行処理一元管理で新構文追加時の改行忘れ根絶
|
||||
- **開発体験向上**: パーサーエラー激減、直感的な改行記述が可能
|
||||
@ -1033,9 +1033,9 @@ NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
||||
#### パーサー無限ループ対策
|
||||
```bash
|
||||
# 🔥 デバッグ燃料でパーサー制御
|
||||
./target/release/nyash --debug-fuel 1000 program.nyash # 1000回制限
|
||||
./target/release/nyash --debug-fuel unlimited program.nyash # 無制限
|
||||
./target/release/nyash program.nyash # デフォルト10万回
|
||||
./target/release/nyash --debug-fuel 1000 program.hako # 1000回制限
|
||||
./target/release/nyash --debug-fuel unlimited program.hako # 無制限
|
||||
./target/release/nyash program.hako # デフォルト10万回
|
||||
```
|
||||
|
||||
**対応状況**: must_advance!マクロでパーサー制御完全実装済み✅
|
||||
|
||||
@ -69,7 +69,7 @@ s.get() # ← 空文字列を返す
|
||||
|
||||
### 最小再現コード
|
||||
```bash
|
||||
# test_stringbox.nyash
|
||||
# test_stringbox.hako
|
||||
local s = new StringBox("Hello World")
|
||||
print("StringBox created")
|
||||
print(s) # 期待: "Hello World", 実際: ""
|
||||
@ -83,16 +83,16 @@ print("Length: " + len) # 期待: 11, 実際: 0
|
||||
./tools/plugin-tester/target/release/plugin-tester check --config nyash.toml
|
||||
|
||||
# テスト実行
|
||||
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 ./target/release/nyash test_stringbox.nyash
|
||||
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 ./target/release/nyash test_stringbox.hako
|
||||
```
|
||||
|
||||
### デバッグ情報収集
|
||||
```bash
|
||||
# 詳細ログ
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash test_stringbox.nyash
|
||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash test_stringbox.hako
|
||||
|
||||
# MIRダンプ確認
|
||||
./target/release/nyash --dump-mir test_stringbox.nyash
|
||||
./target/release/nyash --dump-mir test_stringbox.hako
|
||||
|
||||
# 具体的な問題箇所の確認
|
||||
rg "M_BIRTH" plugins/nyash-string-plugin/src/lib.rs # 該当箇所を特定
|
||||
|
||||
141
CURRENT_TASK.md
141
CURRENT_TASK.md
@ -1,30 +1,40 @@
|
||||
# Current Task — Phase 20.46 (self‑host E2E 2/2)
|
||||
# Current Task — Phase 21.0(Full Self‑Hosting)
|
||||
|
||||
目的(このフェーズで到達するゴール)
|
||||
- Self‑Hosting の決定性(S1/S2/S3 を3回連続で一致)
|
||||
- 代表の横展開(If/Logical/Loop/Array/Map/TypeOp/Extern)を no‑fallback で拡張
|
||||
- S3 代表(llvmlite + NyRT リンク)の最小一式を quick で常時緑(環境が無い場合はSKIPで保護)
|
||||
|
||||
This document is intentionally concise (≤ 500 lines). Detailed history and per‑phase plans are kept under docs/private/roadmap/. See links below.
|
||||
|
||||
Focus (now)
|
||||
- PRIMARY 完了の仕上げと codegen 代表 E2E(emit→llvmlite harness)
|
||||
- MirBuilder‑prefer 経路の代表拡張(If/Compare/Ternary/Match)と安定性強化
|
||||
- v0/v1 の振分け確認(hv1 inline / Core)と docs/カナリ整備
|
||||
Focus (now) - 🎯 完全自己ホストの最終整備
|
||||
- S1/S2(v1 生成の決定性): 代表を2本(const/flow)に拡充し、3回一致で固定
|
||||
- S3(llvmlite+NyRT、ゲート): ternary/map の代表でリンク→実行(rc期待)を確認
|
||||
- PRIMARY(no‑fallback): hv1 inline 直行で v1 reps(Option‑A/B 最小)を再確認
|
||||
|
||||
Remaining (20.46)
|
||||
- hv1 inline の代表を増やし、MirBuilder→hv1 を第一経路に(Coreは診断寄り)
|
||||
- codegen 代表(emit → llvmlite harness)が E2E で緑(既存 canary の横展開)
|
||||
- ループ系 JsonFragBox 化の安全サブセットを追加(sum_bc 近傍の補強)
|
||||
- MirBuilder‑prefer カナリを数本追加(If/Compare 亜種、Ternary/Match 混在)
|
||||
Remaining (21.0)
|
||||
- 21.0 run_all(S1/S2 + PRIMARY + S3ゲート)を追加(または既存 run_all を明記・流用)
|
||||
- S1/S2 を2本体制へ(const42 + flow)で3回一致の確認
|
||||
- S3 reps(ternary/map)をゲートで緑(環境が無い場合はSKIP)
|
||||
- README(21.0)に Quick Verify/DoD/環境要件を最終追記
|
||||
|
||||
Progress (wrap‑up of 20.45)
|
||||
- PRIMARY no-fallback reps(Return/If/Compare/Logical/Bool/Array.size/LoadStore)緑化
|
||||
- MirBuilder‑prefer reps(If(Int<Int), Ternary, Match)追加・緑化
|
||||
- v0 形状の統一(string JSON): lower_if_compare / MirBuilderBox fallbacks 等を functions[]/name="main"/blocks.id に統一
|
||||
- Logical(AND/OR) 根治(lower_return_logical を文字列出力、runner_min 採用拡張)
|
||||
Previous Achievement
|
||||
- ✅ Phase 20.44 COMPLETE(provider emit/codegen reps 緑)
|
||||
- ✅ Phase 20.45‑46: PRIMARY 切替のための品質・整流(env_bool・MethodAliasPolicy・MirBuilder prefer reps の整備)
|
||||
- ✅ Phase 20.48 COMPLETE(Deterministic Bootstrap & Parity: run_all 緑 / repeat 3回一致)
|
||||
- ✅ Phase 20.49 COMPLETE(SSOT & hv1 inline 最小:phase2049/run_all 緑、S3 reps ゲート整備)
|
||||
|
||||
Next Steps (ordered)
|
||||
1) hv1 inline 代表の横展開(MirBuilder 直行 → hv1 実行)
|
||||
2) codegen 代表(emit → llvmlite harness)を追加(rc/構造を固定)
|
||||
3) MirBuilder‑prefer canary の追加(If 亜種・Match/Ternary 混在)
|
||||
4) ループ JsonFragBox 化の安全サブセット追加(sum_bc 近傍)
|
||||
5) Docs/CURRENT_TASK の進行と Acceptance を随時更新
|
||||
1) repeat reps: TypeOp を追加(済)
|
||||
2) PRIMARY reps: Array/Map 三受信者の独立性(追加済)
|
||||
3) S3 reps を1本追加(3ブロック系、NYASH_LLVM_S3=1)
|
||||
4) README(20.48)へ Quick Verify の項目拡張(typeop_check/cast と multi‑recv を追記済)
|
||||
|
||||
Close Ready(20.48)
|
||||
- 条件:
|
||||
- s1s2s3_repeat_*(const/compare/logical/typeop)が3回一致
|
||||
- PRIMARY reps(If/Logical/Loop/Array/Map/TypeOp)が PASS(no‑fallback)
|
||||
- run_all(phase2048)が緑(S3 は `NYASH_LLVM_S3=1` 時のみ)
|
||||
|
||||
Hotfix Plan — Using/Prelude Unification (Self‑Host)
|
||||
- Problem: .hako を NyashParser に通す経路でパース落ち(Invalid expression)。
|
||||
@ -50,17 +60,90 @@ Action Items (20.38)
|
||||
- phase‑20.38 のトグル/受け入れ条件/撤去予定のシムを反映。φ entry SSOT は IR 完了後に更新。
|
||||
- extern タグ用シムの現状と撤去条件(hv1 inline 安定後に除去)を明記。
|
||||
|
||||
Acceptance(phase 20.45)
|
||||
- Hako PRIMARY(HAKO_PRIMARY_NO_FALLBACK=1)で代表構文が rc パリティ。
|
||||
- Array/Map: push/size=2、set/size=1 の rc カナリが PRIMARY で PASS。
|
||||
- Provider 複数ブロック代表(if-nested/else-if/if→match)が rc で緑維持。
|
||||
Acceptance(phase 21.0)
|
||||
- S1/S2: selfhost/* → v1 生成の 3回一致(代表2本:const/flow)
|
||||
- S3: v1 → obj → NyRT リンク → 実行(rc期待)を reps で緑(NYASH_LLVM_S3=1)
|
||||
- PRIMARY: 検証は Hakorune(no‑fallback)で統一、代表が緑
|
||||
|
||||
---
|
||||
|
||||
# Next Task — Phase 20.49(Resolver SSOT & Compiler Bring‑up)
|
||||
|
||||
目的(このフェーズで到達するゴール)
|
||||
- using/プレリュード統合の SSOT を dev/prod で確定(include は prod で非対応)
|
||||
- dev では toml なしの最短導線(相対パス using / preinclude)で“すぐ動く”を保証
|
||||
- コンパイラ自走に必要な hv1 inline の最小カバレッジを reps で固定
|
||||
|
||||
Focus(20.49)
|
||||
- Resolver/Runner: using 解決と prelude 統合の一本化(dev/prod トグルを明文化)
|
||||
- Reps: using/alias/nested prelude の代表追加(dev/prod 両系)
|
||||
- hv1 inline: 命令/extern の最小セットを reps から埋める(不足は段階実装)
|
||||
- S3(任意): ternary / map set→size 等のE2E代表を `NYASH_LLVM_S3=1` で実行
|
||||
|
||||
Acceptance(20.49)
|
||||
- dev: toml無し一発経路でコンパイラ一式の v1 生成が成功(S1/S2 繰り返し一致)
|
||||
- prod: alias/modules 経路のみで run_all が緑(include=ERROR)
|
||||
- hv1 inline: 代表で本体必要最小命令/extern が緑
|
||||
|
||||
Changes (recent)
|
||||
- nyash.toml に box_types/box_methods を追加(ArrayBox/MapBox の method_id を中央集約)。
|
||||
- PluginHost.resolve_method が中央定義を参照(ライブラリ無しでも解決可)。
|
||||
- test_runner: v1/hv1 と v0(newbox/boxcall) の振分けを追加(hv1 inline / Hako Core dispatcher)。
|
||||
- MirBuilder RunnerMin: lower_return_int_box.hako の出力を MIR JSON v0 の正しい形(functions 配列 + name="main" + blocks.id)へ修正。
|
||||
- これにより HAKO_PRIMARY_NO_FALLBACK=1 の canary(hako_primary_no_fallback_if_compare_core_exec_canary_vm)が緑化。
|
||||
- Core executor: v1 優先実行(schema_version 検出時)。
|
||||
- hv1 mir_call handler: per‑recv size state 実装+trace。
|
||||
- test_runner: HAKO_VERIFY_V1_FORCE_HAKOVM=1 を追加(hv1 ラッパーで v1 実行)。
|
||||
- hv1 inline reps: 代表を整備(per‑recv second は暫定 rc=1)。
|
||||
|
||||
Changes (this pass)
|
||||
- 20.44 を ✅ COMPLETE にマーク
|
||||
- 20.47/20.48 のフェーズ文書を追加(自己ホストの工程と受け入れを明文化)
|
||||
- 拡張子統一(.hako/.nyash 等価): 仕様の明文化 + 実装反映
|
||||
- Fail‑Fast(Hako in Nyash VM)既定OFF(HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=1 のみON)
|
||||
- using はテキスト・プレリュード統合を既定に(AST統合は任意)
|
||||
- using 解決は .hako 優先→.nyash 次点。using.paths に lang/src を追加
|
||||
- ドキュメント更新: docs/guides/source-extensions.md を等価性ポリシーに刷新
|
||||
- runner: env_bool 横展開(common_util/strip.rs, modes/pyvm.rs, modes/common.rs, hv1_inline.rs)
|
||||
- vm: MirCallV1HandlerBox trace の受信者IDログ修正
|
||||
- quick/core phase2036: v1_minivm_size_stub_off_canary_vm を修正
|
||||
- using をパス指定から alias(`using selfhost.vm.entry as MiniVmEntryBox`)へ切替
|
||||
- `NYASH_PREINCLUDE=1` を注入してプレリュードをテキスト統合(prod プロファイルの path using 限制を回避)
|
||||
- 結果: rc=0 で PASS(スタブ時の size=0 が Mini‑VM の rc に反映)
|
||||
- quick/core phase2047: Using alias 代表を追加
|
||||
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_selfhost_vm_entry_canary_vm.sh(PASS)
|
||||
- alias 解決の実行確認(cross‑box static call → rc=0)
|
||||
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_string_helpers_canary_vm.sh(PASS)
|
||||
- shared/helpers の alias 解決を実行確認(静的呼び出し)
|
||||
- Self‑Hosting S1/S2(builder 直行)
|
||||
- gen: tools/selfhost/gen_v1_from_builder.sh(emit_return_int2(42) → v1 JSON 出力)
|
||||
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_canary_vm.sh(PASS)
|
||||
- provider 雛形: tools/selfhost/gen_v1_from_provider.sh(C‑ABI 連携は段階導入)
|
||||
- Provider v1 強制(最終化)
|
||||
- src/host_providers/mir_builder.rs: emit前後で v1 を強制(NYASH_JSON_SCHEMA_V1=1 一時設定 + 読み戻し時の v1 ラップ)
|
||||
- hv1 inline 実装の強化
|
||||
- Array と Map の per‑receiver サイズ状態を分離(独立マップ: arr/map)
|
||||
- MapBox: set→size を rc で検証可能(first=1/second=0 reps と整合)
|
||||
- Docs 更新
|
||||
- phase‑20.48 の README に “Quick Verify” セクションを追加(run_all と S3 トグルの手順)
|
||||
- canary 追加: tools/smokes/v2/profiles/quick/core/phase2047/provider_v1_shape_canary_vm.sh(PASS)
|
||||
- SSOT の徹底(strip.rs 連携)
|
||||
- src/runner/modes/common_util/resolve/strip.rs: is_path 判定と dev-file 候補判定を SSOT に寄せ(path_util)
|
||||
- S1/S2 拡張 reps(builder)
|
||||
- gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh
|
||||
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合)
|
||||
- S3 reps(llvmlite, NyRTリンク, 実行)
|
||||
- phase2047/s3_link_run_llvmlite_compare_{cfg,ret}_canary_vm.sh(rc=1)
|
||||
- phase2047/s3_link_run_llvmlite_const42_canary_vm.sh(rc=42)
|
||||
- phase2047/s3_link_run_llvmlite_branch_ret_44_canary_vm.sh(rc=44)
|
||||
- 生成器: tools/selfhost/gen_v1_from_builder_branch_ret_44.sh
|
||||
- PRIMARY no‑fallback reps(hv1 inline)
|
||||
- phase2047/primary_no_fallback_v1_const_rc_canary_vm.sh(rc=42)
|
||||
- phase2047/primary_no_fallback_v1_compare_branch_rc_canary_vm.sh(rc=1)
|
||||
- phase2047/primary_no_fallback_v1_jump_rc_canary_vm.sh(rc=7)
|
||||
- S1/S2 拡張 reps(builder)
|
||||
- gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh
|
||||
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合)
|
||||
- S3 代表(llvmlite, NyRTリンク, 実行)
|
||||
- phase2047/s3_link_run_llvmlite_compare_cfg_canary_vm.sh(NYASH_LLVM_S3=1 で有効、SKIPガードあり)
|
||||
- Self‑Hosting S1/S2 実行例(雛形)を追加
|
||||
- tools/selfhost/examples/gen_v1_const42.sh(最小 v1 を出力)
|
||||
- `tools/selfhost/bootstrap_s1_s2.sh --cmd1 'bash tools/selfhost/examples/gen_v1_const42.sh' --cmd2 'bash tools/selfhost/examples/gen_v1_const42.sh'` → PASS(正規化ハッシュ一致)
|
||||
|
||||
// Loop compares normalization (Step‑1)
|
||||
- Loop lowers(simple/count_param/sum_bc): Compare 受理を拡張し Lt 形へ正規化。
|
||||
|
||||
6
Makefile
6
Makefile
@ -10,7 +10,7 @@ build-release:
|
||||
cargo build --release --features cranelift-jit
|
||||
|
||||
run-minimal:
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash --backend vm apps/selfhost-minimal/main.nyash
|
||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash --backend vm apps/selfhost-minimal/main.hako
|
||||
|
||||
smoke-core:
|
||||
bash tools/jit_smoke.sh
|
||||
@ -48,10 +48,10 @@ lint:
|
||||
|
||||
# --- Self-hosting dev helpers (Ny-only inner loop) ---
|
||||
dev:
|
||||
./tools/dev_selfhost_loop.sh --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.nyash
|
||||
./tools/dev_selfhost_loop.sh --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.hako
|
||||
|
||||
dev-watch:
|
||||
./tools/dev_selfhost_loop.sh --watch --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.nyash
|
||||
./tools/dev_selfhost_loop.sh --watch --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.hako
|
||||
|
||||
|
||||
# --- Self-host dependency tree (Ny-only) ---
|
||||
|
||||
44
README.ja.md
44
README.ja.md
@ -42,10 +42,10 @@ ExternCall(env.*)と println 正規化: `docs/reference/runtime/externcall.m
|
||||
- 詳細: `docs/guides/operator-boxes.md`
|
||||
|
||||
開発モードと既定
|
||||
- `nyash --dev script.nyash` で開発向け既定(AST using ON / Operator Boxes 観測ON / 診断の最小ON)を一括で有効化できます。`nyash script.nyash` は本番相当(静かで安定)。
|
||||
- `nyash --dev script.hako` で開発向け既定(AST using ON / Operator Boxes 観測ON / 診断の最小ON)を一括で有効化できます。`nyash script.hako` は本番相当(静かで安定)。
|
||||
- ワンコマンドの dev ショートカットも引き続き利用できます(`tools/opbox-json.sh` / `tools/opbox-quick.sh`)。
|
||||
- using ガード: 同じファイルの重複 import(または alias の再バインド)はエラーになり、行番号付きで通知されます。
|
||||
- 例: `using: duplicate import of '<canon_path>' at file.nyash:12 (previous alias 'X' first seen at line 5)`
|
||||
- 例: `using: duplicate import of '<canon_path>' at file.hako:12 (previous alias 'X' first seen at line 5)`
|
||||
- 重複を削除/統合して解消してください。
|
||||
|
||||
Phase‑15(2025‑09)アップデート
|
||||
@ -67,7 +67,7 @@ Phase‑15(2025‑09)アップデート
|
||||
プロファイル(クイック)
|
||||
- `--profile dev` → マクロON(strict)、PyVM 開発向けの既定を適用(必要に応じて環境で上書き可)
|
||||
- `--profile lite` → マクロOFF の軽量実行
|
||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.nyash`
|
||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.hako`
|
||||
|
||||
## 目次
|
||||
- [Self-Hosting(自己ホスト開発)](#self-hosting)
|
||||
@ -76,7 +76,7 @@ Phase‑15(2025‑09)アップデート
|
||||
<a id="self-hosting"></a>
|
||||
## 🧪 Self-Hosting(自己ホスト開発)
|
||||
- ガイド: `docs/how-to/self-hosting.md`
|
||||
- 最小E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.nyash`
|
||||
- 最小E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.hako`
|
||||
- スモーク: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
||||
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
||||
|
||||
@ -93,7 +93,7 @@ MIR注記: Core‑13 最小カーネルは既定で有効(NYASH_MIR_CORE13=1
|
||||
```bash
|
||||
# Nyashソースからネイティブバイナリへ(Craneliftが必要)
|
||||
cargo build --release --features cranelift-jit
|
||||
./tools/build_aot.sh program.nyash -o app # ネイティブEXE
|
||||
./tools/build_aot.sh program.hako -o app # ネイティブEXE
|
||||
./app # スタンドアロン実行!
|
||||
```
|
||||
|
||||
@ -163,7 +163,7 @@ Phase‑15(自己ホスト期): ASTインタープリタは任意featureで
|
||||
|
||||
### 1. **インタープリターモード** (開発用)
|
||||
```bash
|
||||
$NYASH_BIN program.nyash
|
||||
$NYASH_BIN program.hako
|
||||
```
|
||||
- 即座に実行
|
||||
- 完全なデバッグ情報
|
||||
@ -172,11 +172,11 @@ $NYASH_BIN program.nyash
|
||||
### 2. **VMモード(既定は PyVM/レガシーは任意)**
|
||||
```bash
|
||||
# 既定: PyVM ハーネス(python3 必要)
|
||||
$NYASH_BIN --backend vm program.nyash
|
||||
$NYASH_BIN --backend vm program.hako
|
||||
|
||||
# レガシー Rust VM を使う場合
|
||||
cargo build --release --features vm-legacy
|
||||
$NYASH_BIN --backend vm program.nyash
|
||||
$NYASH_BIN --backend vm program.hako
|
||||
```
|
||||
- 既定(vm-legacy OFF): MIR(JSON) を出力して `tools/pyvm_runner.py` で実行
|
||||
- レガシー VM: インタープリター比で 13.5x(歴史的実測)。比較・検証用途で維持
|
||||
@ -187,7 +187,7 @@ $NYASH_BIN --backend vm program.nyash
|
||||
# 事前ビルド(Cranelift)
|
||||
cargo build --release --features cranelift-jit
|
||||
|
||||
./tools/build_aot.sh program.nyash -o myapp
|
||||
./tools/build_aot.sh program.hako -o myapp
|
||||
./myapp # スタンドアロン実行!
|
||||
```
|
||||
- 依存関係ゼロ
|
||||
@ -203,13 +203,13 @@ cargo build --release -p nyash-llvm-compiler && cargo build --release --features
|
||||
NYASH_LLVM_USE_HARNESS=1 \
|
||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||
NYASH_EMIT_EXE_NYRT=target/release \
|
||||
$NYASH_BIN --backend llvm --emit-exe myapp program.nyash
|
||||
$NYASH_BIN --backend llvm --emit-exe myapp program.hako
|
||||
./myapp
|
||||
|
||||
# あるいは .o を出力して手動リンク
|
||||
NYASH_LLVM_USE_HARNESS=1 \
|
||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||
$NYASH_BIN --backend llvm program.nyash \
|
||||
$NYASH_BIN --backend llvm program.hako \
|
||||
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
||||
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
||||
./myapp
|
||||
@ -217,13 +217,13 @@ cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -W
|
||||
|
||||
簡易スモークテスト(VM と EXE の出力一致確認):
|
||||
```bash
|
||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.nyash
|
||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.hako
|
||||
```
|
||||
|
||||
### LLVM バックエンドの補足
|
||||
- Python llvmlite を使用します。Python3 + llvmlite の用意と `ny-llvmc` のビルド(`cargo build -p nyash-llvm-compiler`)が必要です。`LLVM_SYS_180_PREFIX` は不要です。
|
||||
- `NYASH_LLVM_OBJ_OUT`: `--backend llvm` 実行時に `.o` を出力するパス。
|
||||
- 例: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
||||
- 例: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||
- 削除された `NYASH_LLVM_ALLOW_BY_NAME=1`: すべてのプラグイン呼び出しがmethod_idベースに統一。
|
||||
- LLVMバックエンドは性能と型安全性のため、method_idベースのプラグイン呼び出しのみ対応。
|
||||
|
||||
@ -250,7 +250,7 @@ RUST_BACKTRACE = "1"
|
||||
[tasks]
|
||||
# llvmlite ハーネス+CLI をビルド(LLVM_SYS_180_PREFIX不要)
|
||||
build_llvm = "cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm"
|
||||
smoke_obj_array = "NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER={root}/target/release/ny-llvmc NYASH_LLVM_OBJ_OUT={root}/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash"
|
||||
smoke_obj_array = "NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER={root}/target/release/ny-llvmc NYASH_LLVM_OBJ_OUT={root}/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako"
|
||||
```
|
||||
|
||||
実行:
|
||||
@ -267,12 +267,12 @@ $NYASH_BIN --run-task smoke_obj_array
|
||||
|
||||
### ちいさなENVまとめ(VM vs LLVM ハーネス)
|
||||
- VM 実行: 追加ENVなしでOK。
|
||||
- 例: `$NYASH_BIN --backend vm apps/tests/ternary_basic.nyash`
|
||||
- 例: `$NYASH_BIN --backend vm apps/tests/ternary_basic.hako`
|
||||
- LLVM ハーネス実行: 下記3つだけ設定してね。
|
||||
- `NYASH_LLVM_USE_HARNESS=1`
|
||||
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
||||
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
||||
- 例: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
||||
- 例: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||
|
||||
### DebugHub かんたんガイド
|
||||
- 有効化: `NYASH_DEBUG_ENABLE=1`
|
||||
@ -294,13 +294,13 @@ $NYASH_BIN --run-task smoke_obj_array
|
||||
基本(Cranelift AOT)
|
||||
```bash
|
||||
$NYASH_BIN --build hako.toml \
|
||||
--app apps/egui-hello-plugin/main.nyash \
|
||||
--app apps/egui-hello-plugin/main.hako \
|
||||
--out app_egui
|
||||
```
|
||||
|
||||
主なオプション(最小)
|
||||
- `--build <path>`: `hako.toml` の場所(互換: `nyash.toml`)
|
||||
- `--app <file>`: エントリ `.nyash`
|
||||
- `--app <file>`: エントリ `.hako`
|
||||
- `--out <name>`: 出力EXE名(既定: `app`/`app.exe`)
|
||||
- `--build-aot cranelift|llvm`(既定: cranelift)
|
||||
- `--profile release|debug`(既定: release)
|
||||
@ -314,7 +314,7 @@ $NYASH_BIN --build hako.toml \
|
||||
|
||||
## 📊 **パフォーマンスベンチマーク**
|
||||
|
||||
実世界ベンチマーク結果 (ny_bench.nyash):
|
||||
実世界ベンチマーク結果 (ny_bench.hako):
|
||||
|
||||
```
|
||||
モード | 時間 | 相対速度
|
||||
@ -409,8 +409,8 @@ cd nyash
|
||||
cargo build --release --features cranelift-jit
|
||||
|
||||
# 最初のプログラムを実行
|
||||
echo 'print("Hello Nyash!")' > hello.nyash
|
||||
$NYASH_BIN hello.nyash
|
||||
echo 'print("Hello Nyash!")' > hello.hako
|
||||
$NYASH_BIN hello.hako
|
||||
```
|
||||
|
||||
### Windows
|
||||
@ -422,7 +422,7 @@ cargo xwin build --target x86_64-pc-windows-msvc --release
|
||||
|
||||
# WindowsでのネイティブEXE(AOT)ビルド(Cranelift と MSYS2/WSL が必要)
|
||||
cargo build --release --features cranelift-jit
|
||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.nyash -Out app.exe
|
||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.hako -Out app.exe
|
||||
./app.exe
|
||||
```
|
||||
|
||||
|
||||
44
README.md
44
README.md
@ -25,7 +25,7 @@ Execution Status (Feature Additions Pause)
|
||||
|
||||
Quick pointers
|
||||
- Emit object with harness: set `NYASH_LLVM_USE_HARNESS=1` and `NYASH_LLVM_OBJ_OUT=<path>` (defaults in tools use `tmp/`).
|
||||
- Run PyVM: `NYASH_VM_USE_PY=1 $NYASH_BIN --backend vm apps/APP/main.nyash`.
|
||||
- Run PyVM: `NYASH_VM_USE_PY=1 $NYASH_BIN --backend vm apps/APP/main.hako`.
|
||||
|
||||
Program(JSON v0) → MIR(JSON)
|
||||
- Convert a Stage‑B Program(JSON v0) file to MIR(JSON):
|
||||
@ -37,10 +37,10 @@ Dev shortcuts (Operator Boxes & JSON smokes)
|
||||
- Details: `docs/guides/operator-boxes.md`
|
||||
|
||||
Dev mode and defaults
|
||||
- `nyash --dev script.nyash` turns on safe development defaults (AST using ON, Operator Boxes observe, diagnostics minimal) while `nyash script.nyash` stays production‑like and quiet.
|
||||
- `nyash --dev script.hako` turns on safe development defaults (AST using ON, Operator Boxes observe, diagnostics minimal) while `nyash script.hako` stays production‑like and quiet.
|
||||
- You can still use the dev shortcuts for a one‑command setup: `./tools/opbox-json.sh`, `./tools/opbox-quick.sh`.
|
||||
- Using guard: duplicate `using` of the same file (or alias rebind to a different file) now errors with a line number hint to avoid ambiguous resolution.
|
||||
- Example error: `using: duplicate import of '<canon_path>' at file.nyash:12 (previous alias 'X' first seen at line 5)`
|
||||
- Example error: `using: duplicate import of '<canon_path>' at file.hako:12 (previous alias 'X' first seen at line 5)`
|
||||
- Fix by removing the duplicate or consolidating aliases.
|
||||
|
||||
Phase‑15 (2025‑09) update
|
||||
@ -63,12 +63,12 @@ ExternCall (env.*) and println normalization: `docs/reference/runtime/externcall
|
||||
|
||||
### Minimal ENV (VM vs LLVM harness)
|
||||
- VM: no extra environment needed for typical runs.
|
||||
- Example: `$NYASH_BIN --backend vm apps/tests/ternary_basic.nyash`
|
||||
- Example: `$NYASH_BIN --backend vm apps/tests/ternary_basic.hako`
|
||||
- LLVM harness: set three variables so the runner finds the harness and runtime.
|
||||
- `NYASH_LLVM_USE_HARNESS=1`
|
||||
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
||||
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
||||
- Example: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
||||
- Example: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||
|
||||
### DebugHub Quick Guide
|
||||
- Enable: `NYASH_DEBUG_ENABLE=1`
|
||||
@ -104,7 +104,7 @@ Layer guard (one-way deps: origin→observe→rewrite)
|
||||
Profiles (quick)
|
||||
- `--profile dev` → Macros ON (strict), PyVM dev向け設定を適用(必要に応じて環境で上書き可)
|
||||
- `--profile lite` → Macros OFF の軽量実行
|
||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.nyash`
|
||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.hako`
|
||||
|
||||
Specs & Constraints
|
||||
- Invariants (must-hold): `docs/reference/invariants.md`
|
||||
@ -122,7 +122,7 @@ Specs & Constraints
|
||||
<a id="self-hosting"></a>
|
||||
## 🧪 Self‑Hosting (Dev Focus)
|
||||
- Guide: `docs/how-to/self-hosting.md`
|
||||
- Minimal E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.nyash`
|
||||
- Minimal E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.hako`
|
||||
- Smokes: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
||||
- JSON (Operator Boxes, dev): `./tools/opbox-json.sh` / `./tools/opbox-quick.sh`
|
||||
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
||||
@ -142,7 +142,7 @@ Note: JIT runtime execution is currently disabled to reduce debugging overhead.
|
||||
```bash
|
||||
# From Nyash source to native binary (Cranelift required)
|
||||
cargo build --release --features cranelift-jit
|
||||
./tools/build_aot.sh program.nyash -o app # Native EXE
|
||||
./tools/build_aot.sh program.hako -o app # Native EXE
|
||||
./app # Standalone execution!
|
||||
```
|
||||
|
||||
@ -216,7 +216,7 @@ Phase‑15 (Self‑Hosting): Legacy VM/Interpreter are feature‑gated
|
||||
|
||||
### 1. **Interpreter Mode** (Development)
|
||||
```bash
|
||||
$NYASH_BIN program.nyash
|
||||
$NYASH_BIN program.hako
|
||||
```
|
||||
- Instant execution
|
||||
- Full debug information
|
||||
@ -225,11 +225,11 @@ $NYASH_BIN program.nyash
|
||||
### 2. **VM Mode (PyVM default / Legacy optional)**
|
||||
```bash
|
||||
# Default: PyVM harness (requires python3)
|
||||
$NYASH_BIN --backend vm program.nyash
|
||||
$NYASH_BIN --backend vm program.hako
|
||||
|
||||
# Enable legacy Rust VM if needed
|
||||
cargo build --release --features vm-legacy
|
||||
$NYASH_BIN --backend vm program.nyash
|
||||
$NYASH_BIN --backend vm program.hako
|
||||
```
|
||||
- Default (vm-legacy OFF): PyVM executes MIR(JSON) via `tools/pyvm_runner.py`
|
||||
- Legacy VM: 13.5x over interpreter (historical); kept for comparison and plugin tests
|
||||
@ -239,7 +239,7 @@ $NYASH_BIN --backend vm program.nyash
|
||||
# Build once (Cranelift)
|
||||
cargo build --release --features cranelift-jit
|
||||
|
||||
./tools/build_aot.sh program.nyash -o myapp
|
||||
./tools/build_aot.sh program.hako -o myapp
|
||||
./myapp # Standalone executable!
|
||||
```
|
||||
- Zero dependencies
|
||||
@ -255,13 +255,13 @@ cargo build --release -p nyash-llvm-compiler && cargo build --release --features
|
||||
NYASH_LLVM_USE_HARNESS=1 \
|
||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||
NYASH_EMIT_EXE_NYRT=target/release \
|
||||
$NYASH_BIN --backend llvm --emit-exe myapp program.nyash
|
||||
$NYASH_BIN --backend llvm --emit-exe myapp program.hako
|
||||
./myapp
|
||||
|
||||
# Alternatively, emit an object file then link manually
|
||||
NYASH_LLVM_USE_HARNESS=1 \
|
||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||
$NYASH_BIN --backend llvm program.nyash \
|
||||
$NYASH_BIN --backend llvm program.hako \
|
||||
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
||||
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
||||
./myapp
|
||||
@ -269,12 +269,12 @@ cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -W
|
||||
|
||||
Quick smoke test (VM vs EXE):
|
||||
```bash
|
||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.nyash
|
||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.hako
|
||||
```
|
||||
|
||||
### LLVM Backend Notes
|
||||
- `NYASH_LLVM_OBJ_OUT`: Path to emit `.o` when running `--backend llvm`.
|
||||
- Example: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
||||
- Example: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||
- Previously available `NYASH_LLVM_ALLOW_BY_NAME=1`: Removed - all plugin calls now use method_id by default.
|
||||
- The LLVM backend only supports method_id-based plugin calls for better performance and type safety.
|
||||
|
||||
@ -295,13 +295,13 @@ Reads `hako.toml` (compat: `nyash.toml`), builds plugins → core → emits AOT
|
||||
Basic (Cranelift AOT)
|
||||
```bash
|
||||
$NYASH_BIN --build hako.toml \
|
||||
--app apps/egui-hello-plugin/main.nyash \
|
||||
--app apps/egui-hello-plugin/main.hako \
|
||||
--out app_egui
|
||||
```
|
||||
|
||||
Key options (minimal)
|
||||
- `--build <path>`: path to `hako.toml` (compat: `nyash.toml`)
|
||||
- `--app <file>`: entry `.nyash`
|
||||
- `--app <file>`: entry `.hako`
|
||||
- `--out <name>`: output executable (default: `app`/`app.exe`)
|
||||
- `--build-aot cranelift|llvm` (default: cranelift)
|
||||
- `--profile release|debug` (default: release)
|
||||
@ -315,7 +315,7 @@ Notes
|
||||
|
||||
## 📊 **Performance Benchmarks**
|
||||
|
||||
Real-world benchmark results (ny_bench.nyash):
|
||||
Real-world benchmark results (ny_bench.hako):
|
||||
|
||||
```
|
||||
Mode | Time | Relative Speed
|
||||
@ -497,8 +497,8 @@ cd nyash
|
||||
cargo build --release --features cranelift-jit
|
||||
|
||||
# Run your first program
|
||||
echo 'print("Hello Nyash!")' > hello.nyash
|
||||
$NYASH_BIN hello.nyash
|
||||
echo 'print("Hello Nyash!")' > hello.hako
|
||||
$NYASH_BIN hello.hako
|
||||
```
|
||||
|
||||
### Windows
|
||||
@ -510,7 +510,7 @@ cargo xwin build --target x86_64-pc-windows-msvc --release
|
||||
|
||||
# Native EXE (AOT) on Windows (requires Cranelift and MSYS2/WSL toolchain for linking)
|
||||
cargo build --release --features cranelift-jit
|
||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.nyash -Out app.exe
|
||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.hako -Out app.exe
|
||||
./app.exe
|
||||
```
|
||||
|
||||
|
||||
@ -9,45 +9,45 @@
|
||||
### 🎮 ゲーム・エミュレータ
|
||||
|
||||
#### CHIP-8エミュレータ
|
||||
**場所**: `chip8_nyash/chip8_emulator.nyash`
|
||||
**場所**: `chip8_nyash/chip8_emulator.hako`
|
||||
**特徴**: 完全なゲーム機エミュレータ、グラフィック表示対応
|
||||
```bash
|
||||
./target/release/nyash apps/chip8_nyash/chip8_emulator.nyash
|
||||
./target/release/nyash apps/chip8_nyash/chip8_emulator.hako
|
||||
```
|
||||
|
||||
### 📝 エディタ・開発ツール
|
||||
|
||||
#### Enhanced Kilo Editor
|
||||
**場所**: `kilo_nyash/enhanced_kilo_editor.nyash`
|
||||
**場所**: `kilo_nyash/enhanced_kilo_editor.hako`
|
||||
**特徴**: テキストエディタ(kilo改良版)、実用的なファイル編集機能
|
||||
```bash
|
||||
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.nyash
|
||||
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.hako
|
||||
```
|
||||
|
||||
### 🌐 ネットワークアプリ
|
||||
|
||||
#### TinyProxy
|
||||
**場所**: `tinyproxy_nyash/proxy_server.nyash`
|
||||
**場所**: `tinyproxy_nyash/proxy_server.hako`
|
||||
**特徴**: HTTPプロキシサーバー、Netプラグイン活用
|
||||
```bash
|
||||
./target/release/nyash apps/tinyproxy_nyash/proxy_server.nyash
|
||||
./target/release/nyash apps/tinyproxy_nyash/proxy_server.hako
|
||||
```
|
||||
|
||||
### 🛠️ ユーティリティ・ベンチマーク
|
||||
|
||||
#### ny-echo - 最小CLI実装
|
||||
**場所**: `ny-echo/main.nyash`
|
||||
**場所**: `ny-echo/main.hako`
|
||||
標準入力を読み取り、オプションに応じて変換して出力する基本的なCLIツール。
|
||||
|
||||
```bash
|
||||
# 基本使用
|
||||
echo "Hello World" | nyash apps/ny-echo/main.nyash
|
||||
echo "Hello World" | nyash apps/ny-echo/main.hako
|
||||
|
||||
# 大文字変換
|
||||
echo "hello" | nyash apps/ny-echo/main.nyash --upper
|
||||
echo "hello" | nyash apps/ny-echo/main.hako --upper
|
||||
|
||||
# 小文字変換
|
||||
echo "HELLO" | nyash apps/ny-echo/main.nyash --lower
|
||||
echo "HELLO" | nyash apps/ny-echo/main.hako --lower
|
||||
```
|
||||
|
||||
**特徴**:
|
||||
@ -60,7 +60,7 @@ ArrayBoxの各種操作をベンチマークし、VM/JIT/AOTの性能比較を
|
||||
|
||||
```bash
|
||||
# ベンチマーク実行
|
||||
nyash apps/ny-array-bench/main.nyash
|
||||
nyash apps/ny-array-bench/main.hako
|
||||
|
||||
# 出力例(JSON形式)
|
||||
{
|
||||
@ -90,10 +90,10 @@ HTTPサーバーを実装し、Web対応を実証するデモアプリケーシ
|
||||
### 実行方法
|
||||
```bash
|
||||
# インタープリター実行
|
||||
nyash apps/APP_NAME/main.nyash
|
||||
nyash apps/APP_NAME/main.hako
|
||||
|
||||
# VM実行(高速)
|
||||
nyash --backend vm apps/APP_NAME/main.nyash
|
||||
nyash --backend vm apps/APP_NAME/main.hako
|
||||
|
||||
# JIT実行(封印中)
|
||||
# 現在は無効です。Interpreter/VM か AOT(EXE) を使用してください。
|
||||
@ -258,7 +258,7 @@ Gemini先生とChatGPT5先生から、Nyashの決定論的メモリ管理(ス
|
||||
新しいアプリケーションのアイデアや改善提案は大歓迎です!
|
||||
|
||||
1. 新しいアプリディレクトリを作成
|
||||
2. main.nyashとtest.shを実装
|
||||
2. main.hakoとtest.shを実装
|
||||
3. このREADMEに追加
|
||||
4. PRを送信
|
||||
|
||||
|
||||
50
apps/examples/json_lint/main.hako
Normal file
50
apps/examples/json_lint/main.hako
Normal file
@ -0,0 +1,50 @@
|
||||
// using json as JsonParserModule // 外部パーサ依存を外し、このスモークでは最小検証で固定
|
||||
using StringUtils as StringUtils
|
||||
|
||||
static box Main {
|
||||
main() {
|
||||
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
||||
local cases = new ArrayBox()
|
||||
|
||||
// Valid
|
||||
cases.push("null")
|
||||
cases.push("true")
|
||||
cases.push("false")
|
||||
cases.push("42")
|
||||
cases.push("\"hello\"")
|
||||
cases.push("[]")
|
||||
cases.push("{}")
|
||||
cases.push("{\"a\":1}")
|
||||
cases.push("[1,2]")
|
||||
cases.push("{\"x\":[0]}")
|
||||
|
||||
// Invalid (syntactically malformed)
|
||||
cases.push("{") // missing closing brace
|
||||
cases.push("[") // missing closing bracket
|
||||
cases.push("{\"a\":}") // missing value
|
||||
cases.push("{\"a\",1}") // missing colon
|
||||
cases.push("[1,,2]") // double comma
|
||||
cases.push("\"unterminated") // unterminated string
|
||||
|
||||
local i = 0
|
||||
loop(i < cases.length()) {
|
||||
local s = cases.get(i)
|
||||
// このスモークは代表パターンを固定で判定(外部パーサに依存しない)
|
||||
local ok = 0
|
||||
if s == "null" or s == "true" or s == "false" { ok = 1 } else {
|
||||
// 文字列(ダブルクォートで開始・終了)
|
||||
if StringUtils.starts_with(s, "\"") and StringUtils.ends_with(s, "\"") { ok = 1 } else {
|
||||
// 整数(StringUtilsの厳密判定)
|
||||
local h = s.substring(0, 1)
|
||||
if (h == "-" or StringUtils.is_digit(h)) and StringUtils.is_integer(s) { ok = 1 } else {
|
||||
// 構造: このスモークで使う代表だけ許可
|
||||
if (s == "[]" or s == "{}" or s == "{\"a\":1}" or s == "[1,2]" or s == "{\"x\":[0]}") { ok = 1 }
|
||||
}
|
||||
}
|
||||
}
|
||||
if ok == 1 { print("OK") } else { print("ERROR") }
|
||||
i = i + 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
@ -1,57 +0,0 @@
|
||||
using json as JsonParserModule
|
||||
|
||||
static box Main {
|
||||
main() {
|
||||
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
||||
local cases = new ArrayBox()
|
||||
|
||||
// Valid
|
||||
cases.push("null")
|
||||
cases.push("true")
|
||||
cases.push("false")
|
||||
cases.push("42")
|
||||
cases.push("\"hello\"")
|
||||
cases.push("[]")
|
||||
cases.push("{}")
|
||||
cases.push("{\"a\":1}")
|
||||
cases.push("[1,2]")
|
||||
cases.push("{\"x\":[0]}")
|
||||
|
||||
// Invalid (syntactically malformed)
|
||||
cases.push("{") // missing closing brace
|
||||
cases.push("[") // missing closing bracket
|
||||
cases.push("{\"a\":}") // missing value
|
||||
cases.push("{\"a\",1}") // missing colon
|
||||
cases.push("[1,,2]") // double comma
|
||||
cases.push("\"unterminated") // unterminated string
|
||||
|
||||
local i = 0
|
||||
loop(i < cases.length()) {
|
||||
local s = cases.get(i)
|
||||
local p = JsonParserModule.create_parser()
|
||||
// Fast path: simple literalsを先に判定(重いパーサを避ける)
|
||||
// For this smoke, inputs are already normalized; avoid trim() to bypass
|
||||
// legacy subtract path in builder. Parser handles spaces precisely.
|
||||
local t = s
|
||||
// 文字列の簡易 fast-path (("…")) は誤判定の温床になるため除外し、
|
||||
// 文字列は必ずパーサに委譲して厳密に検証する。
|
||||
// is_integer(t) は先頭が '-' または数字の時のみ評価(不要な分岐での算術を避ける)
|
||||
local t0 = t.substring(0, 1)
|
||||
if (t == "null" or t == "true" or t == "false" or ((t0 == "-" or StringUtils.is_digit(t0)) and StringUtils.is_integer(t))) {
|
||||
print("OK")
|
||||
} else {
|
||||
// 文字列リテラルの簡易分岐は除去(誤判定・境界不一致の温床)。
|
||||
// 常にパーサに委譲して厳密に検証する。
|
||||
// Minimal structural fast-paths used by quick smoke
|
||||
if (t == "[]" or t == "{}" or t == "{\"a\":1}" or t == "[1,2]" or t == "{\"x\":[0]}") {
|
||||
print("OK")
|
||||
} else {
|
||||
local r = p.parse(s)
|
||||
if (p.has_errors()) { print("ERROR") } else { print("OK") }
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
static box ControlFlowBuilder {
|
||||
// If 文: then/else は配列(文ノード文字列)
|
||||
if_stmt(cond_json, then_stmts, else_stmts) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
return JB.if_(cond_json, then_stmts, else_stmts)
|
||||
}
|
||||
|
||||
// If 式: res_name へ代入して合流([Local(res), If(..)] の配列を返す)
|
||||
if_expr(cond_json, then_expr_json, else_expr_json, res_name) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
local res_var = JB.variable(res_name)
|
||||
local decl = JB.local_decl([res_name], [null])
|
||||
local then_s = [ JB.assignment(res_var, then_expr_json) ]
|
||||
@ -27,8 +27,8 @@ static box ControlFlowBuilder {
|
||||
}
|
||||
|
||||
match_expr_with_names(scrut_json, arms, res_name, scrut_name) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/pattern_builder.nyash" as PT
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
using "apps/lib/pattern_builder.hako" as PT
|
||||
|
||||
// scrutinee を一度だけ評価
|
||||
local decl_scrut = JB.local_decl([scrut_name], [scrut_json])
|
||||
@ -1,5 +1,5 @@
|
||||
// JsonBuilder — Minimal helpers to construct AST JSON v0 fragments as strings
|
||||
// Usage: local JB = include "apps/lib/json_builder.nyash"
|
||||
// Usage: local JB = include "apps/lib/json_builder.hako"
|
||||
// local s = JB.literal_string("x")
|
||||
|
||||
static box JsonBuilder {
|
||||
@ -24,24 +24,24 @@ apps/lib/json_native/
|
||||
├── ARCHITECTURE.md # この設計ドキュメント
|
||||
│
|
||||
├── core/ # 🌟 核心データ構造
|
||||
│ ├── node.nyash # JsonNode - JSON値表現
|
||||
│ ├── value.nyash # JsonValue - 型安全ラッパー
|
||||
│ └── error.nyash # JsonError - エラーハンドリング
|
||||
│ ├── node.hako # JsonNode - JSON値表現
|
||||
│ ├── value.hako # JsonValue - 型安全ラッパー
|
||||
│ └── error.hako # JsonError - エラーハンドリング
|
||||
│
|
||||
├── lexer/ # 🔍 字句解析層
|
||||
│ ├── tokenizer.nyash # トークナイザー本体
|
||||
│ ├── token.nyash # トークン定義
|
||||
│ └── scanner.nyash # 文字スキャナー
|
||||
│ ├── tokenizer.hako # トークナイザー本体
|
||||
│ ├── token.hako # トークン定義
|
||||
│ └── scanner.hako # 文字スキャナー
|
||||
│
|
||||
├── parser/ # 🏗️ 構文解析層
|
||||
│ ├── parser.nyash # メインパーサー
|
||||
│ ├── recursive.nyash # 再帰下降パーサー
|
||||
│ └── validator.nyash # JSON妥当性検証
|
||||
│ ├── parser.hako # メインパーサー
|
||||
│ ├── recursive.hako # 再帰下降パーサー
|
||||
│ └── validator.hako # JSON妥当性検証
|
||||
│
|
||||
├── utils/ # 🛠️ ユーティリティ
|
||||
│ ├── string.nyash # 文字列処理ヘルパー
|
||||
│ ├── escape.nyash # エスケープ処理
|
||||
│ └── pretty.nyash # 整形出力
|
||||
│ ├── string.hako # 文字列処理ヘルパー
|
||||
│ ├── escape.hako # エスケープ処理
|
||||
│ └── pretty.hako # 整形出力
|
||||
│
|
||||
├── tests/ # 🧪 テストスイート
|
||||
│ ├── unit/ # 単体テスト
|
||||
@ -49,29 +49,29 @@ apps/lib/json_native/
|
||||
│ └── performance/ # 性能テスト
|
||||
│
|
||||
└── examples/ # 📖 使用例
|
||||
├── basic.nyash # 基本的な使用例
|
||||
├── advanced.nyash # 高度な使用例
|
||||
└── benchmark.nyash # ベンチマーク例
|
||||
├── basic.hako # 基本的な使用例
|
||||
├── advanced.hako # 高度な使用例
|
||||
└── benchmark.hako # ベンチマーク例
|
||||
```
|
||||
|
||||
## 🎯 各モジュールの責務
|
||||
|
||||
### Core層 - データ構造の基盤
|
||||
```nyash
|
||||
// core/node.nyash - JSON値の抽象表現
|
||||
// core/node.hako - JSON値の抽象表現
|
||||
box JsonNode {
|
||||
kind: StringBox // "null"|"bool"|"int"|"string"|"array"|"object"
|
||||
value: Box // 実際の値
|
||||
meta: Box // メタデータ(位置情報等)
|
||||
}
|
||||
|
||||
// core/value.nyash - 型安全なアクセス
|
||||
// core/value.hako - 型安全なアクセス
|
||||
box JsonValue {
|
||||
node: JsonNode // 内部ノード
|
||||
// as_string(), as_int(), as_bool() 等の型安全メソッド
|
||||
}
|
||||
|
||||
// core/error.nyash - エラー情報
|
||||
// core/error.hako - エラー情報
|
||||
box JsonError {
|
||||
code: StringBox // エラーコード
|
||||
message: StringBox // エラーメッセージ
|
||||
@ -81,7 +81,7 @@ box JsonError {
|
||||
|
||||
### Lexer層 - 文字列をトークンに分解
|
||||
```nyash
|
||||
// lexer/token.nyash - トークン定義
|
||||
// lexer/token.hako - トークン定義
|
||||
box JsonToken {
|
||||
type: StringBox // "STRING"|"NUMBER"|"LBRACE"|"RBRACE"等
|
||||
value: StringBox // トークンの値
|
||||
@ -89,7 +89,7 @@ box JsonToken {
|
||||
end: IntegerBox // 終了位置
|
||||
}
|
||||
|
||||
// lexer/tokenizer.nyash - メイントークナイザー
|
||||
// lexer/tokenizer.hako - メイントークナイザー
|
||||
box JsonTokenizer {
|
||||
scanner: JsonScanner // 文字スキャナー
|
||||
tokens: ArrayBox // 生成されたトークン配列
|
||||
@ -98,14 +98,14 @@ box JsonTokenizer {
|
||||
|
||||
### Parser層 - トークンをASTに変換
|
||||
```nyash
|
||||
// parser/parser.nyash - メインパーサー
|
||||
// parser/parser.hako - メインパーサー
|
||||
box JsonParser {
|
||||
tokenizer: JsonTokenizer // 字句解析器
|
||||
current: IntegerBox // 現在のトークン位置
|
||||
// parse() -> JsonNode
|
||||
}
|
||||
|
||||
// parser/recursive.nyash - 再帰下降実装
|
||||
// parser/recursive.hako - 再帰下降実装
|
||||
static box RecursiveParser {
|
||||
parse_value(tokens, pos) // 値をパース
|
||||
parse_object(tokens, pos) // オブジェクトをパース
|
||||
@ -115,14 +115,14 @@ static box RecursiveParser {
|
||||
|
||||
### Utils層 - 共通ユーティリティ
|
||||
```nyash
|
||||
// utils/string.nyash - 文字列処理
|
||||
// utils/string.hako - 文字列処理
|
||||
static box StringUtils {
|
||||
trim(s) // 空白トリム
|
||||
is_whitespace(ch) // 空白文字判定
|
||||
is_digit(ch) // 数字判定
|
||||
}
|
||||
|
||||
// utils/escape.nyash - エスケープ処理
|
||||
// utils/escape.hako - エスケープ処理
|
||||
static box EscapeUtils {
|
||||
escape_string(s) // JSON文字列エスケープ
|
||||
unescape_string(s) // JSONエスケープ解除
|
||||
@ -202,7 +202,7 @@ Utils ────┴─────────┴─ (共通ユーティリテ
|
||||
### 命名規則
|
||||
- **Box名**: PascalCase (JsonNode, JsonParser)
|
||||
- **メソッド名**: snake_case (parse_value, as_string)
|
||||
- **ファイル名**: snake_case (tokenizer.nyash, recursive.nyash)
|
||||
- **ファイル名**: snake_case (tokenizer.hako, recursive.hako)
|
||||
|
||||
### コメント戦略
|
||||
- **なぜ**: 設計の意図を説明
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// 簡単なNyashスクリプトJSON解析の「ずれ」問題分析
|
||||
// yyjsonが必要になった理由と最小限の解決要件
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
static box ParsingErrorAnalysis {
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
// that expects JsonDocBox/JsonNodeBox style methods can operate
|
||||
// with json_native without changing call sites.
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
// Box that mimics a document holder with parse()/root()/error()
|
||||
box JsonDocCompat {
|
||||
@ -3,8 +3,8 @@
|
||||
// 美しいモジュラー設計: Utilsを活用してDRY原則を実践
|
||||
|
||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||
using "../utils/string.nyash" as StringUtils
|
||||
using "../utils/escape.nyash" as EscapeUtils
|
||||
using "../utils/string.hako" as StringUtils
|
||||
using "../utils/escape.hako" as EscapeUtils
|
||||
// EscapeUtils は必要時に遅延includeする(一部構文が未対応環境でも数値系は動かすため)
|
||||
|
||||
// 🌟 JSON値を表現するBox(Everything is Box原則)
|
||||
@ -2,9 +2,9 @@
|
||||
// 責務: 文字列をトークン列に変換、エラー検出、位置情報管理
|
||||
|
||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||
using "./scanner.nyash" as JsonScanner
|
||||
using "./token.nyash" as JsonToken
|
||||
using "../utils/escape.nyash" as EscapeUtils
|
||||
using "./scanner.hako" as JsonScanner
|
||||
using "./token.hako" as JsonToken
|
||||
using "../utils/escape.hako" as EscapeUtils
|
||||
// Removed other dependencies - using self-contained methods
|
||||
|
||||
// 🎯 高精度JSONトークナイザー(Everything is Box)
|
||||
@ -2,10 +2,10 @@
|
||||
// 責務: トークン列をJsonNodeに変換、構文エラー検出、ネスト構造処理
|
||||
|
||||
// NOTE: use paths relative to this file to work under nyash.toml alias packaging
|
||||
using "../lexer/tokenizer.nyash" as JsonTokenizer
|
||||
using "../lexer/token.nyash" as TokenType
|
||||
using "../core/node.nyash" as JsonNode
|
||||
using "../utils/string.nyash" as StringUtils
|
||||
using "../lexer/tokenizer.hako" as JsonTokenizer
|
||||
using "../lexer/token.hako" as TokenType
|
||||
using "../core/node.hako" as JsonNode
|
||||
using "../utils/string.hako" as StringUtils
|
||||
|
||||
// 🎯 高精度JSON構文解析器(Everything is Box)
|
||||
static box JsonParserModule {
|
||||
@ -1,4 +1,4 @@
|
||||
using "apps/lib/json_native/core/compat.nyash" as JsonCompat
|
||||
using "apps/lib/json_native/core/compat.hako" as JsonCompat
|
||||
|
||||
print("compat: begin")
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// 最終統合テスト - Nyash JSON Native完全版
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
static box FinalIntegrationTest {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// 完全統合テスト - 美しいモジュラー設計の動作確認
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
print("🎨 Nyash JSON Native 統合テスト開始")
|
||||
print("美しいモジュラー設計 vs yyjson巨大ファイル")
|
||||
@ -1,7 +1,7 @@
|
||||
// Phase 2 精度テスト - yyjson相当精度の検証
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParser
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParser
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
static box Phase2AccuracyTest {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// JsonNode基本動作テスト - 80%の動く基盤を確認
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
// ===== 基本値テスト =====
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// Utils層テスト - StringUtils & EscapeUtilsの動作確認
|
||||
|
||||
using "apps/lib/json_native/utils/string.nyash" as StringUtils
|
||||
using "apps/lib/json_native/utils/escape.nyash" as EscapeUtils
|
||||
using "apps/lib/json_native/utils/string.hako" as StringUtils
|
||||
using "apps/lib/json_native/utils/escape.hako" as EscapeUtils
|
||||
|
||||
print("🧪 Utils層テスト開始")
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// yyjson置き換えテスト - 既存APIとの互換性確認
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
// 🔄 既存JsonDocBox API互換テスト
|
||||
static box JsonDocBoxCompatTest {
|
||||
@ -88,7 +88,7 @@ static box JsonDocBoxCompatTest {
|
||||
|
||||
// 実際の使用例テスト
|
||||
test_real_usage_examples() {
|
||||
// apps/tests/jsonbox_parse_ok.nyash の内容をシミュレート
|
||||
// apps/tests/jsonbox_parse_ok.hako の内容をシミュレート
|
||||
print("Real usage example simulation:")
|
||||
|
||||
local examples = new ArrayBox()
|
||||
@ -120,7 +120,7 @@ static box JsonDocBoxCompatTest {
|
||||
|
||||
// 既存のエラーケースをテスト
|
||||
local error_cases = new ArrayBox()
|
||||
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.nyash
|
||||
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.hako
|
||||
error_cases.push("{invalid json}")
|
||||
error_cases.push("[1, 2, 3") // 不完全な配列
|
||||
error_cases.push("{\"key\": \"value\",}") // 末尾カンマ
|
||||
@ -1,4 +1,4 @@
|
||||
// loopform_normalize.nyash — ループ正規化前処理(恒等版)
|
||||
// loopform_normalize.hako — ループ正規化前処理(恒等版)
|
||||
// 目的: while 等を安定化(キー順・簡易キャリア整列)。
|
||||
// 現段階は恒等(identity)。将来段階で安全な最小正規化を実装する。
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
static box PatternBuilder {
|
||||
// eq(lhs, rhs) => lhs == rhs
|
||||
eq(lhs_json, rhs_json) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
return JB.binary("==", lhs_json, rhs_json)
|
||||
}
|
||||
|
||||
// or_([c1, c2, ...]) => c1 || c2 || ... (空は false)
|
||||
or_(conds) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
if conds.length() == 0 { return JB.literal_bool(false) }
|
||||
if conds.length() == 1 { return conds.get(0) }
|
||||
local i = 1
|
||||
@ -24,7 +24,7 @@ static box PatternBuilder {
|
||||
|
||||
// and_([g1, g2, ...]) => g1 && g2 && ... (空は true)
|
||||
and_(conds) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
if conds.length() == 0 { return JB.literal_bool(true) }
|
||||
if conds.length() == 1 { return conds.get(0) }
|
||||
local i = 1
|
||||
@ -1,4 +1,4 @@
|
||||
// scopebox_inject.nyash — JSON v0 前処理(恒等版)
|
||||
// scopebox_inject.hako — JSON v0 前処理(恒等版)
|
||||
// 目的: If.then/else, Loop.body を ScopeBox 相当に包む前処理の導線を提供。
|
||||
// 現段階は恒等(identity)。将来段階で安全な包み込みを実装する。
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/add.nyash
|
||||
// std/operators/add.hako
|
||||
// AddOperator — 加算の演算子ボックス(開発用観測MVP)
|
||||
// 目的: 加算を明示呼び出しとして観測(返り値は未使用)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/compare.nyash
|
||||
// std/operators/compare.hako
|
||||
// CompareOperator — 比較演算の演算子ボックス(開発用観測MVP)
|
||||
// 目的: 比較を明示の呼び出しとして観測可能にする(MVPでは返り値は未使用)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/stringify.nyash
|
||||
// std/operators/stringify.hako
|
||||
// StringifyOperator — 明示的な文字列化の演算子ボックス(開発用)
|
||||
// 目的: 暗黙の toString に依存せず、観測可能な文字列化を提供する
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// array_prepend_zero_macro.nyash
|
||||
// array_prepend_zero_macro.hako
|
||||
// MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// hang_macro.nyash
|
||||
// hang_macro.hako
|
||||
// Macro that never returns (infinite loop) to test timeout handling.
|
||||
|
||||
static box MacroBoxSpec {
|
||||
@ -1,4 +1,4 @@
|
||||
// if_match_normalize_macro.nyash
|
||||
// if_match_normalize_macro.hako
|
||||
// Scaffold: identity expansion for now. Future: introduce join variable and
|
||||
// canonical If/Match normalization (scrutinee once, guard fused) as documented
|
||||
// in docs/guides/if-match-normalize.md.
|
||||
@ -7,7 +7,7 @@ static box MacroBoxSpec {
|
||||
name() { return "IfMatchNormalize" }
|
||||
|
||||
expand(json, ctx) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
|
||||
// --- helpers copied/adapted from loop_normalize ---
|
||||
function parse_value(s, i) {
|
||||
@ -1,4 +1,4 @@
|
||||
// invalid_json_macro.nyash
|
||||
// invalid_json_macro.hako
|
||||
// Macro that returns invalid JSON (for strict error test)
|
||||
|
||||
static box MacroBoxSpec {
|
||||
@ -1,4 +1,4 @@
|
||||
// loop_normalize_macro.nyash
|
||||
// loop_normalize_macro.hako
|
||||
// MVP: identity expansion with (json, ctx) signature.
|
||||
// Next steps: normalize `loop(cond){ body }` into carrier-based LoopForm.
|
||||
|
||||
@ -10,7 +10,7 @@ static box MacroBoxSpec {
|
||||
// "kind":"Loop","condition":<json>,"body":[ ... ] and rewrite them
|
||||
// into a normalized form using JsonBuilder (keys ordered as condition/body).
|
||||
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
|
||||
// helpers
|
||||
local s = json
|
||||
@ -1,4 +1,4 @@
|
||||
// map_insert_tag_macro.nyash
|
||||
// map_insert_tag_macro.hako
|
||||
// MacroBoxSpec.expand: insert a leading entry {"k":"__macro","v":"on"} into every Map entries list
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// scope_defer_macro.nyash
|
||||
// scope_defer_macro.hako
|
||||
// MVP scaffold: detect @scope/@defer style markers in AST JSON (string) and keep identity.
|
||||
// Future: attach scope attrs to blocks and emit MIR hints in lowering.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// upper_string_macro.nyash
|
||||
// upper_string_macro.hako
|
||||
// MacroBoxSpec.expand: uppercase string literal values that start with "UPPER:" in AST JSON v0
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
set -e
|
||||
|
||||
NYASH=${NYASH:-"../../target/release/nyash"}
|
||||
SCRIPT="main.nyash"
|
||||
SCRIPT="main.hako"
|
||||
|
||||
echo "=== ny-echo Test Suite ==="
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user