diff --git a/src/interpreter/expressions.rs b/src/interpreter/expressions.rs index 57e94bb7..167c4e2a 100644 --- a/src/interpreter/expressions.rs +++ b/src/interpreter/expressions.rs @@ -1090,7 +1090,6 @@ impl NyashInterpreter { // 🔥 Phase 8.8: pack透明化システム - ビルトイン自動呼び出し (先行チェック) if is_builtin && method == parent { // 透明化: `from StringBox()` → 内部的にビルトインBox作成・統合 - eprintln!("🔥 DEBUG: Pack transparency activated! {} -> {}", parent, method); drop(box_declarations); // ロック解放 return self.execute_builtin_constructor_call(parent, current_instance_val.clone_box(), arguments); } @@ -1098,7 +1097,6 @@ impl NyashInterpreter { if is_builtin { // ビルトインBoxの場合、ロックを解放してからメソッド呼び出し drop(box_declarations); - eprintln!("🔥 DEBUG: Builtin box method call: {} -> {}", parent, method); return self.execute_builtin_box_method(parent, method, current_instance_val.clone_box(), arguments); } @@ -1302,6 +1300,28 @@ impl NyashInterpreter { let integer_box = IntegerBox::new(value); Ok(Box::new(VoidBox::new())) } + "MathBox" => { + // MathBoxは引数なしのコンストラクタ + if arg_values.len() != 0 { + return Err(RuntimeError::InvalidOperation { + message: format!("MathBox constructor expects 0 arguments, got {}", arg_values.len()), + }); + } + + let math_box = MathBox::new(); + Ok(Box::new(VoidBox::new())) + } + "ArrayBox" => { + // ArrayBoxも引数なしのコンストラクタ + if arg_values.len() != 0 { + return Err(RuntimeError::InvalidOperation { + message: format!("ArrayBox constructor expects 0 arguments, got {}", arg_values.len()), + }); + } + + let array_box = ArrayBox::new(); + Ok(Box::new(VoidBox::new())) + } _ => { // 他のビルトインBoxは今後追加 Err(RuntimeError::InvalidOperation { diff --git a/test_pack_transparency_comprehensive.nyash b/test_pack_transparency_comprehensive.nyash new file mode 100644 index 00000000..ce9a38aa --- /dev/null +++ b/test_pack_transparency_comprehensive.nyash @@ -0,0 +1,63 @@ +# 🔥 Phase 8.8: pack透明化システム 包括テスト +# 全ビルトインBox継承パターンと mixed inheritance のテスト + +print("=== pack透明化システム包括テスト開始 ===") + +# テスト1: IntegerBox 透明化 +box SmartInteger from IntegerBox { + init { isPositive } + + birth(value) { + from IntegerBox(value) # 透明化システム + me.isPositive = value > 0 + } + + getInfo() { + if me.isPositive { + return "正数です" + } else { + return "負数または0です" + } + } +} + +local num1 = new SmartInteger(42) +print("1. " + num1.getInfo()) + +local num2 = new SmartInteger(-5) +print("2. " + num2.getInfo()) + +# テスト2: 混在テスト - ビルトイン継承 + ユーザー定義 +box AdvancedCalc from MathBox { + init { history } + + birth() { + from MathBox() # 透明化システム + me.history = new ArrayBox() + } + + addToHistory(operation) { + me.history.push(operation) + return "履歴に追加: " + operation + } +} + +box SimpleCalculator { + init { result } + + birth() { + me.result = 0 + } + + getResult() { + return "結果: " + me.result + } +} + +local calc1 = new AdvancedCalc() # ビルトイン継承 +local calc2 = new SimpleCalculator() # ユーザー定義 + +print("3. " + calc1.addToHistory("2+2=4")) +print("4. " + calc2.getResult()) + +print("=== pack透明化システム包括テスト完了 ===") \ No newline at end of file diff --git a/test_pack_transparency_errors.nyash b/test_pack_transparency_errors.nyash new file mode 100644 index 00000000..d005b4d3 --- /dev/null +++ b/test_pack_transparency_errors.nyash @@ -0,0 +1,20 @@ +# 🔥 Phase 8.8: pack透明化システム エラーケーステスト +# 適切なエラーメッセージとpackの隠蔽確認 + +print("=== pack透明化システム エラーケーステスト開始 ===") + +# テスト1: 引数不一致エラー +box BadStringBox from StringBox { + init { prefix } + + birth(content, extra) { + # StringBoxは1引数だが2つ渡すとエラー + from StringBox(content, extra) + me.prefix = "test" + } +} + +print("エラーテスト1: 引数不一致") +local bad = new BadStringBox("hello", "extra") + +print("=== pack透明化システム エラーケーステスト完了 ===") \ No newline at end of file diff --git a/test_pack_transparency_final.nyash b/test_pack_transparency_final.nyash new file mode 100644 index 00000000..296ee3f7 --- /dev/null +++ b/test_pack_transparency_final.nyash @@ -0,0 +1,61 @@ +# 🔥 Phase 8.8: pack透明化システム 最終統合テスト +# 全機能の協調動作確認 + +print("=== pack透明化システム最終統合テスト開始 ===") + +# 1. 従来のbirth機能(ユーザー定義Box) +box Animal { + init { name, species } + + birth(animalName, animalSpecies) { + me.name = animalName + me.species = animalSpecies + } + + introduce() { + return me.name + " は " + me.species + " です" + } +} + +# 2. pack透明化(ビルトインBox継承) +box SmartString from StringBox { + init { metadata } + + birth(content, meta) { + from StringBox(content) # 透明化 + me.metadata = meta + } + + getInfo() { + return "内容の情報: " + me.metadata + } +} + +# 3. 複数のビルトインBox透明化 +box Calculator from MathBox { + init { precision } + + birth(precisionLevel) { + from MathBox() # 透明化(引数なし) + me.precision = precisionLevel + } + + getPrecision() { + return "精度: " + me.precision + } +} + +# テスト実行 +print("1. ユーザー定義Box:") +local cat = new Animal("ミケ", "猫") +print(cat.introduce()) + +print("2. StringBox透明化:") +local smartStr = new SmartString("Hello World", "UTF-8") +print(smartStr.getInfo()) + +print("3. MathBox透明化:") +local calc = new Calculator("高精度") +print(calc.getPrecision()) + +print("=== 全テスト成功!pack透明化システム完了 ===") \ No newline at end of file