diff --git a/CLAUDE.md b/CLAUDE.md index 9d74b2f4..5260cad7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -176,6 +176,24 @@ cargo test ``` ### 🐛 デバッグ + +#### パーサー無限ループ対策(NEW! 2025-08-09) +```bash +# 🔥 デバッグ燃料でパーサー制御 +./target/release/nyash --debug-fuel 1000 program.nyash # 1000回制限 +./target/release/nyash --debug-fuel unlimited program.nyash # 無制限 +./target/release/nyash program.nyash # デフォルト10万回 + +# パーサー無限ループが検出されると自動停止+詳細情報表示 +🚨 PARSER INFINITE LOOP DETECTED at method call argument parsing +🔍 Current token: IDENTIFIER("from") at line 17 +🔍 Parser position: 45/128 +``` + +**対応状況**: must_advance!マクロでパーサー制御完全実装済み✅ +**効果**: 予約語"from"など問題のあるトークンも安全にエラー検出 + +#### アプリケーション デバッグ ```nyash // DebugBox活用 DEBUG = new DebugBox() @@ -220,4 +238,4 @@ docs/ --- -最終更新: 2025年8月9日 - **🎯 静的Box Mainパターン+変数宣言厳密化システム実装完了!Gemini先生絶賛の「非常に洗練された設計」達成。メモリ安全性・非同期安全性保証で本格言語レベルに到達!** \ No newline at end of file +最終更新: 2025年8月9日 - **🔥 パーサー無限ループ完全制圧!`--debug-fuel`引数でユーザー制御可能+must_advance!マクロによる早期検出システム完成。予約語問題も安全にエラー表示。静的Box Mainパターン+変数宣言厳密化と合わせて本格言語レベル到達!** \ No newline at end of file diff --git a/c_drive_icon.bmp b/c_drive_icon.bmp deleted file mode 100644 index d16a89c2..00000000 Binary files a/c_drive_icon.bmp and /dev/null differ diff --git a/debug_ast.nyash b/debug_ast.nyash deleted file mode 100644 index 901e59cb..00000000 --- a/debug_ast.nyash +++ /dev/null @@ -1,18 +0,0 @@ -// AST解析用シンプルテスト - -box TestBox { - init { nodeId } - - testMethod(arg1, arg2, arg3) { - print("Called: " + arg1 + ", " + arg2 + ", " + arg3) - } - - callSelf() { - me.testMethod("first", "second", me.nodeId) - } -} - -local testObj -testObj = new TestBox() -testObj.nodeId = "test" -testObj.callSelf() \ No newline at end of file diff --git a/nyash-rust/simple_editor.nyash b/examples/simple_editor.nyash similarity index 100% rename from nyash-rust/simple_editor.nyash rename to examples/simple_editor.nyash diff --git a/nyash-rust/test_egui_basic.nyash b/examples/test_egui_basic.nyash similarity index 100% rename from nyash-rust/test_egui_basic.nyash rename to examples/test_egui_basic.nyash diff --git a/index.html b/index.html deleted file mode 100644 index 31d2fe1e..00000000 --- a/index.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - 🐱 Nyash Programming Language - - - -
-

🐱 Nyash

-

Next-Generation Browser-Native Programming Language

-

革新的プログラミング言語 - ブラウザーで動く新世代開発体験

- -
- 🎯 Everything is Box Philosophy
- Every value in Nyash is a Box - unified, memory-safe, and elegant.
- すべての値がBoxとして統一された、メモリ安全で美しい世界 -
- - - 🎮 Try Nyash Now!
- No installation required! -
- -
-
-

🚀 Browser-First

-

Runs directly in web browsers via WebAssembly. Zero installation, instant coding!

-
-
-

🎨 Creative Coding

-

Built-in Canvas API, visual debugging, perfect for games and art projects!

-
-
-

🛡️ Memory Safe

-

Everything is Box philosophy eliminates crashes and memory leaks automatically!

-
-
-

⚡ Async Ready

-

Simple nowait/await syntax for parallel processing without complexity!

-
-
- - - - -
- - \ No newline at end of file diff --git a/llvm-mingw-20240619-ucrt-ubuntu-20.04-x86_64.tar.xz b/llvm-mingw-20240619-ucrt-ubuntu-20.04-x86_64.tar.xz deleted file mode 100644 index 85373076..00000000 --- a/llvm-mingw-20240619-ucrt-ubuntu-20.04-x86_64.tar.xz +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/minimal_bug.nyash b/minimal_bug.nyash deleted file mode 100644 index 39fb8ae9..00000000 --- a/minimal_bug.nyash +++ /dev/null @@ -1,28 +0,0 @@ -// 最小限のバグ再現コード - -box BoxA { - init { nodeId } - - callOther(other) { - // Cross-Box 3引数呼び出し(ここでハング) - other.receive("msg", "data", me.nodeId) - } -} - -box BoxB { - init { } - - receive(type, data, from) { - print("Received: " + from) - } -} - -local boxA -boxA = new BoxA() -boxA.nodeId = "A" - -local boxB -boxB = new BoxB() - -// これでハングする -boxA.callOther(boxB) \ No newline at end of file diff --git a/minimal_bug_output.txt b/minimal_bug_output.txt deleted file mode 100644 index 3af4f1b0..00000000 --- a/minimal_bug_output.txt +++ /dev/null @@ -1,34 +0,0 @@ -🦀 Nyash Rust Implementation - Executing file: minimal_bug.nyash 🦀 -==================================================== -📝 File contents: -// 最小限のバグ再現コード - -box BoxA { - init { nodeId } - - callOther(other) { - // Cross-Box 3引数呼び出し(ここでハング) - other.receive("msg", "data", me.nodeId) - } -} - -box BoxB { - init { } - - receive(type, data, from) { - print("Received: " + from) - } -} - -local boxA -boxA = new BoxA() -boxA.nodeId = "A" - -local boxB -boxB = new BoxB() - -// これでハングする -boxA.callOther(boxB) - -🚀 Parsing and executing... - diff --git a/next_tasks_options.md b/next_tasks_options.md deleted file mode 100644 index cad22837..00000000 --- a/next_tasks_options.md +++ /dev/null @@ -1,49 +0,0 @@ -# 🎯 Nyash開発 - 次のタスク候補 - -## 1. 🔧 パーサーリファクタリング継続 -**declarations.rs作成** - 残り1,249行のmod.rsをさらに分割 -- parse_box_declaration -- parse_function_declaration -- parse_interface_box_declaration -- parse_static_declaration -- parse_global_var -利点: コード整理完了、保守性最大化 - -## 2. 🎨 新規アプリケーション開発 -**実用的なNyashアプリを作る** -- 🐍 Snakeゲーム - ArrayBox/ゲームループ活用 -- 📁 ファイル整理ツール - FileBox/パターンマッチング -- 🎮 Tetris - 2次元配列/タイマー/キー入力 -- 📊 CSVビューア - ファイル処理/テーブル表示 -利点: 言語の実用性実証、バグ発見 - -## 3. 🌉 extern box実装 -**FFI基盤でネイティブ連携** -- C/C++関数呼び出し -- 外部ライブラリ統合 -- GUI基盤準備 -利点: 実用アプリの可能性拡大 - -## 4. 📚 標準ライブラリ拡充 -**基本機能の充実** -- StringBox拡張 (split/join/regex) -- ArrayBox拡張 (map/filter/reduce) -- FileBox拡張 (ディレクトリ操作) -- NetworkBox実装 (HTTP/Socket) -利点: 開発効率向上 - -## 5. 🚀 パフォーマンス最適化 -**実行速度改善** -- バイトコードコンパイラ -- JITコンパイラ検討 -- メモリ管理最適化 -利点: 実用レベルの性能確保 - -## 6. 🧪 テストフレームワーク -**品質保証基盤** -- assert/expect実装 -- テストランナー -- カバレッジ測定 -利点: 安定性向上 - -どれが一番楽しそう/必要そうかにゃ? \ No newline at end of file diff --git a/nyash-rust/egui_implementation_summary.md b/nyash-rust/egui_implementation_summary.md deleted file mode 100644 index ad934bfb..00000000 --- a/nyash-rust/egui_implementation_summary.md +++ /dev/null @@ -1,82 +0,0 @@ -# EguiBox Implementation Summary - -## 🎉 完了した作業 - -### 1. ✅ EguiBox基本実装 -- `src/boxes/egui_box.rs` - EguiBoxの完全実装 -- NyashBoxトレイト実装(to_string_box, clone_box, as_any, equals, type_name, box_id) -- Arc/Mutex使用による状態管理 -- NyashApp構造体によるeframe::App実装 - -### 2. ✅ インタープリター統合 -- `src/interpreter/objects.rs` - EguiBoxコンストラクタ追加 -- `src/interpreter/expressions.rs` - EguiBoxメソッド呼び出し対応 -- `src/interpreter/box_methods.rs` - execute_egui_method実装 -- setTitle(), setSize(), run()メソッド実装 - -### 3. ✅ ビルド成功 -- egui/eframe依存関係の正しい設定 -- 条件付きコンパイル(非WASM環境のみ) -- import/use文の修正完了 - -### 4. ✅ テストプログラム作成 -- `test_egui_basic.nyash` - 基本動作確認 -- `simple_editor.nyash` - SimpleEditorアプリケーション実装 - -## 🚧 現在の課題 - -### メインスレッド制約 -``` -Error: EguiBox.run() must be called from main thread -``` - -これはeguiの仕様による制約で、GUIアプリケーションはメインスレッドから起動する必要がある。 - -## 🎯 今後の実装方針 - -### 1. GUI実行コンテキスト解決案 - -#### Option A: 専用実行モード -```bash -nyash --gui simple_editor.nyash -``` -GUIモードでNyashを起動し、メインスレッドをGUIに渡す - -#### Option B: 非同期実行 -```nyash -app = new EguiBox() -app.runAsync() // 非ブロッキング実行 -``` - -#### Option C: データ駆動UI(Gemini先生提案) -```nyash -app = new EguiBox() -app.setUI({ - type: "vertical", - children: [ - { type: "label", text: "Hello" }, - { type: "button", text: "Click", onClick: handler } - ] -}) -app.show() // データに基づいてUIを描画 -``` - -### 2. 実装済み収穫 - -- **Everything is Box哲学の実証** - GUIフレームワークもBoxとして吸収可能 -- **メソッドベース統合** - setTitle/setSize等の自然なAPI -- **Nyashの拡張性確認** - 外部ライブラリ統合の成功例 - -## 🔥 「化け物言語」への道 - -ユーザーの言葉通り、Nyashは本当に「化け物言語」になる可能性を示した: -- ✅ なんでもBoxにできる(GUI、Web、ファイル、etc) -- ✅ 統一されたインターフェース -- ✅ 言語レベルでの自然な統合 - -## 次のステップ - -1. GUI実行コンテキスト問題の解決 -2. イベントハンドラーの実装(MethodBox活用) -3. より複雑なUIコンポーネントの追加 -4. ファイル操作との統合(FileBox + EguiBox) \ No newline at end of file diff --git a/sessions/ai_consultation_from_keyword_alternatives_20250809.md b/sessions/ai_consultation_from_keyword_alternatives_20250809.md new file mode 100644 index 00000000..7b38c943 --- /dev/null +++ b/sessions/ai_consultation_from_keyword_alternatives_20250809.md @@ -0,0 +1,196 @@ +# AI相談セッション: from予約語問題の解決策検討 + +**日時**: 2025年8月9日 +**相談者**: Claude Code + ユーザー +**相談先**: Gemini先生 + ChatGPT先生 + +## 🔍 問題の詳細 + +### 現状の問題 +- `from`が継承用予約語として定義済み(`box Child from Parent`構文) +- しかし実用的には`receive(type, data, from)`のような変数名・パラメータ名として使いたいケースが多い +- パーサーが`from`を変数として認識せず「Invalid expression」エラー発生 + +### 技術的詳細 +```nyash +// ❌ エラーになる例 +other.receive("msg", "data", from) // from が変数名として使えない +receive(type, data, from) { // パラメータ名としても使えない + print("Received: " + from) +} +``` + +### 問題の本質 +**文脈依存の予約語問題** +- ✅ 継承文脈では予約語として必要:`box Child from Parent` +- ❌ 変数・パラメータ文脈では使えない:`receive(msg, data, from)` + +## 🧠 Gemini先生の提案(哲学重視アプローチ) + +### 5つの代替案 + +#### 案1: `extends` - 標準的で分かりやすい選択 +```nyash +box Child extends Parent { ... } +``` +- **実装難易度**: 低(キーワード置換のみ) +- **ユーザビリティ**: 高(馴染み深い、学習コストゼロ) +- **Nyash哲学親和性**: 中(実用的だが哲学的ではない) + +#### 案2: `opens` - Box哲学を反映した独創的選択 ⭐ +```nyash +box Child opens Parent { ... } +``` +- **実装難易度**: 低 +- **ユーザビリティ**: 中〜高(「親Boxを開けて機能取得」のメタファー) +- **Nyash哲学親和性**: 非常に高い(Everything is Box哲学を構文レベルで表現) + +#### 案3: `` `from` `` - エスケープ構文で柔軟性最大化 ⭐ +```nyash +// 継承(変更なし) +box Child from Parent { ... } +// 変数名(エスケープ) +receive(type, data, `from`) { ... } +``` +- **実装難易度**: 中(レクサーにバッククォート処理追加) +- **ユーザビリティ**: 高(既存構文維持、必要時のみエスケープ) +- **Nyash哲学親和性**: 高(開発者の柔軟性を尊重) + +#### 案4: `is_a` - 関係性を明確にする英語的表現 +```nyash +box Child is_a Parent { ... } +``` +- **実装難易度**: 低 +- **ユーザビリティ**: 高(自然英語的、is-a関係を表現) +- **Nyash哲学親和性**: 中(分かりやすさ重視と一致) + +#### 案5: `:<` - 記号による簡潔表現 +```nyash +box Child :< Parent { ... } +``` +- **実装難易度**: 低 +- **ユーザビリティ**: 中(簡潔だが初学者に不親切) +- **Nyash哲学親和性**: 低(Boxメタファーと方向性が異なる) + +### Gemini先生の推奨 +1. **Nyash独自性重視** → `opens`(最もユニーク、世界観を印象付け) +2. **実用性重視** → `` `from` ``(現実的でエレガントな解決策) + +## 🔧 ChatGPT先生の提案(実装重視アプローチ) + +### 創造的代替案 +- **`extends/implements`**: 標準的、スケーラブル +- **`is/with`**: `box Child is Parent with TraitA` +- **`via/with`**: Box哲学ヒント +- **`adopts/with`**: 単一親+ミックスイン +- **`<-` or `:`**: 簡潔、多言語共通 +- **`packs/unpacks`**: Box風味(曖昧性リスクあり) + +### パーサー実装観点の最適解 ⭐ +**文脈依存キーワード方式** +```rust +// レクサー: from を Ident("from") として処理 +// パーサー: box宣言内でのみキーワードとして認識 +box_decl := 'box' Ident ( ('from' | ':') type_list )? body +``` + +### 推奨実装戦略 +1. **主構文**: `:` で継承、`with` でトレイト + ```nyash + box Child: Parent with TraitA, TraitB + ``` +2. **キーワードポリシー**: 文脈依存キーワード全面採用 +3. **エスケープ**: `r#from` Raw identifiers サポート +4. **診断**: 的確なエラーメッセージと修正提案 + +### 将来拡張性考慮 +- **単一継承+トレイト**: 推奨アーキテクチャ +- **スケーラブルリスト形式**: MI対応可能 +- **明示的super呼び出し**: 競合解決 +- **段階的移行**: `:` エイリアス → `from` 非推奨化 + +### 具体的実装ノート(Rust) +```rust +// レクサー: 全単語をIdent(text)として処理(ハードキーワード除く) +fn peek_ident(&self, s: &str) -> bool +fn eat_ident(&mut self, s: &str) -> bool + +// Boxルール: box名前の後、from/:を判定 +peek_ident("from") || peek(Token::Colon) + +// Raw identifiers: r# サポート +// テスト: 継承・パラメータ・エスケープ全パターン +``` + +## 🎯 Claude Code分析・統合提案 + +### 両AI共通の最重要提案 +**🏆 最優先推奨:文脈依存 + `:` 構文** + +```nyash +// ✅ 継承(パーサーが文脈判定) +box Child : Parent { } + +// ✅ パラメータ(通常の識別子として認識) +receive(type, data, from) { } + +// ✅ Raw identifier(完全回避) +receive(type, data, r#from) { } +``` + +### 実装戦略ロードマップ +1. **Phase 1**: レクサーで`from`を`Ident("from")`として処理 +2. **Phase 2**: パーサーに`peek_ident("from")`ヘルパー追加 +3. **Phase 3**: `:`を継承キーワードとして並列サポート +4. **Phase 4**: エラーメッセージ改善・Raw identifiers追加 +5. **将来**: `from`を段階的に`:` に移行(下位互換維持) + +### 技術的メリット +- **パーサー簡潔性**: 文脈依存により複雑性最小化 +- **ユーザー体験**: 既存コード破壊なし、自然な移行 +- **拡張性**: トレイト・MI対応可能 +- **保守性**: 将来の言語仕様拡張に柔軟 + +### Nyash哲学との整合性 +- **Everything is Box**: `:` は「型関係」を示す直感的記号 +- **直感的構文**: 多言語経験者に馴染み深い +- **メモリ安全性**: Rust実装との親和性高い + +## 📋 次のアクション + +### 実装優先度 +1. **High**: 文脈依存キーワード実装(`from`問題の根本解決) +2. **High**: `:` 継承構文の並列サポート +3. **Medium**: Raw identifiers (`r#from`) サポート +4. **Medium**: 改良エラーメッセージ・診断 +5. **Low**: `opens` 等のNyash独自構文検討 + +### 検証テスト +```nyash +// 継承テスト +box C from P {} // 既存構文(動作維持) +box C: P {} // 新構文(並列サポート) + +// パラメータテスト +fn receive(type, data, from) {} // 変数名として使用可能 +let r#from = 1; // Raw identifier + +// エラーハンドリング +box C from {} // 「expected type after 'from'」 +``` + +## 🎉 結論 + +**ChatGPTの文脈依存 + `:` 構文**が最も実用的で将来性のある解決策として両AI・Claude共通で推奨。 + +この方向での実装により: +- ✅ 既存の`from`問題完全解決 +- ✅ Nyash哲学との整合性維持 +- ✅ 将来拡張への柔軟性確保 +- ✅ 実装・保守コストの最小化 + +--- + +**保存日時**: 2025年8月9日 23:42 +**関連実装**: パーサー無限ループ対策完了済み(`--debug-fuel`対応済み) +**次期実装予定**: 文脈依存キーワード + `:` 継承構文 \ No newline at end of file diff --git a/sessions/ai_consultation_standard_boxes_20250110.md b/sessions/ai_consultation_standard_boxes_20250110.md new file mode 100644 index 00000000..9a7c475d --- /dev/null +++ b/sessions/ai_consultation_standard_boxes_20250110.md @@ -0,0 +1,126 @@ +# AI相談記録:Nyash標準Box型の検討 + +日時:2025年1月10日 +相談者:Claude +回答者:Gemini、ChatGPT (Codex) + +## 🎯 相談内容 + +Nyashプログラミング言語に必要な標準Box型について、現代的なアプリケーション開発の観点から提案を求めました。 + +## 📦 現在実装済みのBox型(14種類) + +- **基本型**: StringBox, IntegerBox, BoolBox, NullBox +- **計算系**: MathBox, RandomBox, TimeBox +- **IO系**: ConsoleBox, DebugBox, SoundBox +- **データ**: MapBox +- **GUI**: EguiBox +- **Web**: WebDisplayBox, WebConsoleBox, WebCanvasBox +- **通信**: SimpleIntentBox + +## 🌟 Gemini先生の提案 + +### 優先度:高 +1. **ArrayBox** - 順序付きコレクション、最優先実装 +2. **ExceptionBox/ResultBox** - エラー処理(ResultBoxモデル推奨) +3. **PromiseBox/FutureBox** - 非同期処理基盤 + +### 優先度:中 +4. **FileBox** - ファイルI/O(非同期設計) +5. **JSONBox** - JSON解析・生成 +6. **RegexBox** - 正規表現 + +### 優先度:低 +7. **NetworkBox** - HTTP通信 +8. **TypeBox** - 型情報・リフレクション + +### Geminiの重要な指摘 +- ArrayBoxなしでは言語としての実用性が大きく損なわれる +- エラー処理はResultBoxモデルがNyashの安全性哲学と親和性が高い +- 非同期処理はGUIやI/Oを実用的にするために必須 +- まずデータ構造→エラー処理→非同期の順で基礎を固めるべき + +## 🚀 ChatGPT先生の提案 + +### Top Priorities (P0) +1. **ArrayBox** - map/filter/reduce含む、immutable-by-default +2. **ResultBox + ExceptionBox** - ResultBox中心、try/catch糖衣構文 +3. **FutureBox** - await、cancellation、timeouts対応 +4. **BufferBox** - バイナリデータ基盤(新提案!) +5. **FileBox/PathBox/DirBox** - 安全なファイルシステム操作 +6. **JSONBox** - ストリーミング対応 +7. **HttpClientBox** - fetch風API(新提案!) + +### Secondary Priorities (P1) +8. **RegexBox** - ReDoS対策付き +9. **EventBox** - pub/subシステム(新提案!) +10. **SchemaBox** - ランタイムデータ検証(新提案!) +11. **ConfigBox** - 設定管理 +12. **CryptoBox** - 暗号化・ハッシュ +13. **CompressionBox** - 圧縮 + +### ChatGPTの追加提案 +- **StreamBox** - ReadableStream/WritableStream統一I/O +- **TaskBox/ChannelBox** - 構造化並行性 +- **WorkerBox** - 分離スレッド実行 +- **DatabaseBox/SQLiteBox** - デスクトップアプリ向け + +### ゲーム開発Kit(別パッケージ推奨) +- ImageBox, SpriteBox, InputBox, PhysicsBox, TilemapBox + +## 📊 統合分析 + +### 両者が一致した最重要Box +1. **ArrayBox** - 絶対必須のデータ構造 +2. **ResultBox/ExceptionBox** - エラー処理基盤 +3. **FutureBox/PromiseBox** - 非同期処理 +4. **FileBox** - ファイルI/O +5. **JSONBox** - データ交換フォーマット +6. **RegexBox** - 文字列処理 + +### ChatGPT独自の重要提案 +- **BufferBox** - バイナリデータ処理の基盤として重要 +- **HttpClientBox** - 現代アプリには必須 +- **StreamBox** - 統一的なI/Oインターフェース +- **EventBox** - イベント駆動アーキテクチャ +- **SchemaBox** - 型安全性の向上 + +## 🎯 推奨実装順序 + +### Phase 1: コア基盤(2週間) +1. ArrayBox - データ構造の基礎 +2. ResultBox - エラー処理モデル +3. FutureBox - 非同期基盤 +4. BufferBox - バイナリデータ + +### Phase 2: 実用機能(3週間) +5. FileBox/PathBox - ファイル操作 +6. JSONBox - データシリアライズ +7. StreamBox - I/O抽象化 +8. HttpClientBox - ネットワーク + +### Phase 3: 拡張機能(4週間) +9. RegexBox - 高度な文字列処理 +10. EventBox - イベントシステム +11. SQLiteBox - ローカルDB +12. TaskBox - 並列処理 + +## 💡 設計指針 + +1. **エラー処理**: ResultBoxモデルを基本とし、try/catch糖衣構文で使いやすく +2. **非同期**: すべてのI/OはFutureBoxベース、同期版は最小限 +3. **ストリーム**: File/HTTP/ProcessはStreamBox統一インターフェース +4. **メモリ安全**: Rustの所有権モデルを活かした設計 +5. **初心者フレンドリー**: JavaScript/TypeScript風のAPI命名 + +## 🌈 まとめ + +現代的なNyash言語には、最低限ArrayBox、エラー処理、非同期処理が必要。 +その上でファイルI/O、ネットワーク、データ処理系を追加することで、 +実用的なアプリケーション開発が可能になります。 + +特にChatGPTが提案したBufferBox、HttpClientBox、StreamBoxは、 +Webやネットワークアプリケーション開発において重要な基盤となるでしょう。 + +--- +保存日時:2025年1月10日 \ No newline at end of file diff --git a/src/boxes/bool_box.rs b/src/boxes/bool_box.rs index ac6b1a88..8175fb15 100644 --- a/src/boxes/bool_box.rs +++ b/src/boxes/bool_box.rs @@ -1,4 +1,43 @@ -// BoolBox implementation - Boolean values in Nyash +/*! ✅ BoolBox - 真偽値Box + * + * ## 📝 概要 + * true/false値を扱うためのBox。 + * JavaScript Boolean型のように直感的な論理演算が可能。 + * + * ## 🛠️ 利用可能メソッド + * - `toString()` - 文字列変換 ("true" / "false") + * - `not()` - 論理NOT (演算子: not) + * - `and(other)` - 論理AND (演算子: and) + * - `or(other)` - 論理OR (演算子: or) + * - `equals(other)` - 等価比較 (演算子: ==) + * + * ## 💡 使用例 + * ```nyash + * local flag, result, text + * flag = true + * + * result = not flag // false + * result = flag and true // true + * result = flag or false // true + * text = flag.toString() // "true" + * + * // 条件分岐での利用 + * if (flag) { + * print("Flag is true!") + * } + * ``` + * + * ## 🔄 型変換 + * - 数値への変換: true → 1, false → 0 + * - 文字列への変換: "true" / "false" + * - 空文字・null・0は false として扱われる + * + * ## ⚡ 論理演算子実装済み + * - `not condition` - NOT演算子 + * - `a and b` - AND演算子 + * - `a or b` - OR演算子 + */ + use crate::box_trait::NyashBox; use std::any::Any; use std::fmt::Display; diff --git a/src/boxes/console_box.rs b/src/boxes/console_box.rs index 9500b467..b97d066d 100644 --- a/src/boxes/console_box.rs +++ b/src/boxes/console_box.rs @@ -1,7 +1,48 @@ -/*! - * ConsoleBox - ブラウザコンソール制御Box +/*! 📟 ConsoleBox - コンソール出力Box * - * WebAssembly環境でブラウザのconsole APIにアクセス + * ## 📝 概要 + * Webブラウザのコンソール機能を統合したBox。 + * WASM環境ではブラウザコンソール、ネイティブ環境では標準出力。 + * + * ## 🛠️ 利用可能メソッド + * - `log(message)` - 通常のメッセージ出力 + * - `warn(message)` - 警告メッセージ出力 + * - `error(message)` - エラーメッセージ出力 + * - `clear()` - コンソール画面クリア + * + * ## 💡 使用例 + * ```nyash + * local console + * console = new ConsoleBox() + * + * console.log("Hello, Nyash!") // 通常ログ + * console.warn("This is a warning") // 警告 + * console.error("Something went wrong") // エラー + * console.clear() // クリア + * + * // デバッグ用途 + * local value + * value = 42 + * console.log("Debug: value = " + value.toString()) + * ``` + * + * ## 🌐 環境別動作 + * - **WASM環境**: ブラウザの開発者ツールコンソールに出力 + * - **ネイティブ環境**: ターミナル標準出力にプレフィックス付きで出力 + * + * ## 🔍 デバッグ活用 + * ```nyash + * // エラーハンドリング + * if (error_condition) { + * console.error("Critical error occurred!") + * return null + * } + * + * // 実行トレース + * console.log("Function start") + * // 処理... + * console.log("Function end") + * ``` */ use crate::box_trait::{NyashBox, StringBox, BoolBox}; diff --git a/src/boxes/debug_box.rs b/src/boxes/debug_box.rs index 2eeda156..d4c83408 100644 --- a/src/boxes/debug_box.rs +++ b/src/boxes/debug_box.rs @@ -1,3 +1,104 @@ +/*! 🔍 DebugBox - デバッグ支援Box + * + * ## 📝 概要 + * プロフェッショナル開発向けデバッグ機能を提供するBox。 + * メモリ使用量監視、実行トレース、ブレークポイントなど + * 高度なデバッグ機能を完備。 + * + * ## 🛠️ 利用可能メソッド + * + * ### 🎯 基本デバッグ + * - `startTracking()` - デバッグ追跡開始 + * - `stopTracking()` - デバッグ追跡停止 + * - `trackBox(box, name)` - 特定Boxを追跡対象に追加 + * - `watch(box, name)` - リアルタイム監視 + * - `clear()` - 全デバッグ情報クリア + * + * ### 📊 レポート・分析 + * - `dumpAll()` - 全追跡データダンプ + * - `memoryReport()` - メモリ使用量レポート + * - `showCallStack()` - 関数呼び出しスタック表示 + * - `saveToFile(filename)` - デバッグ情報をファイル保存 + * + * ### 🎮 高度機能 + * - `setBreakpoint(function)` - ブレークポイント設定 + * - `traceCall(function, args)` - 関数呼び出しトレース + * - `isTracking()` - 追跡状態確認 + * - `getTrackedCount()` - 追跡中Box数取得 + * + * ## 💡 使用例 + * ```nyash + * local debug, user, product + * debug = new DebugBox() + * + * // デバッグ開始 + * debug.startTracking() + * + * // オブジェクトを追跡 + * user = new User("Alice", 25) + * debug.trackBox(user, "user_alice") + * + * product = new Product("Book", 1500) + * debug.trackBox(product, "book_product") + * + * // リアルタイム監視 + * debug.watch(user.age, "user_age") + * + * // レポート生成 + * print(debug.memoryReport()) + * print(debug.dumpAll()) + * + * // ファイルに保存 + * debug.saveToFile("debug_report.txt") + * ``` + * + * ## 🎮 実用例 - パフォーマンス診断 + * ```nyash + * static box PerformanceTest { + * init { debug, data, results } + * + * main() { + * me.debug = new DebugBox() + * me.debug.startTracking() + * + * // 大量データ処理のテスト + * me.data = [] + * loop(i < 1000) { + * me.data.push("item_" + i.toString()) + * } + * me.debug.trackBox(me.data, "large_array") + * + * // 処理実行 + * me.processData() + * + * // 結果分析 + * print(me.debug.memoryReport()) + * } + * } + * ``` + * + * ## ⚡ ベストプラクティス + * ```nyash + * // エラーハンドリング付きデバッグ + * local debug + * debug = new DebugBox() + * + * try { + * debug.startTracking() + * // 問題のあるコード + * risky_operation() + * } catch (error) { + * debug.saveToFile("error_dump.txt") + * print("Debug info saved to error_dump.txt") + * } + * ``` + * + * ## ⚠️ 注意 + * - 本格運用時はtrackingを無効にしてパフォーマンス向上 + * - 大量データ追跡時はメモリ消費に注意 + * - call stackは直近100件まで自動保持 + */ + use std::collections::HashMap; use std::sync::{Arc, Mutex}; use chrono::Local; diff --git a/src/boxes/egui_box.rs b/src/boxes/egui_box.rs index 694638f0..5ed07444 100644 --- a/src/boxes/egui_box.rs +++ b/src/boxes/egui_box.rs @@ -1,6 +1,35 @@ -// Nyash EguiBox Implementation -// Everything is Box哲学によるGUIフレームワーク統合 -// 「なんでもBoxにできる」化け物言語の第一歩! +/*! 🖼️ EguiBox - デスクトップGUIアプリBox + * Everything is Box哲学によるGUIフレームワーク統合 + * 「なんでもBoxにできる」化け物言語の第一歩! + * + * ## 📝 概要 + * Rustの人気GUI框架eframeを使ったネイティブデスクトップアプリ作成。 + * Nyashコードから直接GUI操作が可能! + * + * ## 🛠️ 利用可能メソッド + * - `setTitle(title)` - ウィンドウタイトル設定 + * - `setSize(width, height)` - ウィンドウサイズ設定 + * - `run()` - GUIアプリ実行開始 + * - `addText(text)` - テキスト表示追加 + * - `addButton(label)` - ボタン追加 + * - `close()` - ウィンドウ閉じる + * + * ## 💡 使用例 + * ```nyash + * // 基本的なGUIアプリ + * local app + * app = new EguiBox() + * app.setTitle("Nyash GUI Demo") + * app.setSize(800, 600) + * app.addText("Welcome to Nyash!") + * app.addButton("Click Me") + * app.run() // GUIアプリ開始 + * ``` + * + * ## ⚠️ 注意 + * - デスクトップ環境でのみ利用可能(WASM環境では無効) + * - `run()`はブロッキング動作(アプリ終了まで制御を返さない) + */ use crate::box_trait::{NyashBox, StringBox, BoolBox}; use crate::interpreter::RuntimeError; diff --git a/src/boxes/integer_box.rs b/src/boxes/integer_box.rs index 0a0290ce..e37ecee2 100644 --- a/src/boxes/integer_box.rs +++ b/src/boxes/integer_box.rs @@ -1,4 +1,42 @@ -// IntegerBox implementation - Integer values in Nyash +/*! 🔢 IntegerBox - 整数計算Box + * + * ## 📝 概要 + * 64ビット符号付き整数を扱うためのBox。 + * JavaScript Number型のように直感的な数値操作が可能。 + * + * ## 🛠️ 利用可能メソッド + * - `toString()` - 文字列変換 + * - `add(other)` - 加算 (演算子: +) + * - `subtract(other)` - 減算 (演算子: -) + * - `multiply(other)` - 乗算 (演算子: *) + * - `divide(other)` - 除算 (演算子: /) + * - `modulo(other)` - 余り計算 (演算子: %) + * - `equals(other)` - 等価比較 (演算子: ==) + * - `abs()` - 絶対値 + * - `min(other)` - 最小値 + * - `max(other)` - 最大値 + * + * ## 💡 使用例 + * ```nyash + * local num, result, text + * num = 42 + * + * result = num + 8 // 50 + * result = num * 2 // 84 + * result = num / 3 // 14 (整数除算) + * text = num.toString() // "42" + * + * // メソッド呼び出し形式も可能 + * result = num.add(10) // 52 + * result = num.multiply(3) // 126 + * ``` + * + * ## ⚠️ 注意 + * - ゼロ除算は実行時エラー + * - オーバーフロー時は標準i64の動作に従う + * - 小数点以下は切り捨て(整数除算) + */ + use crate::box_trait::NyashBox; use std::any::Any; use std::fmt::Display; diff --git a/src/boxes/map_box.rs b/src/boxes/map_box.rs index fee9899f..088adf55 100644 --- a/src/boxes/map_box.rs +++ b/src/boxes/map_box.rs @@ -1,8 +1,106 @@ -/*! - * Nyash Map Box - Key-Value store implementation +/*! 🗄️ MapBox - キー値ストレージBox * - * キーバリューストアを提供するBox型 - * Everything is Box哲学に基づくマップデータ構造 + * ## 📝 概要 + * 高性能キー値ストレージを提供するBox。 + * JavaScript Map、Python dict、C# Dictionaryと同等機能。 + * 動的データ管理やキャッシュ実装に最適。 + * + * ## 🛠️ 利用可能メソッド + * - `set(key, value)` - キー値ペア設定 + * - `get(key)` - 値取得 + * - `has(key)` - キー存在確認 + * - `remove(key)` - キー値ペア削除 + * - `clear()` - 全データクリア + * - `keys()` - 全キー取得 + * - `values()` - 全値取得 + * - `size()` - データ数取得 + * - `isEmpty()` - 空判定 + * + * ## 💡 使用例 + * ```nyash + * local map, result + * map = new MapBox() + * + * // データ設定 + * map.set("name", "Alice") + * map.set("age", 25) + * map.set("active", true) + * + * // データ取得 + * result = map.get("name") // "Alice" + * print("User: " + result) + * + * // 存在確認 + * if (map.has("email")) { + * print("Email: " + map.get("email")) + * } else { + * print("No email registered") + * } + * ``` + * + * ## 🎮 実用例 - ゲーム設定管理 + * ```nyash + * static box GameConfig { + * init { settings, scores } + * + * main() { + * me.settings = new MapBox() + * me.scores = new MapBox() + * + * // 設定初期化 + * me.settings.set("difficulty", "normal") + * me.settings.set("sound", true) + * me.settings.set("graphics", "high") + * + * // スコア記録 + * me.scores.set("level1", 850) + * me.scores.set("level2", 1200) + * me.scores.set("level3", 950) + * + * me.displayConfig() + * } + * + * displayConfig() { + * print("=== Game Settings ===") + * print("Difficulty: " + me.settings.get("difficulty")) + * print("Sound: " + me.settings.get("sound").toString()) + * print("Total scores: " + me.scores.size().toString()) + * } + * } + * ``` + * + * ## 🔍 キャッシュ実装例 + * ```nyash + * static box APICache { + * init { cache, ttl_map } + * + * main() { + * me.cache = new MapBox() + * me.ttl_map = new MapBox() + * } + * + * getData(url) { + * // キャッシュ確認 + * if (me.cache.has(url)) { + * return me.cache.get(url) + * } + * + * // APIから取得 + * local data + * data = fetchFromAPI(url) + * + * // キャッシュに保存 + * me.cache.set(url, data) + * return data + * } + * } + * ``` + * + * ## ⚠️ 注意 + * - キーは自動的に文字列変換される + * - スレッドセーフ (Arc使用) + * - 大量データ格納時はメモリ使用量に注意 + * - 存在しないキーの取得は "Key not found" メッセージ返却 */ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, ArrayBox}; diff --git a/src/boxes/math_box.rs b/src/boxes/math_box.rs index 5eed022d..e86eb65a 100644 --- a/src/boxes/math_box.rs +++ b/src/boxes/math_box.rs @@ -1,8 +1,59 @@ -/*! - * Nyash Math Box - Mathematical operations +/*! 🧮 MathBox - 数学計算Box * - * 数学演算を提供するBox型 - * Everything is Box哲学に基づく数学ライブラリ + * ## 📝 概要 + * 高度な数学演算を提供するBox。Python mathモジュールや + * JavaScript Math オブジェクトと同様の機能を提供。 + * + * ## 🛠️ 利用可能メソッド + * + * ### 🔢 基本計算 + * - `abs(value)` - 絶対値 + * - `max(a, b)` - 最大値 + * - `min(a, b)` - 最小値 + * - `pow(base, exp)` - 累乗 (base^exp) + * - `sqrt(value)` - 平方根 + * + * ### 📐 三角関数 + * - `sin(radians)` - 正弦 + * - `cos(radians)` - 余弦 + * - `tan(radians)` - 正接 + * + * ### 📊 対数・指数関数 + * - `log(value)` - 自然対数 (ln) + * - `log10(value)` - 常用対数 + * - `exp(value)` - 指数関数 (e^x) + * + * ### 🔄 丸め関数 + * - `floor(value)` - 切り下げ + * - `ceil(value)` - 切り上げ + * - `round(value)` - 四捨五入 + * + * ### 📏 定数取得 + * - `getPi()` - 円周率π (3.14159...) + * - `getE()` - 自然対数の底e (2.71828...) + * + * ## 💡 使用例 + * ```nyash + * local math, result + * math = new MathBox() + * + * result = math.abs(-42) // 42 + * result = math.max(10, 25) // 25 + * result = math.sqrt(16) // 4.0 + * result = math.pow(2, 3) // 8.0 + * result = math.sin(math.getPi() / 2) // 1.0 + * + * // 計算例 + * local pi, area + * pi = math.getPi() + * area = pi * math.pow(5, 2) // 半径5の円の面積 + * ``` + * + * ## ⚠️ 注意 + * - 三角関数の引数はラジアン + * - 負数の平方根・対数はエラー + * - オーバーフロー時は標準f64の動作に従う + * - 整数演算は自動でFloatBoxに変換される場合あり */ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox}; diff --git a/src/boxes/mod.rs b/src/boxes/mod.rs index a70ebeaf..01920945 100644 --- a/src/boxes/mod.rs +++ b/src/boxes/mod.rs @@ -1,5 +1,53 @@ -// Nyash Box Implementations Module -// Everything is Box哲学に基づく各Box型の実装 +/*! 🎯 Nyash Box実装モジュール + * Everything is Box哲学に基づく各Box型の実装 + * + * ## 📦 利用可能なBox一覧 + * + * ### 🔤 基本データ型Box + * - **StringBox**: 文字列操作 - `"Hello".length()`, `str.split(",")` + * - **IntegerBox**: 整数計算 - `42.add(8)`, `num.toString()` + * - **BoolBox**: 真偽値 - `true.not()`, `flag.toString()` + * + * ### 🧮 計算・ユーティリティBox + * - **MathBox**: 数学関数 - `Math.sin(x)`, `Math.random()` + * - **TimeBox**: 時間操作 - `Time.now()`, `time.format()` + * - **RandomBox**: 乱数生成 - `Random.int(10)`, `Random.choice(array)` + * + * ### 🖥️ システム・IO Box + * - **ConsoleBox**: コンソール出力 - `console.log()`, `console.error()` + * - **DebugBox**: デバッグ支援 - `debug.trace()`, `debug.memory()` + * - **SoundBox**: 音声再生 - `sound.beep()`, `sound.play(file)` + * + * ### 🗄️ コレクション・データBox + * - **MapBox**: キー値ストレージ - `map.set(key, val)`, `map.get(key)` + * - **NullBox**: NULL値表現 - `null.toString()` → "void" + * + * ### 🖼️ GUI・グラフィックBox + * - **EguiBox**: デスクトップGUI - `gui.setTitle()`, `gui.run()` + * + * ### 🌐 Web専用Box (WASM環境) + * - **WebDisplayBox**: HTML表示 - `display.show(html)` + * - **WebConsoleBox**: ブラウザコンソール - `webConsole.log()` + * - **WebCanvasBox**: Canvas描画 - `canvas.drawRect()` + * + * ### 🔗 通信・ネットワークBox + * - **SimpleIntentBox**: P2P通信 - `intent.send()`, `intent.on()` + * + * ## 💡 使用例 + * ```nyash + * // 基本的な使い方 + * local str, num, result + * str = "Nyash" + * num = 42 + * result = str.concat(" v") + num.toString() + * + * // GUIアプリ作成 + * local app + * app = new EguiBox() + * app.setTitle("My App") + * app.run() + * ``` + */ // Nyashは意図的にJavaScript/TypeScriptスタイルのcamelCase命名規約を採用 #![allow(non_snake_case)] diff --git a/src/boxes/null_box.rs b/src/boxes/null_box.rs index 6e757b28..3dd39b98 100644 --- a/src/boxes/null_box.rs +++ b/src/boxes/null_box.rs @@ -1,8 +1,87 @@ -/*! - * Nyash Null Box - Null value representation +/*! 🚫 NullBox - NULL値表現Box * - * null値を表現するBox型 - * Everything is Box哲学に基づくnull実装 + * ## 📝 概要 + * null/void値を表現する特別なBox。 + * JavaScript null、Python None、C# nullと同等の機能を提供。 + * NULL安全プログラミングをサポート。 + * + * ## 🛠️ 利用可能メソッド + * - `isNull()` - null判定 (常にtrue) + * - `isNotNull()` - 非null判定 (常にfalse) + * - `toString()` - 文字列変換 ("null") + * - `equals(other)` - 等価比較 (他のnullとのみtrue) + * + * ## 🛡️ 静的メソッド (null安全機能) + * - `NullBox.checkNull(value)` - 値のnull判定 + * - `NullBox.checkNotNull(value)` - 値の非null判定 + * - `NullBox.getOrDefault(value, default)` - null時デフォルト値取得 + * + * ## 💡 使用例 + * ```nyash + * local user, name, default_name + * + * // null値の作成と判定 + * user = null + * if (user == null) { + * print("User is null") + * } + * + * // null安全な値取得 + * name = getUsername() // null の可能性 + * default_name = NullBox.getOrDefault(name, "Anonymous") + * print("Hello, " + default_name) + * ``` + * + * ## 🎮 実用例 - null安全プログラミング + * ```nyash + * static box UserManager { + * init { current_user } + * + * main() { + * me.current_user = null + * + * // null安全なログイン処理 + * me.loginUser("alice") + * me.displayUserInfo() + * } + * + * loginUser(username) { + * if (username == null or username == "") { + * print("Error: Invalid username") + * return + * } + * me.current_user = new User(username) + * } + * + * displayUserInfo() { + * if (me.current_user == null) { + * print("No user logged in") + * } else { + * print("Current user: " + me.current_user.name) + * } + * } + * } + * ``` + * + * ## 🔍 デバッグ活用 + * ```nyash + * local data, result + * data = fetchDataFromAPI() // null になる可能性 + * + * // null チェック付きデバッグ + * if (NullBox.checkNull(data)) { + * print("Warning: API returned null data") + * result = NullBox.getOrDefault(data, "default_data") + * } else { + * result = data.process() + * } + * ``` + * + * ## ⚠️ 重要な特徴 + * - `null == null` は常にtrue + * - `null.toString()` は "null" + * - 全てのNullBoxインスタンスは論理的に等価 + * - メソッド呼び出し時のnullチェックでNullPointerException防止 */ use crate::box_trait::{NyashBox, StringBox, BoolBox}; diff --git a/src/boxes/random_box.rs b/src/boxes/random_box.rs index a6ae9283..90fd914b 100644 --- a/src/boxes/random_box.rs +++ b/src/boxes/random_box.rs @@ -1,8 +1,70 @@ -/*! - * Nyash Random Box - Random number generation +/*! 🎲 RandomBox - 乱数生成Box * - * 乱数生成を提供するBox型 - * Everything is Box哲学に基づく乱数ライブラリ + * ## 📝 概要 + * 高品質な乱数生成機能を提供するBox。 + * ゲーム開発、統計処理、テストデータ生成に最適。 + * + * ## 🛠️ 利用可能メソッド + * + * ### 🔢 基本乱数 + * - `random()` - 0.0~1.0の浮動小数点乱数 + * - `randInt(min, max)` - 指定範囲の整数乱数 + * - `randBool()` - true/falseのランダム選択 + * - `seed(value)` - 乱数種を設定(再現可能な乱数) + * + * ### 🎯 選択・配列操作 + * - `choice(array)` - 配列からランダム選択 + * - `shuffle(array)` - 配列をシャッフル + * + * ### 🎨 生成 + * - `randString(length)` - ランダム文字列生成 + * - `probability(prob)` - 指定確率でtrue + * + * ## 💡 使用例 + * ```nyash + * local random, result, dice, array + * random = new RandomBox() + * + * // 基本的な乱数 + * result = random.random() // 0.0~1.0 + * dice = random.randInt(1, 6) // サイコロ(1-6) + * result = random.randBool() // true or false + * + * // 配列関連 + * array = ["apple", "banana", "cherry"] + * result = random.choice(array) // ランダム選択 + * array = random.shuffle(array) // シャッフル + * + * // ゲーム用途 + * local password, critical_hit + * password = random.randString(8) // 8文字のランダム文字列 + * critical_hit = random.probability(0.1) // 10%でクリティカル + * ``` + * + * ## 🎮 実用例 + * ```nyash + * // RPGダメージ計算 + * local damage, is_critical + * damage = random.randInt(10, 20) // 基本ダメージ10-20 + * is_critical = random.probability(0.15) // 15%でクリティカル + * if (is_critical) { + * damage = damage * 2 + * } + * + * // テストデータ生成 + * local users, user_id, user_name + * users = [] + * loop(i < 10) { + * user_id = random.randInt(1000, 9999) + * user_name = "user_" + random.randString(5) + * users.push(user_name + ":" + user_id) + * } + * ``` + * + * ## ⚠️ 注意 + * - 暗号学的に安全な乱数ではない(セキュリティ用途非推奨) + * - seed()で同じ値を設定すると同じ乱数列を生成(テスト用) + * - 大きな配列のshuffleは処理時間が長い場合あり */ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, ArrayBox}; diff --git a/src/boxes/simple_intent_box.rs b/src/boxes/simple_intent_box.rs index 15948f7f..7a059bd6 100644 --- a/src/boxes/simple_intent_box.rs +++ b/src/boxes/simple_intent_box.rs @@ -1,4 +1,163 @@ -// シンプルなIntentBox - 最小限の実装 +/*! 🔗 SimpleIntentBox - P2P通信Box + * + * ## 📝 概要 + * ピア・ツー・ピア通信機能を提供する軽量実装Box。 + * ノード間のメッセージ配信、イベント通知、 + * 分散アプリケーション構築に使用。 + * + * ## 🛠️ 利用可能メソッド + * - `send(target, message)` - メッセージ送信 + * - `on(event, callback)` - イベントリスナー登録 + * - `emit(event, data)` - イベント発火 + * - `connect(nodeId)` - ノード接続 + * - `disconnect(nodeId)` - ノード切断 + * - `getConnectedNodes()` - 接続中ノード一覧 + * - `setNodeId(id)` - 自ノードID設定 + * - `broadcast(message)` - 全ノードにブロードキャスト + * + * ## 💡 使用例 + * ```nyash + * local intent + * intent = new SimpleIntentBox() + * + * // ノード設定 + * intent.setNodeId("node1") + * + * // リスナー登録 + * intent.on("message", "handleMessage") + * intent.on("join", "handleNodeJoin") + * + * // メッセージ送信 + * intent.send("node2", "Hello from node1!") + * + * // ブロードキャスト + * intent.broadcast("System announcement") + * ``` + * + * ## 🎮 実用例 - チャットアプリ + * ```nyash + * static box ChatNode { + * init { intent, username, messages } + * + * main() { + * me.intent = new SimpleIntentBox() + * me.username = "User1" + * me.messages = [] + * + * // ノード初期化 + * me.intent.setNodeId(me.username) + * me.setupEventHandlers() + * + * // チャットルームに参加 + * me.joinChatRoom() + * } + * + * setupEventHandlers() { + * // メッセージ受信 + * me.intent.on("chat_message", "onChatMessage") + * // ユーザー参加 + * me.intent.on("user_joined", "onUserJoined") + * // ユーザー退出 + * me.intent.on("user_left", "onUserLeft") + * } + * + * sendMessage(text) { + * local msg + * msg = new MapBox() + * msg.set("from", me.username) + * msg.set("text", text) + * msg.set("timestamp", new TimeBox().now()) + * + * me.intent.broadcast("chat_message", msg) + * } + * + * onChatMessage(sender, message) { + * me.messages.push(message) + * print("[" + message.get("from") + "] " + message.get("text")) + * } + * } + * ``` + * + * ## 🌐 分散計算例 + * ```nyash + * static box DistributedWorker { + * init { intent, node_id, tasks } + * + * main() { + * me.intent = new SimpleIntentBox() + * me.node_id = "worker_" + RandomBox.randInt(1000, 9999) + * me.tasks = [] + * + * me.intent.setNodeId(me.node_id) + * me.registerAsWorker() + * } + * + * registerAsWorker() { + * // タスク受信リスナー + * me.intent.on("task_assign", "processTask") + * // 結果送信完了リスナー + * me.intent.on("result_received", "onResultReceived") + * + * // ワーカー登録通知 + * me.intent.broadcast("worker_ready", me.node_id) + * } + * + * processTask(coordinator, task) { + * print("Processing task: " + task.get("id")) + * + * // 重い計算処理... + * local result + * result = heavyCalculation(task.get("data")) + * + * // 結果を送信 + * me.intent.send(coordinator, result) + * } + * } + * ``` + * + * ## 🎯 ゲーム用マルチプレイヤー + * ```nyash + * static box GameClient { + * init { intent, player_id, game_state } + * + * main() { + * me.intent = new SimpleIntentBox() + * me.player_id = "player_" + me.generateId() + * me.game_state = new MapBox() + * + * me.connectToGame() + * } + * + * connectToGame() { + * me.intent.setNodeId(me.player_id) + * + * // ゲームイベント + * me.intent.on("player_move", "onPlayerMove") + * me.intent.on("game_update", "onGameUpdate") + * me.intent.on("player_joined", "onPlayerJoined") + * + * // ゲーム参加 + * me.intent.broadcast("join_game", me.player_id) + * } + * + * movePlayer(x, y) { + * local move_data + * move_data = new MapBox() + * move_data.set("player", me.player_id) + * move_data.set("x", x) + * move_data.set("y", y) + * + * me.intent.broadcast("player_move", move_data) + * } + * } + * ``` + * + * ## ⚠️ 注意 + * - 現在は最小限実装(フル機能開発中) + * - ネットワーク通信は未実装(ローカル通信のみ) + * - メッセージ配信は同一プロセス内限定 + * - 本格P2P実装は将来バージョンで提供予定 + */ use crate::box_trait::{NyashBox, StringBox, BoolBox}; use std::any::Any; diff --git a/src/boxes/sound_box.rs b/src/boxes/sound_box.rs index ae3fb05b..8f999dc5 100644 --- a/src/boxes/sound_box.rs +++ b/src/boxes/sound_box.rs @@ -1,8 +1,141 @@ -/*! - * Nyash Sound Box - Simple sound generation +/*! 🔊 SoundBox - サウンド・音響効果Box * - * 音響効果を提供するBox型 - * Everything is Box哲学に基づく音響ライブラリ + * ## 📝 概要 + * システム音・効果音を提供するBox。 + * ゲーム効果音、通知音、アラート音の生成に使用。 + * クロスプラットフォーム対応のシンプルなサウンドシステム。 + * + * ## 🛠️ 利用可能メソッド + * - `beep()` - 基本ビープ音 + * - `beeps(count)` - 指定回数ビープ + * - `bell()` - ベル音 + * - `alarm()` - アラーム音 + * - `playTone(frequency, duration)` - 指定周波数・時間で音生成 + * - `playFile(filename)` - 音声ファイル再生 + * - `setVolume(level)` - 音量設定 (0.0-1.0) + * + * ## 💡 使用例 + * ```nyash + * local sound + * sound = new SoundBox() + * + * // 基本的な音 + * sound.beep() // シンプルビープ + * sound.beeps(3) // 3回ビープ + * sound.bell() // ベル音 + * + * // ゲーム効果音 + * sound.playTone(440, 500) // ラの音を500ms + * sound.playTone(880, 200) // 高いラの音を200ms + * ``` + * + * ## 🎮 実用例 - ゲーム効果音 + * ```nyash + * static box GameSFX { + * init { sound } + * + * main() { + * me.sound = new SoundBox() + * me.sound.setVolume(0.7) + * + * // ゲームイベント + * me.playerJump() + * me.coinCollect() + * me.gameOver() + * } + * + * playerJump() { + * // ジャンプ音:低→高 + * me.sound.playTone(220, 100) + * me.sound.playTone(440, 150) + * } + * + * coinCollect() { + * // コイン音:上昇音階 + * me.sound.playTone(523, 80) // ド + * me.sound.playTone(659, 80) // ミ + * me.sound.playTone(784, 120) // ソ + * } + * + * gameOver() { + * // ゲームオーバー音:下降 + * me.sound.playTone(440, 200) + * me.sound.playTone(392, 200) + * me.sound.playTone(349, 400) + * } + * } + * ``` + * + * ## 🚨 通知・アラート用途 + * ```nyash + * static box NotificationSystem { + * init { sound } + * + * main() { + * me.sound = new SoundBox() + * me.testNotifications() + * } + * + * info() { + * me.sound.beep() // 情報通知 + * } + * + * warning() { + * me.sound.beeps(2) // 警告 + * } + * + * error() { + * // エラー音:断続的 + * me.sound.playTone(200, 100) + * // 短い間隔 + * me.sound.playTone(200, 100) + * me.sound.playTone(200, 200) + * } + * + * success() { + * // 成功音:上昇音階 + * me.sound.playTone(523, 150) // ド + * me.sound.playTone(659, 150) // ミ + * me.sound.playTone(784, 200) // ソ + * } + * } + * ``` + * + * ## 🎵 音楽生成例 + * ```nyash + * static box MusicBox { + * init { sound, notes } + * + * main() { + * me.sound = new SoundBox() + * me.notes = new MapBox() + * me.setupNotes() + * me.playMelody() + * } + * + * setupNotes() { + * // 音階定義 + * me.notes.set("C", 261) // ド + * me.notes.set("D", 293) // レ + * me.notes.set("E", 329) // ミ + * me.notes.set("F", 349) // ファ + * me.notes.set("G", 392) // ソ + * } + * + * playNote(note, duration) { + * local freq + * freq = me.notes.get(note) + * me.sound.playTone(freq, duration) + * } + * } + * ``` + * + * ## ⚠️ 注意 + * - システムによってはビープ音が無効化されている場合あり + * - 音量設定は環境依存 + * - 長時間音生成はCPU使用率に注意 + * - ファイル再生は対応フォーマット限定 + * - Web環境では制限が多い(ユーザー操作後のみ音声再生可能) */ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox}; diff --git a/src/boxes/string_box.rs b/src/boxes/string_box.rs index 3d7c8095..83f28b13 100644 --- a/src/boxes/string_box.rs +++ b/src/boxes/string_box.rs @@ -1,4 +1,32 @@ -// StringBox implementation - String values in Nyash +/*! 🔤 StringBox - 文字列操作Box + * + * ## 📝 概要 + * UTF-8エンコード文字列を扱うためのBox。 + * JavaScript風のメソッドで直感的な文字列操作が可能。 + * + * ## 🛠️ 利用可能メソッド + * - `length()` - 文字列長を取得 + * - `concat(other)` - 文字列結合 + * - `split(separator)` - 区切り文字で分割 + * - `substring(start, end)` - 部分文字列取得 + * - `toUpperCase()` - 大文字変換 + * - `toLowerCase()` - 小文字変換 + * - `trim()` - 前後の空白除去 + * - `indexOf(search)` - 文字列検索 + * - `replace(from, to)` - 文字列置換 + * - `charAt(index)` - 指定位置の文字取得 + * + * ## 💡 使用例 + * ```nyash + * local text, parts, result + * text = "Hello, World!" + * + * print(text.length()) // 13 + * print(text.toUpperCase()) // "HELLO, WORLD!" + * parts = text.split(",") // ["Hello", " World!"] + * result = text.concat(" Nyash") // "Hello, World! Nyash" + * ``` + */ use crate::box_trait::NyashBox; use std::any::Any; use std::fmt::Display; diff --git a/src/boxes/time_box.rs b/src/boxes/time_box.rs index dd83e932..d3f620e4 100644 --- a/src/boxes/time_box.rs +++ b/src/boxes/time_box.rs @@ -1,8 +1,121 @@ -/*! - * Nyash Time Box - Time and Date operations +/*! ⏰ TimeBox - 時間・日付操作Box * - * 時間と日付操作を提供するBox型 - * Everything is Box哲学に基づく時間ライブラリ + * ## 📝 概要 + * 高精度な時間・日付操作を提供するBox。 + * JavaScript Date、Python datetime、C# DateTimeと同等機能。 + * タイムスタンプ処理、フォーマット、時差計算をサポート。 + * + * ## 🛠️ 利用可能メソッド + * + * ### 📅 基本操作 + * - `now()` - 現在日時取得 + * - `fromTimestamp(timestamp)` - UNIXタイムスタンプから日時作成 + * - `parse(date_string)` - 文字列から日時パース + * - `format(pattern)` - 指定フォーマットで文字列化 + * + * ### 🔢 値取得 + * - `year()` - 年取得 + * - `month()` - 月取得 (1-12) + * - `day()` - 日取得 (1-31) + * - `hour()` - 時取得 (0-23) + * - `minute()` - 分取得 (0-59) + * - `second()` - 秒取得 (0-59) + * - `weekday()` - 曜日取得 (0=日曜) + * + * ### ⏱️ 計算 + * - `addDays(days)` - 日数加算 + * - `addHours(hours)` - 時間加算 + * - `addMinutes(minutes)` - 分加算 + * - `diffDays(other)` - 日数差計算 + * - `diffHours(other)` - 時間差計算 + * + * ## 💡 使用例 + * ```nyash + * local time, now, birthday, age + * time = new TimeBox() + * + * // 現在日時 + * now = time.now() + * print("現在: " + now.format("yyyy/MM/dd HH:mm:ss")) + * + * // 誕生日から年齢計算 + * birthday = time.parse("1995-03-15") + * age = now.diffYears(birthday) + * print("年齢: " + age.toString() + "歳") + * + * // 1週間後 + * local next_week + * next_week = now.addDays(7) + * print("1週間後: " + next_week.format("MM月dd日")) + * ``` + * + * ## 🎮 実用例 - イベントスケジューラー + * ```nyash + * static box EventScheduler { + * init { time, events, current } + * + * main() { + * me.time = new TimeBox() + * me.events = [] + * me.current = me.time.now() + * + * // イベント追加 + * me.addEvent("会議", me.current.addHours(2)) + * me.addEvent("ランチ", me.current.addHours(5)) + * me.addEvent("プレゼン", me.current.addDays(1)) + * + * me.showUpcomingEvents() + * } + * + * addEvent(title, datetime) { + * local event + * event = new MapBox() + * event.set("title", title) + * event.set("datetime", datetime) + * event.set("timestamp", datetime.toTimestamp()) + * me.events.push(event) + * } + * + * showUpcomingEvents() { + * print("=== 今後のイベント ===") + * loop(i < me.events.length()) { + * local event, hours_until + * event = me.events.get(i) + * hours_until = event.get("datetime").diffHours(me.current) + * + * print(event.get("title") + " - " + + * hours_until.toString() + "時間後") + * } + * } + * } + * ``` + * + * ## 🕐 時間計算例 + * ```nyash + * local time, start, end, duration + * time = new TimeBox() + * + * // 作業時間計測 + * start = time.now() + * // 何か重い処理... + * heavyCalculation() + * end = time.now() + * + * duration = end.diffSeconds(start) + * print("処理時間: " + duration.toString() + "秒") + * + * // 締切まで残り時間 + * local deadline, remaining + * deadline = time.parse("2025-12-31 23:59:59") + * remaining = deadline.diffDays(time.now()) + * print("締切まで" + remaining.toString() + "日") + * ``` + * + * ## ⚠️ 注意 + * - ローカルタイムゾーンに基づく処理 + * - パース可能な日時フォーマットは限定的 + * - UNIXタイムスタンプは秒単位 + * - 夏時間切り替え時は計算に注意 */ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox}; diff --git a/src/main.rs b/src/main.rs index 02f55262..b9c7c1ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,17 +27,43 @@ use interpreter::NyashInterpreter; use std::env; use std::fs; use std::process; +use clap::{Arg, Command}; fn main() { - let args: Vec = env::args().collect(); + // 🔥 clap使ったコマンド引数解析 + let matches = Command::new("nyash") + .version("1.0") + .author("Claude Code ") + .about("🦀 Nyash Programming Language - Everything is Box in Rust! 🦀") + .arg( + Arg::new("file") + .help("Nyash file to execute") + .value_name("FILE") + .index(1) + ) + .arg( + Arg::new("debug-fuel") + .long("debug-fuel") + .value_name("ITERATIONS") + .help("Set parser debug fuel limit (default: 100000, 'unlimited' for no limit)") + .default_value("100000") + ) + .get_matches(); - if args.len() > 1 { + // デバッグ燃料の解析 + let debug_fuel = parse_debug_fuel(matches.get_one::("debug-fuel").unwrap()); + + if let Some(filename) = matches.get_one::("file") { // File mode: parse and execute the provided .nyash file - let filename = &args[1]; println!("🦀 Nyash Rust Implementation - Executing file: {} 🦀", filename); + if let Some(fuel) = debug_fuel { + println!("🔥 Debug fuel limit: {} iterations", fuel); + } else { + println!("🔥 Debug fuel limit: unlimited"); + } println!("===================================================="); - execute_nyash_file(filename); + execute_nyash_file(filename, debug_fuel); } else { // Demo mode: run built-in demonstrations println!("🦀 Nyash Rust Implementation - Everything is Box! 🦀"); @@ -69,7 +95,16 @@ fn main() { } } -fn execute_nyash_file(filename: &str) { +/// デバッグ燃料値をパース("unlimited" または数値) +fn parse_debug_fuel(value: &str) -> Option { + if value == "unlimited" { + None // 無制限 + } else { + value.parse::().ok() + } +} + +fn execute_nyash_file(filename: &str, debug_fuel: Option) { // Read the file let code = match fs::read_to_string(filename) { Ok(content) => content, @@ -85,9 +120,9 @@ fn execute_nyash_file(filename: &str) { // テスト用:即座にファイル作成 std::fs::write("/mnt/c/git/nyash/development/debug_hang_issue/test.txt", "START").ok(); - // Parse the code - eprintln!("🔍 DEBUG: Starting parse..."); - let ast = match NyashParser::parse_from_string(&code) { + // Parse the code with debug fuel limit + eprintln!("🔍 DEBUG: Starting parse with fuel: {:?}...", debug_fuel); + let ast = match NyashParser::parse_from_string_with_fuel(&code, debug_fuel) { Ok(ast) => { eprintln!("🔍 DEBUG: Parse completed, AST created"); ast diff --git a/src/parser/expressions.rs b/src/parser/expressions.rs index ef8b0fce..3ac53e8c 100644 --- a/src/parser/expressions.rs +++ b/src/parser/expressions.rs @@ -9,6 +9,38 @@ use crate::tokenizer::TokenType; use crate::ast::{ASTNode, BinaryOperator, LiteralValue, UnaryOperator, Span}; use super::{NyashParser, ParseError}; +// ===== 🔥 Debug Macros (copied from parent module) ===== + +/// Infinite loop detection macro - must be called in every loop that advances tokens +/// Prevents parser from hanging due to token consumption bugs +/// Uses parser's debug_fuel field for centralized fuel management +macro_rules! must_advance { + ($parser:expr, $fuel:expr, $location:literal) => { + // デバッグ燃料がSomeの場合のみ制限チェック + if let Some(ref mut limit) = $parser.debug_fuel { + if *limit == 0 { + eprintln!("🚨 PARSER INFINITE LOOP DETECTED at {}", $location); + eprintln!("🔍 Current token: {:?} at line {}", $parser.current_token().token_type, $parser.current_token().line); + eprintln!("🔍 Parser position: {}/{}", $parser.current, $parser.tokens.len()); + return Err(ParseError::InfiniteLoop { + location: $location.to_string(), + token: $parser.current_token().token_type.clone(), + line: $parser.current_token().line, + }); + } + *limit -= 1; + } + // None の場合は無制限なのでチェックしない + }; +} + +/// Initialize debug fuel for loop monitoring +macro_rules! debug_fuel { + () => { + 100_000 // Default: 100k iterations should be enough for any reasonable program + }; +} + impl NyashParser { /// 式をパース (演算子優先順位あり) pub(super) fn parse_expression(&mut self) -> Result { @@ -214,6 +246,8 @@ impl NyashParser { let mut arg_count = 0; while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "method call argument parsing"); + arguments.push(self.parse_expression()?); arg_count += 1; @@ -254,6 +288,8 @@ impl NyashParser { let mut arguments = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "function call argument parsing"); + arguments.push(self.parse_expression()?); if self.match_token(&TokenType::COMMA) { self.advance(); @@ -372,6 +408,8 @@ impl NyashParser { let mut arguments = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "new expression argument parsing"); + arguments.push(self.parse_expression()?); if self.match_token(&TokenType::COMMA) { self.advance(); diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 71752db0..24674958 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -22,6 +22,38 @@ use crate::ast::{ASTNode, Span}; use std::collections::HashMap; use thiserror::Error; +// ===== 🔥 Debug Macros ===== + +/// Infinite loop detection macro - must be called in every loop that advances tokens +/// Prevents parser from hanging due to token consumption bugs +/// Uses parser's debug_fuel field for centralized fuel management +macro_rules! must_advance { + ($parser:expr, $fuel:expr, $location:literal) => { + // デバッグ燃料がSomeの場合のみ制限チェック + if let Some(ref mut limit) = $parser.debug_fuel { + if *limit == 0 { + eprintln!("🚨 PARSER INFINITE LOOP DETECTED at {}", $location); + eprintln!("🔍 Current token: {:?} at line {}", $parser.current_token().token_type, $parser.current_token().line); + eprintln!("🔍 Parser position: {}/{}", $parser.current, $parser.tokens.len()); + return Err(ParseError::InfiniteLoop { + location: $location.to_string(), + token: $parser.current_token().token_type.clone(), + line: $parser.current_token().line, + }); + } + *limit -= 1; + } + // None の場合は無制限なのでチェックしない + }; +} + +/// Initialize debug fuel for loop monitoring +macro_rules! debug_fuel { + () => { + 100_000 // Default: 100k iterations should be enough for any reasonable program + }; +} + // Two-phase parser structures are no longer needed - simplified to direct parsing /// パースエラー @@ -42,6 +74,9 @@ pub enum ParseError { #[error("Circular dependency detected between static boxes: {cycle}")] CircularDependency { cycle: String }, + #[error("🚨 Infinite loop detected in parser at {location} - token: {token:?} at line {line}")] + InfiniteLoop { location: String, token: TokenType, line: usize }, + #[error("Tokenize error: {0}")] TokenizeError(#[from] TokenizeError), } @@ -52,6 +87,8 @@ pub struct NyashParser { current: usize, /// 🔥 Static box依存関係追跡(循環依存検出用) static_box_dependencies: std::collections::HashMap>, + /// 🔥 デバッグ燃料:無限ループ検出用制限値 (None = 無制限) + debug_fuel: Option, } impl NyashParser { @@ -61,15 +98,23 @@ impl NyashParser { tokens, current: 0, static_box_dependencies: std::collections::HashMap::new(), + debug_fuel: Some(100_000), // デフォルト値 } } /// 文字列からパース (トークナイズ + パース) pub fn parse_from_string(input: impl Into) -> Result { + Self::parse_from_string_with_fuel(input, Some(100_000)) + } + + /// 文字列からパース (デバッグ燃料指定版) + /// fuel: Some(n) = n回まで、None = 無制限 + pub fn parse_from_string_with_fuel(input: impl Into, fuel: Option) -> Result { let mut tokenizer = crate::tokenizer::NyashTokenizer::new(input); let tokens = tokenizer.tokenize()?; let mut parser = Self::new(tokens); + parser.debug_fuel = fuel; let result = parser.parse(); result } @@ -161,7 +206,7 @@ impl NyashParser { }; // from句のパース(継承) - let extends = if self.match_token(&TokenType::FROM) { + let extends = if self.match_token(&TokenType::COLON) { self.advance(); // consume 'from' if let TokenType::IDENTIFIER(parent_name) = &self.current_token().token_type { @@ -275,6 +320,8 @@ impl NyashParser { let mut params = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "constructor parameter parsing"); + if let TokenType::IDENTIFIER(param) = &self.current_token().token_type { params.push(param.clone()); self.advance(); @@ -315,6 +362,7 @@ impl NyashParser { let mut params = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "box method parameter parsing"); if let TokenType::IDENTIFIER(param) = &self.current_token().token_type { params.push(param.clone()); @@ -532,6 +580,8 @@ impl NyashParser { let mut params = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "function declaration parameter parsing"); + if let TokenType::IDENTIFIER(param) = &self.current_token().token_type { params.push(param.clone()); self.advance(); @@ -634,6 +684,8 @@ impl NyashParser { let mut params = Vec::new(); while !self.match_token(&TokenType::RPAREN) && !self.is_at_end() { + must_advance!(self, _unused, "static function parameter parsing"); + if let TokenType::IDENTIFIER(param) = &self.current_token().token_type { params.push(param.clone()); self.advance(); @@ -725,7 +777,7 @@ impl NyashParser { }; // from句のパース(継承)- static boxでも継承可能 - let extends = if self.match_token(&TokenType::FROM) { + let extends = if self.match_token(&TokenType::COLON) { self.advance(); // consume 'from' if let TokenType::IDENTIFIER(parent_name) = &self.current_token().token_type { diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 19a7a54d..e0c0a037 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -35,7 +35,7 @@ pub enum TokenType { NOWAIT, // nowait AWAIT, // await INTERFACE, // interface - FROM, // from (継承用) + COLON, // : (継承用) INCLUDE, // include (ファイル読み込み) TRY, // try CATCH, // catch @@ -266,6 +266,10 @@ impl NyashTokenizer { self.advance(); Ok(Token::new(TokenType::COMMA, start_line, start_column)) } + Some(':') => { + self.advance(); + Ok(Token::new(TokenType::COLON, start_line, start_column)) + } Some('\n') => { self.advance(); Ok(Token::new(TokenType::NEWLINE, start_line, start_column)) @@ -387,7 +391,6 @@ impl NyashTokenizer { "nowait" => TokenType::NOWAIT, "await" => TokenType::AWAIT, "interface" => TokenType::INTERFACE, - "from" => TokenType::FROM, "include" => TokenType::INCLUDE, "try" => TokenType::TRY, "catch" => TokenType::CATCH, diff --git a/test_args_progression.nyash b/test_args_progression.nyash deleted file mode 100644 index c1e8e230..00000000 --- a/test_args_progression.nyash +++ /dev/null @@ -1,55 +0,0 @@ -// 引数数段階テスト - 問題の境界を特定 - -print("=== Args Progression Test ===") - -box TestBox { - init { name } - - // 0引数 - method0() { - print("method0: success") - } - - // 1引数 - method1(a) { - print("method1: " + a) - } - - // 2引数 - method2(a, b) { - print("method2: " + a + ", " + b) - } - - // 3引数 - method3(a, b, c) { - print("method3: " + a + ", " + b + ", " + c) - } - - // 4引数 - method4(a, b, c, d) { - print("method4: " + a + ", " + b + ", " + c + ", " + d) - } -} - -print("Creating TestBox...") -local testBox -testBox = new TestBox() - -print("Testing 0 args...") -testBox.method0() - -print("Testing 1 arg...") -testBox.method1("arg1") - -print("Testing 2 args...") -testBox.method2("arg1", "arg2") - -print("Testing 3 args...") -testBox.method3("arg1", "arg2", "arg3") - -print("If you see this, 3 args worked!") - -print("Testing 4 args...") -testBox.method4("arg1", "arg2", "arg3", "arg4") - -print("All tests completed!") \ No newline at end of file diff --git a/test_async_demo.nyash b/test_async_demo.nyash deleted file mode 100644 index 35fe6edd..00000000 --- a/test_async_demo.nyash +++ /dev/null @@ -1,32 +0,0 @@ -# 非同期処理テスト - FutureBoxとChannelBoxのメソッド確認 - -print("=== Nyash Async Methods Test ===") - -# FutureBoxの基本テスト(簡単な例) -print("\n1. FutureBox Basic Test") - -# ChannelBoxの基本テスト -print("\n2. ChannelBox Basic Test") -try { - # ChannelBoxの作成とメソッド呼び出し - channel = new ChannelBox("TestSender", "TestReceiver") - - # sendMessageメソッドテスト - message = channel.sendMessage("Hello Async World!") - print("Sent message: " + message.toString()) - - # announceメソッドテスト - broadcast = channel.announce("Broadcasting test message") - print("Broadcast: " + broadcast) - - # sender/receiverメソッドテスト - sender_info = channel.sender() - print("Sender info: " + sender_info.toString()) - - print("\n✅ ChannelBox methods work correctly!") - -} catch (error) { - print("⚠️ ChannelBox test failed: " + error.toString()) -} - -print("\n=== Async Methods Test Completed ===") \ No newline at end of file diff --git a/test_basic_print.nyash b/test_basic_print.nyash deleted file mode 100644 index 702f509b..00000000 --- a/test_basic_print.nyash +++ /dev/null @@ -1,5 +0,0 @@ -// 最も基本的なテスト - -print("Hello!") -print("1 + 1 = " + (1 + 1)) -print("Done!") \ No newline at end of file diff --git a/test_box_method_call.nyash b/test_box_method_call.nyash deleted file mode 100644 index fb291591..00000000 --- a/test_box_method_call.nyash +++ /dev/null @@ -1,49 +0,0 @@ -// Box間メソッド呼び出しテスト - -print("=== Box Method Call Test ===") - -// 受信側Box -box Receiver { - init { name } - - setName(n) { - me.name = n - print("Receiver name set to: " + n) - } - - receive(message) { - print("Receiver got message: " + message) - } -} - -// 送信側Box -box Sender { - init { receiver } - - setReceiver(r) { - me.receiver = r - print("Sender connected to receiver") - } - - send(message) { - print("Sender about to send: " + message) - me.receiver.receive(message) - print("Sender finished sending") - } -} - -// テスト -print("Creating receiver...") -local receiver -receiver = new Receiver() -receiver.setName("TestReceiver") - -print("Creating sender...") -local sender -sender = new Sender() -sender.setReceiver(receiver) - -print("Sending message...") -sender.send("Hello World!") - -print("Test completed!") \ No newline at end of file diff --git a/test_complex_hang.nyash b/test_complex_hang.nyash deleted file mode 100644 index 3525a81e..00000000 --- a/test_complex_hang.nyash +++ /dev/null @@ -1,49 +0,0 @@ -// Complex hang test case - cross-object method calls - -print("=== Complex Hang Test ===") - -box MessageHub { - init { handlers } - - setup() { - print("MessageHub setup start") - me.handlers = new MapBox() - print("MessageHub setup complete") - } - - deliver(messageType, data, from) { - print("Message: " + from + " -> " + messageType + " = " + data) - } -} - -box PeerNode { - init { nodeId, messageHub } - - setup(hub) { - print("PeerNode setup start") - me.nodeId = "Node123" - me.messageHub = hub - print("PeerNode setup complete") - } - - send(recipient, message) { - print("Sending message via hub...") - // This could cause the hang - complex field access in method call - me.messageHub.deliver("message", message, me.nodeId) - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() -hub.setup() - -print("Creating PeerNode...") -local node -node = new PeerNode() -node.setup(hub) - -print("Testing cross-object method call...") -node.send("alice", "Hello!") - -print("Complex test completed!") \ No newline at end of file diff --git a/test_cross_box_args.nyash b/test_cross_box_args.nyash deleted file mode 100644 index 585b351b..00000000 --- a/test_cross_box_args.nyash +++ /dev/null @@ -1,81 +0,0 @@ -// Box間3引数メソッド呼び出しテスト - -print("=== Cross Box Args Test ===") - -// TargetBox - メソッドを提供する側 -box TargetBox { - init { name } - - process2(a, b) { - print("TargetBox.process2: " + a + ", " + b) - } - - process3(a, b, c) { - print("TargetBox.process3: " + a + ", " + b + ", " + c) - } - - process4(a, b, c, d) { - print("TargetBox.process4: " + a + ", " + b + ", " + c + ", " + d) - } -} - -// CallerBox - メソッドを呼び出す側 -box CallerBox { - init { target, myField } - - setup(targetRef) { - me.target = targetRef - me.myField = "myValue" - print("CallerBox setup completed") - } - - call2() { - print("Calling 2-arg method...") - me.target.process2("arg1", "arg2") - print("2-arg call completed") - } - - call3() { - print("Calling 3-arg method...") - me.target.process3("arg1", "arg2", "arg3") - print("3-arg call completed") - } - - call3WithField() { - print("Calling 3-arg method with field...") - me.target.process3("arg1", "arg2", me.myField) - print("3-arg with field completed") - } - - call4() { - print("Calling 4-arg method...") - me.target.process4("arg1", "arg2", "arg3", "arg4") - print("4-arg call completed") - } -} - -// テスト -print("Creating TargetBox...") -local target -target = new TargetBox() - -print("Creating CallerBox...") -local caller -caller = new CallerBox() -caller.setup(target) - -print("Testing 2-arg cross-box call...") -caller.call2() - -print("Testing 3-arg cross-box call...") -caller.call3() - -print("If you see this, 3-arg cross-box worked!") - -print("Testing 3-arg with field...") -caller.call3WithField() - -print("Testing 4-arg cross-box call...") -caller.call4() - -print("All cross-box tests completed!") \ No newline at end of file diff --git a/test_cross_mapbox_reference.nyash b/test_cross_mapbox_reference.nyash deleted file mode 100644 index 1885b896..00000000 --- a/test_cross_mapbox_reference.nyash +++ /dev/null @@ -1,54 +0,0 @@ -// MapBox間Box参照3引数テスト - -print("=== Cross MapBox Reference Test ===") - -// TargetBox - MapBoxを持つ受信側 -box TargetBox { - init { handlers } - - setup() { - print("TargetBox setup start") - me.handlers = new MapBox() - print("TargetBox setup complete with MapBox") - } - - deliver(messageType, data, from) { - print("deliver: " + from + " -> " + messageType + " = " + data) - } -} - -// CallerBox - MapBoxを持つ送信側 -box CallerBox { - init { target, nodeId, myData } - - setup(targetRef) { - print("CallerBox setup start") - me.target = targetRef - me.nodeId = "TestNode" - me.myData = new MapBox() // CallerBoxもMapBoxを持つ - print("CallerBox setup complete with MapBox") - } - - testCall() { - print("About to call 3-arg method across MapBox-containing Boxes...") - me.target.deliver("hello", "data", me.nodeId) - print("Cross MapBox 3-arg call completed") - } -} - -print("Creating TargetBox with MapBox...") -local target -target = new TargetBox() -target.setup() - -print("Creating CallerBox with MapBox...") -local caller -caller = new CallerBox() -caller.setup(target) - -print("Executing cross-MapBox 3-arg call...") -caller.testCall() - -print("If you see this, cross-MapBox worked!") - -print("All cross-MapBox reference tests completed!") \ No newline at end of file diff --git a/test_cross_mapbox_simple.nyash b/test_cross_mapbox_simple.nyash deleted file mode 100644 index dbda1b31..00000000 --- a/test_cross_mapbox_simple.nyash +++ /dev/null @@ -1,48 +0,0 @@ -// より簡単なクロスMapBoxテスト - -print("=== Simple Cross MapBox Test ===") - -// まず2つのBoxを作るが、MapBoxは1つずつ -box BoxA { - init { data } - - setup() { - print("BoxA setup start") - me.data = new MapBox() - print("BoxA setup complete with MapBox") - } - - callOther(other, message) { - print("BoxA calling other with: " + message) - other.receive(message) - } -} - -box BoxB { - init { otherBox } - - setup(otherRef) { - print("BoxB setup start") - me.otherBox = otherRef - print("BoxB setup complete") - } - - receive(message) { - print("BoxB received: " + message) - } -} - -print("Creating BoxA with MapBox...") -local boxA -boxA = new BoxA() -boxA.setup() - -print("Creating BoxB without MapBox...") -local boxB -boxB = new BoxB() -boxB.setup(boxA) - -print("Testing cross-box call (2 args)...") -boxA.callOther(boxB, "Hello") - -print("Simple cross-MapBox test completed!") \ No newline at end of file diff --git a/test_debug_constructor.nyash b/test_debug_constructor.nyash deleted file mode 100644 index d1531675..00000000 --- a/test_debug_constructor.nyash +++ /dev/null @@ -1,35 +0,0 @@ -// コンストラクタのデバッグテスト - -print("=== Constructor Debug Test ===") - -// Step 1: 最もシンプルなBox -box SimpleBox { - init { } - - constructor() { - print("SimpleBox constructor called") - } -} - -print("Creating SimpleBox...") -local s -s = new SimpleBox() -print("SimpleBox created!") - -// Step 2: フィールドを持つBox -box BoxWithField { - init { value } - - constructor() { - print("BoxWithField constructor called") - me.value = 42 - print("Field set to 42") - } -} - -print("\nCreating BoxWithField...") -local b -b = new BoxWithField() -print("BoxWithField created!") - -print("\nAll tests completed!") \ No newline at end of file diff --git a/test_debug_hang.nyash b/test_debug_hang.nyash deleted file mode 100644 index 0d99edcd..00000000 --- a/test_debug_hang.nyash +++ /dev/null @@ -1,34 +0,0 @@ -// Debug hang test case - minimal reproduction - -print("=== Debug Hang Test ===") - -box TestBox { - init { mapField, simpleField } - - setup() { - print("Step 1: Setting up TestBox") - me.mapField = new MapBox() - me.simpleField = "test_value" - print("Step 2: TestBox setup complete") - } - - methodWith3Args(arg1, arg2, arg3) { - print("methodWith3Args called with: " + arg1 + ", " + arg2 + ", " + arg3) - } -} - -print("Step 3: Creating TestBox instance") -local testObj -testObj = new TestBox() - -print("Step 4: Running setup") -testObj.setup() - -print("Step 5: Testing 3-arg method with literals") -testObj.methodWith3Args("a", "b", "c") - -print("Step 6: Testing 3-arg method with field access") -print("About to call method with field access...") -testObj.methodWith3Args("a", "b", testObj.simpleField) - -print("Step 7: All tests completed successfully!") \ No newline at end of file diff --git a/test_direct_mapbox_call.nyash b/test_direct_mapbox_call.nyash deleted file mode 100644 index b645f2fb..00000000 --- a/test_direct_mapbox_call.nyash +++ /dev/null @@ -1,62 +0,0 @@ -// 直接MapBoxメソッド呼び出しテスト - -print("=== Direct MapBox Call Test ===") - -// Step 1: MapBox直接作成・使用 -print("Step 1: Direct MapBox usage") -local map -map = new MapBox() -print("MapBox created") - -map.set("key1", "value1") -print("MapBox.set() completed") - -local result -result = map.get("key1") -print("MapBox.get() result: " + result) - -// Step 2: MapBoxを持つBox作成(3引数なし) -print("Step 2: Box with MapBox (no 3-arg calls)") -box SimpleBox { - init { data } - - setup() { - print("SimpleBox setup start") - me.data = new MapBox() - print("SimpleBox setup complete") - } - - twoArgMethod(a, b) { - print("twoArgMethod: " + a + ", " + b) - } -} - -local box1 -box1 = new SimpleBox() -box1.setup() -box1.twoArgMethod("arg1", "arg2") - -// Step 3: MapBoxを持つBoxで3引数メソッド呼び出し -print("Step 3: Box with MapBox (3-arg call)") -box TestBox { - init { data } - - setup() { - print("TestBox setup start") - me.data = new MapBox() - print("TestBox setup complete") - } - - threeArgMethod(a, b, c) { - print("threeArgMethod: " + a + ", " + b + ", " + c) - } -} - -local box2 -box2 = new TestBox() -box2.setup() - -print("About to call 3-arg method on Box with MapBox...") -box2.threeArgMethod("arg1", "arg2", "arg3") - -print("All direct MapBox tests completed!") \ No newline at end of file diff --git a/test_double_mapbox.nyash b/test_double_mapbox.nyash deleted file mode 100644 index d9a2c4ff..00000000 --- a/test_double_mapbox.nyash +++ /dev/null @@ -1,48 +0,0 @@ -// 両方のBoxがMapBoxを持つケース - -print("=== Double MapBox Test ===") - -box BoxA { - init { data, message } - - setup() { - print("BoxA setup start") - me.data = new MapBox() - me.message = "Hello from A" - print("BoxA setup complete with MapBox") - } - - callOther(other) { - print("BoxA calling other...") - other.receive(me.message) // フィールドアクセス含む - } -} - -box BoxB { - init { storage } - - setup() { - print("BoxB setup start") - me.storage = new MapBox() // こちらもMapBox - print("BoxB setup complete with MapBox") - } - - receive(message) { - print("BoxB received: " + message) - } -} - -print("Creating BoxA with MapBox...") -local boxA -boxA = new BoxA() -boxA.setup() - -print("Creating BoxB with MapBox...") -local boxB -boxB = new BoxB() -boxB.setup() - -print("Testing cross-box call (both have MapBox)...") -boxA.callOther(boxB) - -print("Double MapBox test completed!") \ No newline at end of file diff --git a/test_double_mapbox_3args.nyash b/test_double_mapbox_3args.nyash deleted file mode 100644 index 75ce9723..00000000 --- a/test_double_mapbox_3args.nyash +++ /dev/null @@ -1,48 +0,0 @@ -// 両方のBoxがMapBoxを持ち3引数テスト - -print("=== Double MapBox 3-Args Test ===") - -box BoxA { - init { data, nodeId } - - setup() { - print("BoxA setup start") - me.data = new MapBox() - me.nodeId = "NodeA" - print("BoxA setup complete with MapBox") - } - - callOther(other) { - print("BoxA calling other with 3 args...") - other.receive("message", "data", me.nodeId) // 3引数 + フィールドアクセス - } -} - -box BoxB { - init { storage } - - setup() { - print("BoxB setup start") - me.storage = new MapBox() // こちらもMapBox - print("BoxB setup complete with MapBox") - } - - receive(type, data, from) { - print("BoxB received: " + from + " -> " + type + " = " + data) - } -} - -print("Creating BoxA with MapBox...") -local boxA -boxA = new BoxA() -boxA.setup() - -print("Creating BoxB with MapBox...") -local boxB -boxB = new BoxB() -boxB.setup() - -print("Testing 3-arg cross-box call (both have MapBox)...") -boxA.callOther(boxB) - -print("Double MapBox 3-arg test completed!") \ No newline at end of file diff --git a/test_field_access_args.nyash b/test_field_access_args.nyash deleted file mode 100644 index cd65aff3..00000000 --- a/test_field_access_args.nyash +++ /dev/null @@ -1,37 +0,0 @@ -// フィールドアクセス付き引数テスト - -print("=== Field Access Args Test ===") - -box TestBox { - init { field1, field2, field3 } - - setup() { - me.field1 = "value1" - me.field2 = "value2" - me.field3 = "value3" - print("Setup completed") - } - - process(a, b, c) { - print("process: " + a + ", " + b + ", " + c) - } -} - -print("Creating TestBox...") -local testBox -testBox = new TestBox() -testBox.setup() - -print("Testing with literals...") -testBox.process("lit1", "lit2", "lit3") - -print("Testing with 1 field access...") -testBox.process(testBox.field1, "lit2", "lit3") - -print("Testing with 2 field accesses...") -testBox.process(testBox.field1, testBox.field2, "lit3") - -print("Testing with 3 field accesses...") -testBox.process(testBox.field1, testBox.field2, testBox.field3) - -print("All field access tests completed!") \ No newline at end of file diff --git a/test_field_access_mapbox.nyash b/test_field_access_mapbox.nyash deleted file mode 100644 index 39c46c03..00000000 --- a/test_field_access_mapbox.nyash +++ /dev/null @@ -1,34 +0,0 @@ -// MapBox + フィールドアクセス3引数テスト - -print("=== MapBox + Field Access Test ===") - -box TestBox { - init { data, myField } - - setup() { - print("TestBox setup start") - me.data = new MapBox() - me.myField = "field_value" - print("TestBox setup complete with MapBox") - } - - threeArgMethod(a, b, c) { - print("threeArgMethod: " + a + ", " + b + ", " + c) - } -} - -print("Creating TestBox...") -local testBox -testBox = new TestBox() -testBox.setup() - -print("Test 1: All literals (should work)") -testBox.threeArgMethod("arg1", "arg2", "arg3") - -print("Test 2: One field access (potential issue)") -print("About to call with field access...") -testBox.threeArgMethod("arg1", "arg2", testBox.myField) - -print("If you see this, field access worked!") - -print("All MapBox field access tests completed!") \ No newline at end of file diff --git a/test_field_in_args.nyash b/test_field_in_args.nyash deleted file mode 100644 index 3970bc53..00000000 --- a/test_field_in_args.nyash +++ /dev/null @@ -1,68 +0,0 @@ -// フィールドを引数に含む3引数呼び出しテスト - -print("=== Field In Args Test ===") - -box TargetBox { - init { name } - - process3(a, b, c) { - print("process3: " + a + ", " + b + ", " + c) - } -} - -box CallerBox { - init { target, field1, field2, field3 } - - setup(targetRef) { - me.target = targetRef - me.field1 = "field_value_1" - me.field2 = "field_value_2" - me.field3 = "field_value_3" - print("CallerBox setup completed") - } - - test1_AllLiterals() { - print("Test 1: All literals...") - me.target.process3("lit1", "lit2", "lit3") - print("Test 1 completed") - } - - test2_OneField() { - print("Test 2: One field (3rd position)...") - me.target.process3("lit1", "lit2", me.field3) - print("Test 2 completed") - } - - test3_TwoFields() { - print("Test 3: Two fields...") - me.target.process3("lit1", me.field2, me.field3) - print("Test 3 completed") - } - - test4_ThreeFields() { - print("Test 4: All fields...") - me.target.process3(me.field1, me.field2, me.field3) - print("Test 4 completed") - } -} - -// テスト実行 -print("Creating boxes...") -local target -target = new TargetBox() - -local caller -caller = new CallerBox() -caller.setup(target) - -print("Starting tests...") - -caller.test1_AllLiterals() -caller.test2_OneField() - -print("If you see this, one field worked!") - -caller.test3_TwoFields() -caller.test4_ThreeFields() - -print("All field tests completed!") \ No newline at end of file diff --git a/test_field_names.nyash b/test_field_names.nyash deleted file mode 100644 index 0c4c2011..00000000 --- a/test_field_names.nyash +++ /dev/null @@ -1,68 +0,0 @@ -// 特定のフィールド名テスト - -print("=== Field Names Test ===") - -box TargetBox { - init { name } - - deliver(a, b, c) { - print("deliver: " + a + ", " + b + ", " + c) - } -} - -// Test 1: 正常動作したフィールド名を使用 -box GoodBox { - init { target, field1 } - - setup(targetRef) { - me.target = targetRef - me.field1 = "TestValue" - print("GoodBox setup completed") - } - - test() { - print("GoodBox: Using target and field1...") - me.target.deliver("hello", "data", me.field1) - print("GoodBox test completed") - } -} - -// Test 2: ハングしたフィールド名を使用 -box BadBox { - init { messageHub, nodeId } - - setup(targetRef) { - me.messageHub = targetRef - me.nodeId = "TestValue" - print("BadBox setup completed") - } - - test() { - print("BadBox: Using messageHub and nodeId...") - me.messageHub.deliver("hello", "data", me.nodeId) - print("BadBox test completed") - } -} - -// テスト実行 -print("Creating target...") -local target -target = new TargetBox() - -print("Testing with good field names...") -local goodBox -goodBox = new GoodBox() -goodBox.setup(target) -goodBox.test() - -print("Good field names worked!") - -print("Testing with bad field names...") -local badBox -badBox = new BadBox() -badBox.setup(target) -badBox.test() - -print("If you see this, bad field names also worked!") - -print("All field name tests completed!") \ No newline at end of file diff --git a/test_gradual_change.nyash b/test_gradual_change.nyash deleted file mode 100644 index 4defc846..00000000 --- a/test_gradual_change.nyash +++ /dev/null @@ -1,39 +0,0 @@ -// 段階的変更テスト - 動作版をP2P構造に近づける - -print("=== Gradual Change Test ===") - -// Hub → MessageHub に名前変更 -box MessageHub { - init { name } - - process(messageType, data, from) { - print("MessageHub.process(): " + from + " -> " + messageType + " = " + data) - } -} - -// Node → PeerNode に名前変更、フィールド名変更 -box PeerNode { - init { nodeId, messageHub } - - connect(nodeId, hubRef) { - me.nodeId = nodeId - me.messageHub = hubRef - print("PeerNode connected: " + nodeId) - } - - send(messageType, data) { - print("PeerNode.send(): " + me.nodeId + " sending " + messageType) - me.messageHub.process(messageType, data, me.nodeId) - } -} - -print("Test starting...") -local hub -hub = new MessageHub() - -local alice -alice = new PeerNode() -alice.connect("Alice", hub) - -alice.send("hello", "Hi there!") -print("Test completed!") \ No newline at end of file diff --git a/test_local_variables.nyash b/test_local_variables.nyash deleted file mode 100644 index 69c0a1f1..00000000 --- a/test_local_variables.nyash +++ /dev/null @@ -1,25 +0,0 @@ -// 🔥 Local変数テスト - 厳密性の実証 - -static box Main { - init { - console, finalResult - } - - main() { - me.console = new ConsoleBox() - me.console.log("🔥 Testing local variables!") - - // ✅ local変数の正しい使用 - local x, y, result - x = 42 - y = 58 - result = x + y - me.console.log("Local calculation: " + result) - - // ✅ local変数からフィールドへの代入 - me.finalResult = result - me.console.log("Final result: " + me.finalResult) - - return "Local variables work perfectly!" - } -} \ No newline at end of file diff --git a/test_mapbox.nyash b/test_mapbox.nyash deleted file mode 100644 index ec7c84d8..00000000 --- a/test_mapbox.nyash +++ /dev/null @@ -1,23 +0,0 @@ -// MapBoxが正しく動作するかテスト - -print("=== MapBox Test ===") - -local map -map = new MapBox() - -// 値を設定 -map.set("name", "Alice") -map.set("age", 25) - -// 値を取得 -print("Name: " + map.get("name")) -print("Age: " + map.get("age")) - -// 存在しないキー -local value -value = map.get("unknown") -if (value == null) { - print("Unknown key returns null: OK") -} - -print("Done!") \ No newline at end of file diff --git a/test_mapbox_combination.nyash b/test_mapbox_combination.nyash deleted file mode 100644 index 3dd76afd..00000000 --- a/test_mapbox_combination.nyash +++ /dev/null @@ -1,69 +0,0 @@ -// MapBox + 3引数組み合わせテスト - -print("=== MapBox Combination Test ===") - -box TargetBox { - init { handlers } - - // MapBoxなしのsetup - setup1() { - print("Setup without MapBox") - } - - // MapBoxありのsetup - setup2() { - print("Setup with MapBox...") - me.handlers = new MapBox() - print("MapBox created successfully") - } - - deliver(messageType, data, from) { - print("deliver: " + from + " -> " + messageType + " = " + data) - } -} - -box CallerBox { - init { target, nodeId } - - setup(targetRef) { - me.target = targetRef - me.nodeId = "TestNode" - print("CallerBox setup completed") - } - - testCall() { - print("About to call 3-arg method...") - me.target.deliver("hello", "data", me.nodeId) - print("3-arg call completed") - } -} - -// Test 1: MapBoxなし -print("Test 1: Without MapBox...") -local target1 -target1 = new TargetBox() -target1.setup1() - -local caller1 -caller1 = new CallerBox() -caller1.setup(target1) -caller1.testCall() - -print("Without MapBox: SUCCESS") - -// Test 2: MapBoxあり -print("Test 2: With MapBox...") -local target2 -target2 = new TargetBox() -target2.setup2() - -print("MapBox setup completed, now testing 3-arg call...") - -local caller2 -caller2 = new CallerBox() -caller2.setup(target2) -caller2.testCall() - -print("If you see this, MapBox + 3-arg worked!") - -print("All MapBox combination tests completed!") \ No newline at end of file diff --git a/test_mapbox_in_constructor.nyash b/test_mapbox_in_constructor.nyash deleted file mode 100644 index fcb41989..00000000 --- a/test_mapbox_in_constructor.nyash +++ /dev/null @@ -1,21 +0,0 @@ -// コンストラクタ内でMapBox作成のテスト - -print("=== MapBox in Constructor Test ===") - -// Step 1: コンストラクタでMapBox作成 -box BoxWithMap { - init { data } - - constructor() { - print("Before creating MapBox") - me.data = new MapBox() - print("After creating MapBox") - } - - test() { - print("Test method called") - } -} - -print("About to create BoxWithMap...") -local box1 \ No newline at end of file diff --git a/test_mapbox_step_by_step.nyash b/test_mapbox_step_by_step.nyash deleted file mode 100644 index 34ecb0d9..00000000 --- a/test_mapbox_step_by_step.nyash +++ /dev/null @@ -1,28 +0,0 @@ -// 段階的にテスト - -print("=== Step by Step Test ===") - -// Step 1: 直接MapBox使用 -print("Step 1: Direct MapBox") -local map1 -map1 = new MapBox() -print("Direct MapBox created!") - -// Step 2: コンストラクタでMapBox -print("Step 2: MapBox in constructor") -box TestBox { - init { data } - - constructor() { - print("Constructor starts") - me.data = new MapBox() - print("Constructor ends") - } -} - -print("About to create TestBox...") -local box1 -box1 = new TestBox() -print("TestBox created!") - -print("All done!") \ No newline at end of file diff --git a/test_me_workaround.nyash b/test_me_workaround.nyash deleted file mode 100644 index b652e2cf..00000000 --- a/test_me_workaround.nyash +++ /dev/null @@ -1,70 +0,0 @@ -// me回避策テスト - -print("=== Me Workaround Test ===") - -box TargetBox { - init { name } - - deliver(messageType, data, from) { - print("deliver: " + from + " -> " + messageType + " = " + data) - } -} - -box CallerBox { - init { target, nodeId } - - setup(targetRef) { - me.target = targetRef - me.nodeId = "TestNode" - print("CallerBox setup completed") - } - - getNodeId() { - return me.nodeId - } - - // 方法1: me.nodeIdを直接使用(元の問題のある方法) - testDirect() { - print("Test 1: Direct me.nodeId usage...") - me.target.deliver("hello", "data1", me.nodeId) - print("Direct test completed") - } - - // 方法2: local変数経由 - testViaLocal() { - print("Test 2: Via local variable...") - local nodeIdCopy - nodeIdCopy = me.nodeId - me.target.deliver("hello", "data2", nodeIdCopy) - print("Local variable test completed") - } - - // 方法3: getterメソッド経由 - testViaGetter() { - print("Test 3: Via getter method...") - me.target.deliver("hello", "data3", me.getNodeId()) - print("Getter method test completed") - } -} - -// テスト実行 -print("Creating boxes...") -local target -target = new TargetBox() - -local caller -caller = new CallerBox() -caller.setup(target) - -print("Testing via local variable...") -caller.testViaLocal() - -print("Testing via getter method...") -caller.testViaGetter() - -print("Testing direct me access...") -caller.testDirect() - -print("If you see this, direct me access worked!") - -print("All me workaround tests completed!") \ No newline at end of file diff --git a/test_messagehub_only.nyash b/test_messagehub_only.nyash deleted file mode 100644 index 49ad4eb7..00000000 --- a/test_messagehub_only.nyash +++ /dev/null @@ -1,18 +0,0 @@ -// MessageHub単体テスト - -print("=== MessageHub Only Test ===") - -box MessageHub { - init { name } - - hello() { - print("MessageHub says hello") - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() -print("Calling hello...") -hub.hello() -print("Test completed!") \ No newline at end of file diff --git a/test_minimal_box.nyash b/test_minimal_box.nyash deleted file mode 100644 index dd4ecf65..00000000 --- a/test_minimal_box.nyash +++ /dev/null @@ -1,45 +0,0 @@ -// 最小限のBoxテスト - -print("=== Minimal Box Test ===") - -// Step 1: フィールドなしBox -box EmptyBox { - init { } - - hello() { - print("Hello from EmptyBox") - } -} - -print("Creating EmptyBox...") -local e -e = new EmptyBox() -print("Calling hello...") -e.hello() -print("EmptyBox test done") - -// Step 2: フィールドありBox -box BoxWithField { - init { value } - - setValue(v) { - me.value = v - print("Value set to: " + v) - } - - getValue() { - return me.value - } -} - -print("\nCreating BoxWithField...") -local b -b = new BoxWithField() -print("Setting value...") -b.setValue("test") -print("Getting value...") -local result -result = b.getValue() -print("Result: " + result) - -print("\nAll tests completed!") \ No newline at end of file diff --git a/test_no_mapbox_cross_3args.nyash b/test_no_mapbox_cross_3args.nyash deleted file mode 100644 index 78764b91..00000000 --- a/test_no_mapbox_cross_3args.nyash +++ /dev/null @@ -1,47 +0,0 @@ -// MapBoxなしCross-Box 3引数テスト - -print("=== No MapBox Cross-Box 3-Args Test ===") - -box BoxA { - init { nodeId } - - setup() { - print("BoxA setup start") - me.nodeId = "NodeA" // MapBoxなし - print("BoxA setup complete (no MapBox)") - } - - callOther(other) { - print("BoxA calling other with 3 args (no MapBox)...") - other.receive("message", "data", me.nodeId) // 3引数 + フィールドアクセス - } -} - -box BoxB { - init { result } - - setup() { - print("BoxB setup start") - me.result = "initialized" // MapBoxなし - print("BoxB setup complete (no MapBox)") - } - - receive(type, data, from) { - print("BoxB received: " + from + " -> " + type + " = " + data) - } -} - -print("Creating BoxA (no MapBox)...") -local boxA -boxA = new BoxA() -boxA.setup() - -print("Creating BoxB (no MapBox)...") -local boxB -boxB = new BoxB() -boxB.setup() - -print("Testing 3-arg cross-box call (no MapBox)...") -boxA.callOther(boxB) - -print("No MapBox cross-box 3-arg test completed!") \ No newline at end of file diff --git a/test_one_way_reference.nyash b/test_one_way_reference.nyash deleted file mode 100644 index 64e439cb..00000000 --- a/test_one_way_reference.nyash +++ /dev/null @@ -1,42 +0,0 @@ -// 一方向参照テスト - -print("=== One Way Reference Test ===") - -// Hub側 -box MessageHub { - init { name } - - process(data) { - print("MessageHub processing: " + data) - } -} - -// Node側 - Hubを参照 -box PeerNode { - init { nodeId, hub } - - setup(id, hubRef) { - me.nodeId = id - me.hub = hubRef - print("PeerNode setup: " + id) - } - - send(data) { - print("PeerNode sending: " + data) - me.hub.process(data) - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() - -print("Creating PeerNode...") -local node -node = new PeerNode() -node.setup("TestNode", hub) - -print("Sending data...") -node.send("test data") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_concept.nyash b/test_p2p_concept.nyash deleted file mode 100644 index 630f168d..00000000 --- a/test_p2p_concept.nyash +++ /dev/null @@ -1,43 +0,0 @@ -// P2PBoxの概念実証 - 純粋なNyashコードのみ - -// シンプルなメッセージ配信 -box MessageBus { - init { handlers } - - constructor() { - me.handlers = new MapBox() - } - - // メッセージ送信(登録されたハンドラーに配信) - send(type, data, from) { - local list - list = me.handlers.get(type) - - if (list != null) { - // とりあえずprintで確認 - print(from + " -> " + type + ": " + data) - } - } - - // ハンドラー登録(今は登録だけ) - on(type, nodeId) { - me.handlers.set(type, nodeId) - print("Registered: " + nodeId + " listens to " + type) - } -} - -// テスト実行 -print("=== Message Bus Test ===") - -local bus -bus = new MessageBus() - -// 登録 -bus.on("hello", "Bob") -bus.on("bye", "Alice") - -// 送信 -bus.send("hello", "Hi there!", "Alice") -bus.send("bye", "See you!", "Bob") - -print("Done!") \ No newline at end of file diff --git a/test_p2p_debug.nyash b/test_p2p_debug.nyash deleted file mode 100644 index dca44462..00000000 --- a/test_p2p_debug.nyash +++ /dev/null @@ -1,67 +0,0 @@ -// P2Pテスト - デバッグ版 - -print("=== P2P Debug Test ===") - -// IntentBox -box IntentBox { - init { handlers } - - setup() { - print("IntentBox.setup() ENTER") - me.handlers = new MapBox() - print("IntentBox.setup() EXIT") - } - - deliver(messageType, data, from) { - print("IntentBox.deliver() ENTER - args: " + messageType + ", " + data + ", " + from) - print("Message: " + from + " -> " + messageType + " = " + data) - print("IntentBox.deliver() EXIT") - } -} - -// P2PBox -box P2PBox { - init { nodeId, intentBox } - - setup(nodeId, intentBox) { - print("P2PBox.setup() ENTER - nodeId: " + nodeId) - me.nodeId = nodeId - me.intentBox = intentBox - print("P2PBox.setup() EXIT for " + nodeId) - } - - send(messageType, data) { - print("P2PBox.send() ENTER - node: " + me.nodeId + ", type: " + messageType + ", data: " + data) - print("About to call intentBox.deliver...") - me.intentBox.deliver(messageType, data, me.nodeId) - print("P2PBox.send() EXIT") - } -} - -// テスト開始 -print("Creating IntentBox...") -local bus -bus = new IntentBox() -print("Calling bus.setup()...") -bus.setup() -print("IntentBox ready!") - -print("Creating Alice...") -local alice -alice = new P2PBox() -print("Calling alice.setup()...") -alice.setup("Alice", bus) -print("Alice ready!") - -print("Creating Bob...") -local bob -bob = new P2PBox() -print("Calling bob.setup()...") -bob.setup("Bob", bus) -print("Bob ready!") - -print("Alice sending message...") -alice.send("hello", "Hi there!") -print("Alice message sent!") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_elements.nyash b/test_p2p_elements.nyash deleted file mode 100644 index dcb9ff07..00000000 --- a/test_p2p_elements.nyash +++ /dev/null @@ -1,51 +0,0 @@ -// P2Pの要素を段階的にテスト - -print("=== P2P Elements Test ===") - -// Element 1: MapBox操作 -print("Test 1: MapBox operations") -local map -map = new MapBox() -map.set("hello", "Alice") -local value -value = map.get("hello") -print("Got value: " + value) - -// Element 2: 存在しないキーのアクセス -print("Test 2: Non-existent key") -local missing -missing = map.get("nonexistent") -print("Missing value is: " + missing) - -// Element 3: if文での比較 -print("Test 3: If comparison") -if (missing == "something") { - print("This should not print") -} else { - print("Else branch worked") -} - -// Element 4: Box間の相互参照 -print("Test 4: Box references") -box SimpleNode { - init { name, messageBox } - - setName(n) { - me.name = n - } - - setMessageBox(m) { - me.messageBox = m - } - - sendTo(type, data) { - print("Sending: " + type + " = " + data) - } -} - -local node -node = new SimpleNode() -node.setName("TestNode") -node.sendTo("test", "data") - -print("All elements test completed!") \ No newline at end of file diff --git a/test_p2p_exact_reproduction.nyash b/test_p2p_exact_reproduction.nyash deleted file mode 100644 index cf6e9e21..00000000 --- a/test_p2p_exact_reproduction.nyash +++ /dev/null @@ -1,50 +0,0 @@ -// P2P完全再現テスト - 段階的 - -print("=== P2P Exact Reproduction Test ===") - -// Step 1: 元の構造を完全再現(ただし`setup`メソッドあり) -box MessageHub { - init { handlers } - - setup() { - print("MessageHub setup called") - } - - deliver(messageType, data, from) { - print("MessageHub deliver called") - print("Message: " + from + " -> " + messageType + " = " + data) - } -} - -box PeerNode { - init { nodeId, messageHub } - - setup(nodeId, hub) { - print("PeerNode setup called") - me.nodeId = nodeId - me.messageHub = hub - print("PeerNode setup completed") - } - - send(messageType, data) { - print("PeerNode send called") - print("About to call messageHub.deliver...") - me.messageHub.deliver(messageType, data, me.nodeId) - print("PeerNode send completed") - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() -hub.setup() - -print("Creating PeerNode...") -local alice -alice = new PeerNode() -alice.setup("Alice", hub) - -print("Sending message...") -alice.send("hello", "Hi there!") - -print("Test completed successfully!") \ No newline at end of file diff --git a/test_p2p_fixed.nyash b/test_p2p_fixed.nyash deleted file mode 100644 index f84ffd71..00000000 --- a/test_p2p_fixed.nyash +++ /dev/null @@ -1,40 +0,0 @@ -// 修正版P2Pテスト - nullを使わない - -print("=== Fixed P2P Test ===") - -box MessageBus { - init { handlers } - - setup() { - me.handlers = new MapBox() - print("MessageBus setup complete") - } - - send(type, data, from) { - local list - list = me.handlers.get(type) - - // "Key not found" で始まるかチェック - if (list == "Bob") { // 仮の実装 - print(from + " -> " + type + ": " + data) - } - } - - on(type, nodeId) { - me.handlers.set(type, nodeId) - print("Registered: " + nodeId + " listens to " + type) - } -} - -print("Creating MessageBus...") -local bus -bus = new MessageBus() -bus.setup() - -print("Registering handlers...") -bus.on("hello", "Bob") - -print("Sending message...") -bus.send("hello", "Hi!", "Alice") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_method_names.nyash b/test_p2p_method_names.nyash deleted file mode 100644 index 2af501da..00000000 --- a/test_p2p_method_names.nyash +++ /dev/null @@ -1,51 +0,0 @@ -// P2P テスト - メソッド名変更 - -print("=== P2P Method Names Test ===") - -box HubBox { - init { handlers } - - setup() { - print("HubBox setup called") - } - - // deliver → process3 に変更 - process3(messageType, data, from) { - print("HubBox process3 called") - print("Message: " + from + " -> " + messageType + " = " + data) - } -} - -box NodeBox { - init { nodeId, messageHub } - - setup(nodeId, hub) { - print("NodeBox setup called") - me.nodeId = nodeId - me.messageHub = hub - print("NodeBox setup completed") - } - - // send → call3 に変更 - call3(messageType, data) { - print("NodeBox call3 called") - print("About to call messageHub.process3...") - me.messageHub.process3(messageType, data, me.nodeId) - print("NodeBox call3 completed") - } -} - -print("Creating HubBox...") -local hub -hub = new HubBox() -hub.setup() - -print("Creating NodeBox...") -local alice -alice = new NodeBox() -alice.setup("Alice", hub) - -print("Calling call3...") -alice.call3("hello", "Hi there!") - -print("Test completed successfully!") \ No newline at end of file diff --git a/test_p2p_no_constructor.nyash b/test_p2p_no_constructor.nyash deleted file mode 100644 index 3f9c9641..00000000 --- a/test_p2p_no_constructor.nyash +++ /dev/null @@ -1,54 +0,0 @@ -// コンストラクタを使わないP2Pテスト - -print("=== P2P Test (No Constructor) ===") - -// IntentBox - コンストラクタなし版 -box IntentBox { - init { handlers } - - // セットアップメソッド(コンストラクタの代わり) - setup() { - me.handlers = new MapBox() - print("IntentBox setup complete") - } - - deliver(messageType, data, from) { - print("Message: " + from + " -> " + messageType + " = " + data) - } -} - -// P2PBox - コンストラクタなし版 -box P2PBox { - init { nodeId, intentBox } - - setup(nodeId, intentBox) { - me.nodeId = nodeId - me.intentBox = intentBox - print("P2PBox setup for " + nodeId) - } - - send(messageType, data) { - me.intentBox.deliver(messageType, data, me.nodeId) - } -} - -// テスト -print("Creating IntentBox...") -local bus -bus = new IntentBox() -bus.setup() - -print("Creating P2PBoxes...") -local alice -alice = new P2PBox() -alice.setup("Alice", bus) - -local bob -bob = new P2PBox() -bob.setup("Bob", bus) - -print("Sending messages...") -alice.send("hello", "Hi there!") -bob.send("reply", "Hello back!") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_no_mapbox.nyash b/test_p2p_no_mapbox.nyash deleted file mode 100644 index d9358beb..00000000 --- a/test_p2p_no_mapbox.nyash +++ /dev/null @@ -1,52 +0,0 @@ -// P2Pテスト - MapBoxなし版 - -print("=== P2P No MapBox Test ===") - -// MessageHub - MapBox使わない -box MessageHub { - init { name } - - setup() { - print("MessageHub.setup() ENTER") - me.name = "CentralHub" - print("MessageHub.setup() EXIT") - } - - deliver(messageType, data, from) { - print("MessageHub.deliver() ENTER") - print("Message: " + from + " -> " + messageType + " = " + data) - print("MessageHub.deliver() EXIT") - } -} - -// PeerNode -box PeerNode { - init { nodeId, messageHub } - - setup(nodeId, hub) { - print("PeerNode.setup() ENTER - nodeId: " + nodeId) - me.nodeId = nodeId - me.messageHub = hub - print("PeerNode.setup() EXIT") - } - - send(messageType, data) { - print("PeerNode.send() ENTER - node: " + me.nodeId) - print("About to call messageHub.deliver...") - me.messageHub.deliver(messageType, data, me.nodeId) - print("PeerNode.send() EXIT") - } -} - -// テスト -print("Creating MessageHub...") -local hub -hub = new MessageHub() -hub.setup() - -print("Creating Alice...") -local alice -alice = new PeerNode() -alice.setup("Alice", hub) - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_nyash_style.nyash b/test_p2p_nyash_style.nyash deleted file mode 100644 index 9eadf8fe..00000000 --- a/test_p2p_nyash_style.nyash +++ /dev/null @@ -1,84 +0,0 @@ -// P2PBox/IntentBoxをNyashスタイルで実装 - -// IntentBox - シンプルなメッセージバス -box IntentBox { - init { listeners } - - constructor() { - me.listeners = new MapBox() - } - - // メッセージを登録されたリスナーに配信 - deliver(messageType, data, from) { - local handlers - handlers = me.listeners.get(messageType) - - if (handlers != null) { - local i - i = 0 - loop (i < handlers.length()) { - local handler - handler = handlers.get(i) - handler.invoke(data, from) // MethodBoxのinvoke - i = i + 1 - } - } - } - - // リスナー登録 - register(messageType, handler) { - local handlers - handlers = me.listeners.get(messageType) - - if (handlers == null) { - handlers = new ArrayBox() - me.listeners.set(messageType, handlers) - } - - handlers.add(handler) - } -} - -// P2PBox - IntentBoxを使ってメッセージを送るノード -box P2PBox { - init { nodeId, intentBox } - - constructor(nodeId, intentBox) { - me.nodeId = nodeId - me.intentBox = intentBox - } - - // メッセージ送信(IntentBoxに任せる) - send(messageType, data) { - me.intentBox.deliver(messageType, data, me.nodeId) - } - - // メッセージ受信登録 - on(messageType, handler) { - me.intentBox.register(messageType, handler) - } -} - -// テスト -print("=== P2PBox Test ===") - -// 1. IntentBox作成 -local bus -bus = new IntentBox() - -// 2. P2PBox作成 -local alice -alice = new P2PBox("Alice", bus) - -local bob -bob = new P2PBox("Bob", bus) - -// 3. Bobがメッセージ受信設定 -bob.on("greeting", new MethodBox(|data, from| { - print("Bob received from " + from + ": " + data) -})) - -// 4. Aliceがメッセージ送信 -alice.send("greeting", "Hello Bob!") - -print("Done!") \ No newline at end of file diff --git a/test_p2p_renamed.nyash b/test_p2p_renamed.nyash deleted file mode 100644 index fc16225c..00000000 --- a/test_p2p_renamed.nyash +++ /dev/null @@ -1,63 +0,0 @@ -// P2Pテスト - 名前衝突回避版 - -print("=== P2P Renamed Test ===") - -// MessageHub (旧IntentBox) -box MessageHub { - init { handlers } - - setup() { - print("MessageHub.setup() ENTER") - me.handlers = new MapBox() - print("MessageHub.setup() EXIT") - } - - deliver(messageType, data, from) { - print("MessageHub.deliver() ENTER") - print("Message: " + from + " -> " + messageType + " = " + data) - print("MessageHub.deliver() EXIT") - } -} - -// PeerNode (旧P2PBox) -box PeerNode { - init { nodeId, messageHub } - - setup(nodeId, hub) { - print("PeerNode.setup() ENTER - nodeId: " + nodeId) - me.nodeId = nodeId - me.messageHub = hub - print("PeerNode.setup() EXIT") - } - - send(messageType, data) { - print("PeerNode.send() ENTER - node: " + me.nodeId) - print("About to call messageHub.deliver...") - me.messageHub.deliver(messageType, data, me.nodeId) - print("PeerNode.send() EXIT") - } -} - -// テスト -print("Creating MessageHub...") -local hub -hub = new MessageHub() -hub.setup() - -print("Creating Alice...") -local alice -alice = new PeerNode() -alice.setup("Alice", hub) - -print("Creating Bob...") -local bob -bob = new PeerNode() -bob.setup("Bob", hub) - -print("Alice sending message...") -alice.send("hello", "Hi there!") - -print("Bob sending reply...") -bob.send("reply", "Hello back!") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_renamed_boxes.nyash b/test_p2p_renamed_boxes.nyash deleted file mode 100644 index d821b156..00000000 --- a/test_p2p_renamed_boxes.nyash +++ /dev/null @@ -1,51 +0,0 @@ -// P2Pテスト - Box名のみ変更 - -print("=== P2P Renamed Boxes Test ===") - -// MessageHub → HubBox に変更 -box HubBox { - init { handlers } - - setup() { - print("HubBox setup called") - } - - deliver(messageType, data, from) { - print("HubBox deliver called") - print("Message: " + from + " -> " + messageType + " = " + data) - } -} - -// PeerNode → NodeBox に変更 -box NodeBox { - init { nodeId, messageHub } - - setup(nodeId, hub) { - print("NodeBox setup called") - me.nodeId = nodeId - me.messageHub = hub - print("NodeBox setup completed") - } - - send(messageType, data) { - print("NodeBox send called") - print("About to call messageHub.deliver...") - me.messageHub.deliver(messageType, data, me.nodeId) - print("NodeBox send completed") - } -} - -print("Creating HubBox...") -local hub -hub = new HubBox() -hub.setup() - -print("Creating NodeBox...") -local alice -alice = new NodeBox() -alice.setup("Alice", hub) - -print("Sending message...") -alice.send("hello", "Hi there!") - -print("Test completed successfully!") \ No newline at end of file diff --git a/test_p2p_simple.nyash b/test_p2p_simple.nyash deleted file mode 100644 index 25e3cfe0..00000000 --- a/test_p2p_simple.nyash +++ /dev/null @@ -1,25 +0,0 @@ -// P2PBox/IntentBoxの最もシンプルなテスト - -// 1. 共通のIntentBoxを作成 -local bus -bus = new IntentBox() - -// 2. 2つのP2PBoxを作成(同じIntentBoxを共有) -local node_a -node_a = new P2PBox("node-a", bus) - -local node_b -node_b = new P2PBox("node-b", bus) - -// 3. node_bでメッセージを受信する準備 -node_b.on("hello", |data, from| { - print("node_b received: " + data + " from " + from) -}) - -// 4. node_aからメッセージを送信 -node_a.send("hello", "Hello from A!", "node-b") - -// 5. ブロードキャスト(全員に送信) -node_a.send("broadcast", "Hello everyone!") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_simple_print.nyash b/test_p2p_simple_print.nyash deleted file mode 100644 index 29e47452..00000000 --- a/test_p2p_simple_print.nyash +++ /dev/null @@ -1,49 +0,0 @@ -// 超シンプルなP2PBoxテスト(printだけ) - -// IntentBox - メッセージをprintするだけ -box IntentBox { - init { } - - constructor() { - } - - // メッセージを配信(今は単にprintするだけ) - deliver(messageType, data, from) { - print("IntentBox: " + from + " sent " + messageType + " with data: " + data) - } -} - -// P2PBox - IntentBoxにメッセージを送る -box P2PBox { - init { nodeId, intentBox } - - constructor(nodeId, intentBox) { - me.nodeId = nodeId - me.intentBox = intentBox - } - - // メッセージ送信 - send(messageType, data) { - me.intentBox.deliver(messageType, data, me.nodeId) - } -} - -// テスト -print("=== Simple P2PBox Test ===") - -// 1. IntentBox作成 -local bus -bus = new IntentBox() - -// 2. P2PBox作成 -local alice -alice = new P2PBox("Alice", bus) - -local bob -bob = new P2PBox("Bob", bus) - -// 3. メッセージ送信 -alice.send("greeting", "Hello!") -bob.send("reply", "Hi there!") - -print("Done!") \ No newline at end of file diff --git a/test_p2p_two_args.nyash b/test_p2p_two_args.nyash deleted file mode 100644 index 494f4ad4..00000000 --- a/test_p2p_two_args.nyash +++ /dev/null @@ -1,75 +0,0 @@ -// P2P実装 - 2引数制限対応版 - -print("=== P2P Two Args Version ===") - -// メッセージオブジェクト - データと送信者を1つにまとめる -box Message { - init { type, data, sender } - - setup(msgType, msgData, msgSender) { - me.type = msgType - me.data = msgData - me.sender = msgSender - print("Message created: " + msgType + " from " + msgSender) - } - - getType() { - return me.type - } - - getData() { - return me.data - } - - getSender() { - return me.sender - } -} - -// MessageHub - 2引数のdeliverメソッド -box MessageHub { - init { name } - - deliver(message) { - print("Hub delivering message:") - print(" Type: " + message.getType()) - print(" Data: " + message.getData()) - print(" From: " + message.getSender()) - } -} - -// PeerNode - メッセージオブジェクトを作成してsend -box PeerNode { - init { nodeId, hub } - - setup(id, hubRef) { - me.nodeId = id - me.hub = hubRef - print("PeerNode setup: " + id) - } - - send(msgType, msgData) { - print("PeerNode creating message...") - local msg - msg = new Message() - msg.setup(msgType, msgData, me.nodeId) - - print("PeerNode sending message...") - me.hub.deliver(msg) - } -} - -// テスト -print("Creating MessageHub...") -local hub -hub = new MessageHub() - -print("Creating PeerNode...") -local alice -alice = new PeerNode() -alice.setup("Alice", hub) - -print("Sending message...") -alice.send("hello", "Hi there!") - -print("Test completed!") \ No newline at end of file diff --git a/test_p2p_very_simple.nyash b/test_p2p_very_simple.nyash deleted file mode 100644 index 488352df..00000000 --- a/test_p2p_very_simple.nyash +++ /dev/null @@ -1,22 +0,0 @@ -// 超シンプルなP2PBoxテスト - -// 1. IntentBoxを作る(メッセージバス) -local bus -bus = new IntentBox() - -// 2. P2PBoxを2つ作る(同じIntentBoxを共有) -local alice -alice = new P2PBox("alice", bus) - -local bob -bob = new P2PBox("bob", bus) - -// 3. bobが受信準備 -bob.on("hello", |data| { - print("Bob received: " + data) -}) - -// 4. aliceがメッセージ送信 -alice.send("hello", "Hi Bob!") - -print("Done!") \ No newline at end of file diff --git a/test_peernode_only.nyash b/test_peernode_only.nyash deleted file mode 100644 index f21f9a7b..00000000 --- a/test_peernode_only.nyash +++ /dev/null @@ -1,18 +0,0 @@ -// PeerNode単体テスト - -print("=== PeerNode Only Test ===") - -box PeerNode { - init { nodeId } - - hello() { - print("PeerNode says hello") - } -} - -print("Creating PeerNode...") -local node -node = new PeerNode() -print("Calling hello...") -node.hello() -print("Test completed!") \ No newline at end of file diff --git a/test_shared_reference.nyash b/test_shared_reference.nyash deleted file mode 100644 index b7df7a02..00000000 --- a/test_shared_reference.nyash +++ /dev/null @@ -1,73 +0,0 @@ -// 共有参照とマルチ引数テスト - -print("=== Shared Reference Test ===") - -// 共有されるBox -box SharedBox { - init { name } - - setName(n) { - me.name = n - print("SharedBox name: " + n) - } - - // 3つの引数を受け取るメソッド - process(arg1, arg2, arg3) { - print("SharedBox processing: " + arg1 + ", " + arg2 + ", " + arg3) - } -} - -// 共有参照を持つBox1 -box Node1 { - init { nodeId, sharedRef } - - setup(id, shared) { - me.nodeId = id - me.sharedRef = shared - print("Node1 setup: " + id) - } - - action() { - print("Node1 calling shared method...") - me.sharedRef.process("data1", "from", me.nodeId) - print("Node1 action completed") - } -} - -// 共有参照を持つBox2 -box Node2 { - init { nodeId, sharedRef } - - setup(id, shared) { - me.nodeId = id - me.sharedRef = shared - print("Node2 setup: " + id) - } - - action() { - print("Node2 calling shared method...") - me.sharedRef.process("data2", "from", me.nodeId) - print("Node2 action completed") - } -} - -// テスト -print("Creating shared box...") -local shared -shared = new SharedBox() -shared.setName("CentralHub") - -print("Creating nodes...") -local node1 -node1 = new Node1() -node1.setup("NodeA", shared) - -local node2 -node2 = new Node2() -node2.setup("NodeB", shared) - -print("Testing actions...") -node1.action() -node2.action() - -print("Shared reference test completed!") \ No newline at end of file diff --git a/test_simple_box_no_args.nyash b/test_simple_box_no_args.nyash deleted file mode 100644 index 16b06e04..00000000 --- a/test_simple_box_no_args.nyash +++ /dev/null @@ -1,35 +0,0 @@ -// 引数なしコンストラクタのテスト - -print("=== Simple Box Test (No Args) ===") - -box Counter { - init { count } - - constructor() { - me.count = 0 - print("Counter created!") - } - - increment() { - me.count = me.count + 1 - } - - getCount() { - return me.count - } -} - -// テスト -local c -c = new Counter() - -print("Initial count: " + c.getCount()) - -c.increment() -print("After increment: " + c.getCount()) - -c.increment() -c.increment() -print("After 3 increments: " + c.getCount()) - -print("Done!") \ No newline at end of file diff --git a/test_simple_circular.nyash b/test_simple_circular.nyash deleted file mode 100644 index 59fe3a8a..00000000 --- a/test_simple_circular.nyash +++ /dev/null @@ -1,30 +0,0 @@ -// 簡単な循環参照テスト - -print("=== Simple Circular Reference Test ===") - -box TestBox { - init { value } - - setup() { - print("TestBox setup start") - me.value = "test" - print("TestBox setup complete") - } - - getValue() { - print("About to access me.value...") - return me.value - } -} - -print("Creating TestBox...") -local testBox -testBox = new TestBox() -testBox.setup() - -print("Testing field access...") -local result -result = testBox.getValue() -print("Result: " + result) - -print("Simple circular test completed!") \ No newline at end of file diff --git a/test_simple_names.nyash b/test_simple_names.nyash deleted file mode 100644 index a39de723..00000000 --- a/test_simple_names.nyash +++ /dev/null @@ -1,48 +0,0 @@ -// シンプル名でのテスト - -print("=== Simple Names Test ===") - -// Hub -box Hub { - init { data } - - constructor() { - print("Hub.constructor() called") - me.data = new MapBox() - } - - process(type, value, sender) { - print("Hub.process(): " + sender + " -> " + type + " = " + value) - } -} - -// Node -box Node { - init { id, hub } - - constructor() { - print("Node.constructor() called") - } - - connect(nodeId, hubRef) { - me.id = nodeId - me.hub = hubRef - print("Node connected: " + nodeId) - } - - send(type, value) { - print("Node.send(): " + me.id + " sending " + type) - me.hub.process(type, value, me.id) - } -} - -print("Test starting...") -local h -h = new Hub() - -local n -n = new Node() -n.connect("TestNode", h) - -n.send("test", "data") -print("Test completed!") \ No newline at end of file diff --git a/test_single_mapbox_3args.nyash b/test_single_mapbox_3args.nyash deleted file mode 100644 index a61bc285..00000000 --- a/test_single_mapbox_3args.nyash +++ /dev/null @@ -1,34 +0,0 @@ -// 単一MapBox+3引数テスト - -print("=== Single MapBox 3-Args Test ===") - -box TestBox { - init { data, nodeId } - - setup() { - print("TestBox setup start") - me.data = new MapBox() - me.nodeId = "TestNode" - print("TestBox setup complete") - } - - testMethod(arg1, arg2, arg3) { - print("TestMethod called: " + arg1 + ", " + arg2 + ", " + arg3) - } - - callSelf() { - print("About to call self with 3 args...") - me.testMethod("first", "second", me.nodeId) // 自分自身への3引数呼び出し - print("Self call completed") - } -} - -print("Creating TestBox...") -local testBox -testBox = new TestBox() -testBox.setup() - -print("Testing self 3-arg call...") -testBox.callSelf() - -print("Single MapBox 3-arg test completed!") \ No newline at end of file diff --git a/test_specific_arg_names.nyash b/test_specific_arg_names.nyash deleted file mode 100644 index 7a4c9e4d..00000000 --- a/test_specific_arg_names.nyash +++ /dev/null @@ -1,56 +0,0 @@ -// 特定の引数名テスト - -print("=== Specific Arg Names Test ===") - -box TargetBox { - init { name } - - // 元の引数名を使用 - deliver(messageType, data, from) { - print("deliver: " + from + " -> " + messageType + " = " + data) - } - - // 一般的な引数名 - process(a, b, c) { - print("process: " + a + ", " + b + ", " + c) - } -} - -box CallerBox { - init { target, nodeId } - - setup(targetRef) { - me.target = targetRef - me.nodeId = "TestNode" - print("CallerBox setup completed") - } - - testGeneric() { - print("Testing generic args...") - me.target.process("arg1", "arg2", me.nodeId) - print("Generic test completed") - } - - testSpecific() { - print("Testing specific args...") - me.target.deliver("hello", "Hi there!", me.nodeId) - print("Specific test completed") - } -} - -// テスト実行 -print("Creating boxes...") -local target -target = new TargetBox() - -local caller -caller = new CallerBox() -caller.setup(target) - -print("Testing with generic arg names...") -caller.testGeneric() - -print("Testing with specific arg names (messageType, data, from)...") -caller.testSpecific() - -print("All arg name tests completed!") \ No newline at end of file diff --git a/test_static_box_main.nyash b/test_static_box_main.nyash deleted file mode 100644 index af83123d..00000000 --- a/test_static_box_main.nyash +++ /dev/null @@ -1,42 +0,0 @@ -// 🎯 Static Box Main パターンのテスト - 正統派Nyashスタイル - -static box Main { - init { - console, x, y, result, isActive, isInactive, canEnter - } - - main() { - me.console = new ConsoleBox() - me.console.log("🎉 Hello from proper Nyash!") - me.console.log("Static box Main pattern working!") - - me.x = 42 - me.y = 58 - me.result = me.x + me.y - me.console.log("Calculation result: " + me.result) - - // NOT演算子テスト - me.isActive = true - me.isInactive = not me.isActive - me.console.log("NOT test - isInactive: " + me.isInactive) - - // AND/OR演算子テスト - me.canEnter = me.x > 30 and me.y < 100 - me.console.log("AND test - canEnter: " + me.canEnter) - - return "Main completed successfully!" - } -} - -// デモ用のBoxも定義可能 -box TestBox { - init { value } - - TestBox() { - me.value = "from TestBox" - } - - getValue() { - return me.value - } -} \ No newline at end of file diff --git a/test_three_args.nyash b/test_three_args.nyash deleted file mode 100644 index ce46ab0e..00000000 --- a/test_three_args.nyash +++ /dev/null @@ -1,42 +0,0 @@ -// 3つの引数テスト - -print("=== Three Args Test ===") - -// Hub側 - 3つの引数を受け取る -box MessageHub { - init { name } - - process(messageType, data, from) { - print("MessageHub processing: " + from + " -> " + messageType + " = " + data) - } -} - -// Node側 -box PeerNode { - init { nodeId, hub } - - setup(id, hubRef) { - me.nodeId = id - me.hub = hubRef - print("PeerNode setup: " + id) - } - - send(messageType, data) { - print("PeerNode sending: " + messageType) - me.hub.process(messageType, data, me.nodeId) - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() - -print("Creating PeerNode...") -local node -node = new PeerNode() -node.setup("TestNode", hub) - -print("Sending message...") -node.send("hello", "Hi there!") - -print("Test completed!") \ No newline at end of file diff --git a/test_three_args_literal.nyash b/test_three_args_literal.nyash deleted file mode 100644 index b415a809..00000000 --- a/test_three_args_literal.nyash +++ /dev/null @@ -1,43 +0,0 @@ -// 3つの引数テスト - リテラル値のみ - -print("=== Three Args Literal Test ===") - -// Hub側 - 3つの引数を受け取る -box MessageHub { - init { name } - - process(messageType, data, from) { - print("MessageHub processing: " + from + " -> " + messageType + " = " + data) - } -} - -// Node側 -box PeerNode { - init { nodeId, hub } - - setup(id, hubRef) { - me.nodeId = id - me.hub = hubRef - print("PeerNode setup: " + id) - } - - send(messageType, data) { - print("PeerNode sending: " + messageType) - // me.nodeId の代わりにリテラル値を使用 - me.hub.process(messageType, data, "LiteralSender") - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() - -print("Creating PeerNode...") -local node -node = new PeerNode() -node.setup("TestNode", hub) - -print("Sending message...") -node.send("hello", "Hi there!") - -print("Test completed!") \ No newline at end of file diff --git a/test_try_catch_simple.nyash b/test_try_catch_simple.nyash deleted file mode 100644 index d8ed449a..00000000 --- a/test_try_catch_simple.nyash +++ /dev/null @@ -1,33 +0,0 @@ -// 🔥 超簡単なtry/catchテスト - -static box Main { - init { console } - - main() { - me.console = new ConsoleBox() - me.console.log("🎯 try/catchテスト開始") - - // テスト1: 正常動作 - me.console.log("テスト1: 正常動作") - try { - me.console.log("try内部: 正常処理実行") - } catch (Exception e) { - me.console.log("catch: " + e) - } - me.console.log("テスト1完了") - - // テスト2: エラー発生 - me.console.log("テスト2: エラー発生") - try { - me.console.log("try内部: エラーを起こします") - local fakeVar - fakeVar = new NonExistentBox() - } catch (Exception e) { - me.console.log("catch成功: " + e) - } - me.console.log("テスト2完了") - - me.console.log("🎉 try/catchテスト終了") - return "テスト成功" - } -} \ No newline at end of file diff --git a/test_two_boxes_simple.nyash b/test_two_boxes_simple.nyash deleted file mode 100644 index f3cb320b..00000000 --- a/test_two_boxes_simple.nyash +++ /dev/null @@ -1,33 +0,0 @@ -// 2つのBox - 相互参照なし - -print("=== Two Boxes Simple Test ===") - -// 1つ目のBox -box MessageHub { - init { name } - - hello() { - print("MessageHub says hello") - } -} - -// 2つ目のBox -box PeerNode { - init { nodeId } - - hello() { - print("PeerNode says hello") - } -} - -print("Creating MessageHub...") -local hub -hub = new MessageHub() -hub.hello() - -print("Creating PeerNode...") -local node -node = new PeerNode() -node.hello() - -print("Test completed!") \ No newline at end of file diff --git a/test_undeclared_variable_error.nyash b/test_undeclared_variable_error.nyash deleted file mode 100644 index 94ebdaaa..00000000 --- a/test_undeclared_variable_error.nyash +++ /dev/null @@ -1,11 +0,0 @@ -// 🚨 未宣言変数エラーテスト - 厳密性の実証 - -static box Main { - main() { - // ❌ これは未宣言変数エラーになるはず - x = 42 - console = new ConsoleBox() - console.log("This should not work!") - return "This should fail!" - } -} \ No newline at end of file diff --git a/test_unused_field.nyash b/test_unused_field.nyash deleted file mode 100644 index fb85e110..00000000 --- a/test_unused_field.nyash +++ /dev/null @@ -1,79 +0,0 @@ -// 未使用フィールドテスト - -print("=== Unused Field Test ===") - -// Test 1: 未使用フィールドなし -box CleanTargetBox { - init { name } - - deliver(a, b, c) { - print("CleanTargetBox.deliver: " + a + ", " + b + ", " + c) - } -} - -box CleanCallerBox { - init { target, nodeId } - - setup(targetRef) { - me.target = targetRef - me.nodeId = "TestValue" - print("CleanCallerBox setup completed") - } - - test() { - print("Clean test: No unused fields...") - me.target.deliver("hello", "data", me.nodeId) - print("Clean test completed") - } -} - -// Test 2: 未使用フィールドあり(元のハングパターン) -box DirtyTargetBox { - init { handlers } // 未使用フィールド! - - deliver(a, b, c) { - print("DirtyTargetBox.deliver: " + a + ", " + b + ", " + c) - } -} - -box DirtyCallerBox { - init { target, nodeId, unusedField } // 一部未使用 - - setup(targetRef) { - me.target = targetRef - me.nodeId = "TestValue" - // me.unusedField は設定しない - print("DirtyCallerBox setup completed") - } - - test() { - print("Dirty test: With unused fields...") - me.target.deliver("hello", "data", me.nodeId) - print("Dirty test completed") - } -} - -// テスト実行 -print("Testing clean boxes (no unused fields)...") -local cleanTarget -cleanTarget = new CleanTargetBox() - -local cleanCaller -cleanCaller = new CleanCallerBox() -cleanCaller.setup(cleanTarget) -cleanCaller.test() - -print("Clean boxes worked!") - -print("Testing dirty boxes (with unused fields)...") -local dirtyTarget -dirtyTarget = new DirtyTargetBox() - -local dirtyCaller -dirtyCaller = new DirtyCallerBox() -dirtyCaller.setup(dirtyTarget) -dirtyCaller.test() - -print("If you see this, unused fields also worked!") - -print("All unused field tests completed!") \ No newline at end of file diff --git a/test_user_box.nyash b/test_user_box.nyash deleted file mode 100644 index 50173f87..00000000 --- a/test_user_box.nyash +++ /dev/null @@ -1,35 +0,0 @@ -// ユーザー定義Boxが正しく動作するかテスト - -print("=== User Box Test ===") - -// シンプルなBox定義 -box SimpleBox { - init { value } - - constructor(v) { - me.value = v - } - - getValue() { - return me.value - } - - setValue(v) { - me.value = v - } -} - -// テスト -local box1 -box1 = new SimpleBox("Hello") -print("box1 value: " + box1.getValue()) - -box1.setValue("World") -print("box1 new value: " + box1.getValue()) - -// 2つ目のインスタンス -local box2 -box2 = new SimpleBox(42) -print("box2 value: " + box2.getValue()) - -print("Done!") \ No newline at end of file