🚀 feat: ":"継承演算子実装+全14Box型の包括的ドキュメント化完成

## 🔧 言語機能改善
- from予約語問題を解決する":"継承演算子を実装
- box Child : Parent 構文でより直感的な継承表現
- tokenizer/parserを更新、from を変数名として使用可能に

## 📚 ドキュメント大改善(1000行以上追加)
全14Box型に包括的なJavaDoc風ドキュメントを追加:
- StringBox: 文字列操作メソッド群
- IntegerBox/BoolBox: 基本データ型と演算子
- MathBox/RandomBox/TimeBox: 計算・ユーティリティ
- ConsoleBox/DebugBox/SoundBox: システムIO
- MapBox/NullBox: データ構造
- EguiBox: デスクトップGUI
- SimpleIntentBox: P2P通信

各Boxに概要・メソッド一覧・使用例・実用例・注意事項を完備

## 🧹 プロジェクト整理
- ルートディレクトリから60個のテストファイルを削除
  (development/root_tests/に移動済み)
- 不要ファイル削除: bmp, tar.xz, html, 空フォルダ等
- examplesフォルダへ適切なファイルを移動

## 📝 その他の更新
- CLAUDE.md: パーサーデバッグ機能の説明追加
- sessions/: AI相談記録2件を保存
  - from予約語問題の解決策検討
  - 標準Box型(ArrayBox等)の設計相談
This commit is contained in:
Moe Charm
2025-08-10 11:32:32 +09:00
parent e7f6666917
commit ccb3204a35
89 changed files with 1536 additions and 3027 deletions

View File

@ -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先生絶賛の「非常に洗練された設計」達成。メモリ安全性・非同期安全性保証で本格言語レベル到達!**
最終更新: 2025年8月9日 - **🔥 パーサー無限ループ完全制圧!`--debug-fuel`引数でユーザー制御可能must_advance!マクロによる早期検出システム完成。予約語問題も安全にエラー表示。静的Box Mainパターン変数宣言厳密化と合わせて本格言語レベル到達!**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -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()

View File

@ -1,143 +0,0 @@
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🐱 Nyash Programming Language</title>
<style>
body {
font-family: 'Monaco', 'Consolas', monospace;
margin: 0;
padding: 40px;
background: linear-gradient(135deg, #1e1e1e 0%, #2d2d2d 100%);
color: #ffffff;
text-align: center;
}
.container {
max-width: 800px;
margin: 0 auto;
}
h1 {
color: #ff6b6b;
font-size: 3em;
margin-bottom: 20px;
text-shadow: 0 0 20px rgba(255, 107, 107, 0.5);
}
.subtitle {
color: #4ecdc4;
font-size: 1.5em;
margin-bottom: 40px;
font-weight: bold;
}
.philosophy {
background: rgba(78, 205, 196, 0.1);
padding: 30px;
border-radius: 15px;
border: 2px solid rgba(78, 205, 196, 0.3);
margin: 40px 0;
font-size: 1.2em;
}
.cta-button {
display: inline-block;
background: linear-gradient(45deg, #ff6b6b, #ffa726);
color: white;
text-decoration: none;
padding: 20px 40px;
border-radius: 30px;
font-size: 1.3em;
font-weight: bold;
margin: 20px;
transition: transform 0.3s, box-shadow 0.3s;
box-shadow: 0 8px 25px rgba(255, 107, 107, 0.4);
}
.cta-button:hover {
transform: translateY(-5px);
box-shadow: 0 12px 35px rgba(255, 107, 107, 0.6);
}
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin: 40px 0;
}
.feature {
background: rgba(255, 255, 255, 0.05);
padding: 20px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.feature h3 {
color: #4ecdc4;
margin-bottom: 10px;
}
.footer {
margin-top: 60px;
padding-top: 30px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
color: #888;
}
.links {
margin: 30px 0;
}
.links a {
color: #4ecdc4;
text-decoration: none;
margin: 0 15px;
font-size: 1.1em;
}
.links a:hover {
color: #ff6b6b;
}
</style>
</head>
<body>
<div class="container">
<h1>🐱 Nyash</h1>
<p class="subtitle">Next-Generation Browser-Native Programming Language</p>
<p class="subtitle" style="font-size: 1.2em;">革新的プログラミング言語 - ブラウザーで動く新世代開発体験</p>
<div class="philosophy">
<strong>🎯 Everything is Box Philosophy</strong><br>
Every value in Nyash is a Box - unified, memory-safe, and elegant.<br>
<em>すべての値がBoxとして統一された、メモリ安全で美しい世界</em>
</div>
<a href="projects/nyash-wasm/nyash_playground.html" class="cta-button">
🎮 Try Nyash Now!<br>
<small style="font-size: 0.8em;">No installation required!</small>
</a>
<div class="features">
<div class="feature">
<h3>🚀 Browser-First</h3>
<p>Runs directly in web browsers via WebAssembly. Zero installation, instant coding!</p>
</div>
<div class="feature">
<h3>🎨 Creative Coding</h3>
<p>Built-in Canvas API, visual debugging, perfect for games and art projects!</p>
</div>
<div class="feature">
<h3>🛡️ Memory Safe</h3>
<p>Everything is Box philosophy eliminates crashes and memory leaks automatically!</p>
</div>
<div class="feature">
<h3>⚡ Async Ready</h3>
<p>Simple nowait/await syntax for parallel processing without complexity!</p>
</div>
</div>
<div class="links">
<a href="https://github.com/moe-charm/nyash">📂 GitHub Repository</a>
<a href="projects/nyash-wasm/nyash_playground.html">🎮 Playground</a>
<a href="https://github.com/moe-charm/nyash#-getting-started">📚 Documentation</a>
</div>
<div class="footer">
<p><strong>🤖 Support the Project</strong></p>
<p>Nyash is developed with cutting-edge AI collaboration!</p>
<a href="http://coff.ee/moecharmde6" style="color: #ff6b6b;">☕ Support Development</a>
<p style="margin-top: 20px;"><em>Built with ❤️, 🤖 Claude Code, and the Everything is Box philosophy</em></p>
</div>
</div>
</body>
</html>

View File

@ -1 +0,0 @@
Not Found

View File

@ -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)

View File

@ -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...

View File

@ -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実装
- テストランナー
- カバレッジ測定
利点: 安定性向上
どれが一番楽しそう/必要そうかにゃ?

View File

@ -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: データ駆動UIGemini先生提案
```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

View File

@ -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#<ident> サポート
// テスト: 継承・パラメータ・エスケープ全パターン
```
## 🎯 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`対応済み)
**次期実装予定**: 文脈依存キーワード + `:` 継承構文

View File

@ -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日

View File

@ -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;

View File

@ -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};

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<Mutex>使用)
* - 大量データ格納時はメモリ使用量に注意
* - 存在しないキーの取得は "Key not found" メッセージ返却
*/
use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, ArrayBox};

View File

@ -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};

View File

@ -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)]

View File

@ -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};

View File

@ -1,8 +1,70 @@
/*!
* Nyash Random Box - Random number generation
/*! 🎲 RandomBox - 乱数生成Box
*
* 乱数生成を提供するBox型
* Everything is Box哲学に基づく乱数ライブラリ
* ## 📝 概要
* 高品質な乱数生成機能を提供するBox。
* ゲーム開発、統計処理、テストデータ生成に最適。
*
* ## 🛠️ 利用可能メソッド
*
* ### 🔢 基本乱数
* - `random()` - 0.01.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.01.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};

View File

@ -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;

View File

@ -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};

View File

@ -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;

View File

@ -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};

View File

@ -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<String> = env::args().collect();
// 🔥 clap使ったコマンド引数解析
let matches = Command::new("nyash")
.version("1.0")
.author("Claude Code <claude@anthropic.com>")
.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::<String>("debug-fuel").unwrap());
if let Some(filename) = matches.get_one::<String>("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<usize> {
if value == "unlimited" {
None // 無制限
} else {
value.parse::<usize>().ok()
}
}
fn execute_nyash_file(filename: &str, debug_fuel: Option<usize>) {
// 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

View File

@ -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<ASTNode, ParseError> {
@ -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();

View File

@ -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<String, std::collections::HashSet<String>>,
/// 🔥 デバッグ燃料:無限ループ検出用制限値 (None = 無制限)
debug_fuel: Option<usize>,
}
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<String>) -> Result<ASTNode, ParseError> {
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<String>, fuel: Option<usize>) -> Result<ASTNode, ParseError> {
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 {

View File

@ -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,

View File

@ -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!")

View File

@ -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 ===")

View File

@ -1,5 +0,0 @@
// 最も基本的なテスト
print("Hello!")
print("1 + 1 = " + (1 + 1))
print("Done!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!"
}
}

View File

@ -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!")

View File

@ -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!")

View File

@ -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

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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!")

View File

@ -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
}
}

View File

@ -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!")

View File

@ -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!")

View File

@ -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 "テスト成功"
}
}

View File

@ -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!")

View File

@ -1,11 +0,0 @@
// 🚨 未宣言変数エラーテスト - 厳密性の実証
static box Main {
main() {
// ❌ これは未宣言変数エラーになるはず
x = 42
console = new ConsoleBox()
console.log("This should not work!")
return "This should fail!"
}
}

View File

@ -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!")

View File

@ -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!")