Files
hakorune/src/boxes/console_box.rs

245 lines
6.0 KiB
Rust
Raw Normal View History

/*! 📟 ConsoleBox - コンソール出力Box
*
* ## 📝
* Webブラウザのコンソール機能を統合したBox
* WASM環境ではブラウザコンソール
*
* ## 🛠
* - `log(message)` -
feat(core): Phase 122 ConsoleBox.println / log unification ## Phase 122: ConsoleBox.println / log の統一 (完了) ### 概要 ConsoleBox.printlnをlogのエイリアスとしてVM/TypeRegistryレベルで統一。 Phase 120で発見されたesc_dirname_smoke.hakoの「Unknown method 'println'」 エラーを完全解消。 ### 完了タスク - ✅ TypeRegistry修正: printlnをlogのエイリアス(slot 400)として追加 - ✅ ConsoleBox実装: printlnメソッドのラッパ追加 - ✅ VM Method Dispatch: ConsoleBox専用ハンドラ追加 - ✅ Plugin設定: nyash.tomlにprintln (method_id 2)追加 - ✅ ドキュメント更新: 3ファイル(hako_logging/logging_policy/core_boxes) ### 実装詳細 #### 1. TypeRegistry (src/runtime/type_registry.rs) ```rust const CONSOLE_METHODS: &[MethodEntry] = &[ MethodEntry { name: "log", arity: 1, slot: 400 }, MethodEntry { name: "warn", arity: 1, slot: 401 }, MethodEntry { name: "error", arity: 1, slot: 402 }, MethodEntry { name: "clear", arity: 0, slot: 403 }, // Phase 122: println は log のエイリアス MethodEntry { name: "println", arity: 1, slot: 400 }, ]; ``` #### 2. ConsoleBox (src/boxes/console_box.rs) - WASM/非WASM両方にprintln()メソッド追加 - 内部的にlog()に委譲 #### 3. VM Method Dispatch (src/backend/mir_interpreter/handlers/calls/method.rs) - ConsoleBox専用ハンドラ追加 - log/println/warn/error/clearをサポート - args配列の正しい処理(len > 1時はargs[1]を使用) #### 4. Plugin設定 (nyash.toml) - ConsoleBox.methodsにprintln追加(method_id=2) - method_id整合性: log=1, println=2 ### テスト結果 - ✅ esc_dirname_smoke.hako実行成功 - 旧エラー: "Unknown method 'println'" ← **完全解消** - 新出力: `[Console LOG] dir1/dir2` ### Phase 120問題解決 **Phase 120ベースラインでの課題**: - ❌ esc_dirname_smoke.hako: ConsoleBox.println未実装 **Phase 122での解決**: - ✅ TypeRegistryレベルでprintln→log正規化 - ✅ 全経路(JSON v0/selfhost/通常VM)で一貫性保証 ### ファイル構成 **新規作成**: - docs/development/current/main/phase122_consolebox_println_unification.md **修正**: - src/runtime/type_registry.rs (+5行) - src/boxes/console_box.rs (+14行, WASM/非WASM両対応) - src/backend/mir_interpreter/handlers/calls/method.rs (+60行) - nyash.toml (+1メソッド定義) - docs/development/current/main/hako_logging_design.md (+40行) - docs/development/current/main/logging_policy.md (+30行) - docs/development/current/main/core_boxes_design.md (+20行) ### 技術的成果 - **Alias First原則**: VM/TypeRegistryレベルで正規化 - **Phase 120連携**: ベースライン確立→問題発見→根本解決 - **全経路統一**: selfhost/JSON v0/通常VMすべてで動作 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:16:06 +09:00
* - `println(message)` - `log` sugar
* - `warn(message)` -
* - `error(message)` -
* - `clear()` -
*
feat(core): Phase 122 ConsoleBox.println / log unification ## Phase 122: ConsoleBox.println / log の統一 (完了) ### 概要 ConsoleBox.printlnをlogのエイリアスとしてVM/TypeRegistryレベルで統一。 Phase 120で発見されたesc_dirname_smoke.hakoの「Unknown method 'println'」 エラーを完全解消。 ### 完了タスク - ✅ TypeRegistry修正: printlnをlogのエイリアス(slot 400)として追加 - ✅ ConsoleBox実装: printlnメソッドのラッパ追加 - ✅ VM Method Dispatch: ConsoleBox専用ハンドラ追加 - ✅ Plugin設定: nyash.tomlにprintln (method_id 2)追加 - ✅ ドキュメント更新: 3ファイル(hako_logging/logging_policy/core_boxes) ### 実装詳細 #### 1. TypeRegistry (src/runtime/type_registry.rs) ```rust const CONSOLE_METHODS: &[MethodEntry] = &[ MethodEntry { name: "log", arity: 1, slot: 400 }, MethodEntry { name: "warn", arity: 1, slot: 401 }, MethodEntry { name: "error", arity: 1, slot: 402 }, MethodEntry { name: "clear", arity: 0, slot: 403 }, // Phase 122: println は log のエイリアス MethodEntry { name: "println", arity: 1, slot: 400 }, ]; ``` #### 2. ConsoleBox (src/boxes/console_box.rs) - WASM/非WASM両方にprintln()メソッド追加 - 内部的にlog()に委譲 #### 3. VM Method Dispatch (src/backend/mir_interpreter/handlers/calls/method.rs) - ConsoleBox専用ハンドラ追加 - log/println/warn/error/clearをサポート - args配列の正しい処理(len > 1時はargs[1]を使用) #### 4. Plugin設定 (nyash.toml) - ConsoleBox.methodsにprintln追加(method_id=2) - method_id整合性: log=1, println=2 ### テスト結果 - ✅ esc_dirname_smoke.hako実行成功 - 旧エラー: "Unknown method 'println'" ← **完全解消** - 新出力: `[Console LOG] dir1/dir2` ### Phase 120問題解決 **Phase 120ベースラインでの課題**: - ❌ esc_dirname_smoke.hako: ConsoleBox.println未実装 **Phase 122での解決**: - ✅ TypeRegistryレベルでprintln→log正規化 - ✅ 全経路(JSON v0/selfhost/通常VM)で一貫性保証 ### ファイル構成 **新規作成**: - docs/development/current/main/phase122_consolebox_println_unification.md **修正**: - src/runtime/type_registry.rs (+5行) - src/boxes/console_box.rs (+14行, WASM/非WASM両対応) - src/backend/mir_interpreter/handlers/calls/method.rs (+60行) - nyash.toml (+1メソッド定義) - docs/development/current/main/hako_logging_design.md (+40行) - docs/development/current/main/logging_policy.md (+30行) - docs/development/current/main/core_boxes_design.md (+20行) ### 技術的成果 - **Alias First原則**: VM/TypeRegistryレベルで正規化 - **Phase 120連携**: ベースライン確立→問題発見→根本解決 - **全経路統一**: selfhost/JSON v0/通常VMすべてで動作 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:16:06 +09:00
* ## Phase 122: println / log
*
* `println` `log` slot 400 使
* `println` 使`log`
*
* ## 💡 使
* ```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::{BoolBox, BoxBase, BoxCore, NyashBox, StringBox};
use std::any::Any;
use std::fmt::Display;
// 🌐 Browser console access Box
#[cfg(target_arch = "wasm32")]
#[derive(Debug, Clone)]
pub struct ConsoleBox {
base: BoxBase,
}
#[cfg(target_arch = "wasm32")]
impl ConsoleBox {
pub fn new() -> Self {
Self {
base: BoxBase::new(),
}
}
/// Log messages to browser console
pub fn log(&self, message: &str) {
web_sys::console::log_1(&message.into());
}
feat(core): Phase 122 ConsoleBox.println / log unification ## Phase 122: ConsoleBox.println / log の統一 (完了) ### 概要 ConsoleBox.printlnをlogのエイリアスとしてVM/TypeRegistryレベルで統一。 Phase 120で発見されたesc_dirname_smoke.hakoの「Unknown method 'println'」 エラーを完全解消。 ### 完了タスク - ✅ TypeRegistry修正: printlnをlogのエイリアス(slot 400)として追加 - ✅ ConsoleBox実装: printlnメソッドのラッパ追加 - ✅ VM Method Dispatch: ConsoleBox専用ハンドラ追加 - ✅ Plugin設定: nyash.tomlにprintln (method_id 2)追加 - ✅ ドキュメント更新: 3ファイル(hako_logging/logging_policy/core_boxes) ### 実装詳細 #### 1. TypeRegistry (src/runtime/type_registry.rs) ```rust const CONSOLE_METHODS: &[MethodEntry] = &[ MethodEntry { name: "log", arity: 1, slot: 400 }, MethodEntry { name: "warn", arity: 1, slot: 401 }, MethodEntry { name: "error", arity: 1, slot: 402 }, MethodEntry { name: "clear", arity: 0, slot: 403 }, // Phase 122: println は log のエイリアス MethodEntry { name: "println", arity: 1, slot: 400 }, ]; ``` #### 2. ConsoleBox (src/boxes/console_box.rs) - WASM/非WASM両方にprintln()メソッド追加 - 内部的にlog()に委譲 #### 3. VM Method Dispatch (src/backend/mir_interpreter/handlers/calls/method.rs) - ConsoleBox専用ハンドラ追加 - log/println/warn/error/clearをサポート - args配列の正しい処理(len > 1時はargs[1]を使用) #### 4. Plugin設定 (nyash.toml) - ConsoleBox.methodsにprintln追加(method_id=2) - method_id整合性: log=1, println=2 ### テスト結果 - ✅ esc_dirname_smoke.hako実行成功 - 旧エラー: "Unknown method 'println'" ← **完全解消** - 新出力: `[Console LOG] dir1/dir2` ### Phase 120問題解決 **Phase 120ベースラインでの課題**: - ❌ esc_dirname_smoke.hako: ConsoleBox.println未実装 **Phase 122での解決**: - ✅ TypeRegistryレベルでprintln→log正規化 - ✅ 全経路(JSON v0/selfhost/通常VM)で一貫性保証 ### ファイル構成 **新規作成**: - docs/development/current/main/phase122_consolebox_println_unification.md **修正**: - src/runtime/type_registry.rs (+5行) - src/boxes/console_box.rs (+14行, WASM/非WASM両対応) - src/backend/mir_interpreter/handlers/calls/method.rs (+60行) - nyash.toml (+1メソッド定義) - docs/development/current/main/hako_logging_design.md (+40行) - docs/development/current/main/logging_policy.md (+30行) - docs/development/current/main/core_boxes_design.md (+20行) ### 技術的成果 - **Alias First原則**: VM/TypeRegistryレベルで正規化 - **Phase 120連携**: ベースライン確立→問題発見→根本解決 - **全経路統一**: selfhost/JSON v0/通常VMすべてで動作 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:16:06 +09:00
/// Phase 122: println は log の別名
pub fn println(&self, message: &str) {
self.log(message);
}
/// Log warning to browser console
pub fn warn(&self, message: &str) {
web_sys::console::warn_1(&message.into());
}
/// Log error to browser console
pub fn error(&self, message: &str) {
web_sys::console::error_1(&message.into());
}
/// Clear browser console
pub fn clear(&self) {
web_sys::console::clear();
}
}
#[cfg(target_arch = "wasm32")]
impl BoxCore for ConsoleBox {
fn box_id(&self) -> u64 {
self.base.id
}
fn parent_type_id(&self) -> Option<std::any::TypeId> {
self.base.parent_type_id
}
fn fmt_box(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "[ConsoleBox - Browser Console Interface]")
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
#[cfg(target_arch = "wasm32")]
impl NyashBox for ConsoleBox {
fn to_string_box(&self) -> StringBox {
StringBox::new("[ConsoleBox - Browser Console Interface]")
}
fn equals(&self, other: &dyn NyashBox) -> BoolBox {
BoolBox::new(other.as_any().is::<ConsoleBox>())
}
fn type_name(&self) -> &'static str {
"ConsoleBox"
}
fn clone_box(&self) -> Box<dyn NyashBox> {
🔧 Phase 9.75D: Fix 74 compilation errors - complete share_box() trait implementation ## Summary - Fixed 74 compilation errors related to missing/misplaced share_box() methods - Implemented complete NyashBox trait for all Box types across the codebase - Updated extern_box.rs to modern trait structure ## Changes Made ### Core trait fixes (17 files): - ✅ Fixed syntax errors: moved share_box() methods to correct positions - ✅ Added missing share_box() implementations in 17 files - ✅ Updated extern_box.rs with proper BoxCore and NyashBox implementations ### Files modified: **Core trait system:** - src/box_trait.rs: Added share_box() for 7 basic Box types - src/box_arithmetic.rs: Added share_box() for 4 arithmetic Box types - src/instance.rs, src/channel_box.rs, src/exception_box.rs: Added missing methods - src/method_box.rs, src/type_box.rs: Complete trait implementations **Box implementations (20+ files):** - All boxes in src/boxes/ directory: Fixed share_box() positioning - extern_box.rs: Modernized to current trait structure - Web boxes: Fixed WASM-specific implementations ### Implementation pattern: ```rust /// 仮実装: clone_boxと同じ(後で修正) fn share_box(&self) -> Box<dyn NyashBox> { self.clone_box() } ``` ## Result - ✅ `cargo check` now passes successfully (only warnings remain) - ✅ All NyashBox trait implementations complete - ✅ Ready for Phase 9.75D VM/WASM backend work - ✅ "Everything is Box" philosophy maintained 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-15 14:29:47 +09:00
Box::new(self.clone())
}
/// 仮実装: clone_boxと同じ後で修正
fn share_box(&self) -> Box<dyn NyashBox> {
self.clone_box()
}
}
// Non-WASM版 - モックアップ実装
#[cfg(not(target_arch = "wasm32"))]
#[derive(Debug, Clone)]
pub struct ConsoleBox {
base: BoxBase,
}
#[cfg(not(target_arch = "wasm32"))]
impl ConsoleBox {
pub fn new() -> Self {
Self {
base: BoxBase::new(),
}
}
/// Mock log method for non-WASM environments
pub fn log(&self, message: &str) {
println!("[Console LOG] {}", message);
}
feat(core): Phase 122 ConsoleBox.println / log unification ## Phase 122: ConsoleBox.println / log の統一 (完了) ### 概要 ConsoleBox.printlnをlogのエイリアスとしてVM/TypeRegistryレベルで統一。 Phase 120で発見されたesc_dirname_smoke.hakoの「Unknown method 'println'」 エラーを完全解消。 ### 完了タスク - ✅ TypeRegistry修正: printlnをlogのエイリアス(slot 400)として追加 - ✅ ConsoleBox実装: printlnメソッドのラッパ追加 - ✅ VM Method Dispatch: ConsoleBox専用ハンドラ追加 - ✅ Plugin設定: nyash.tomlにprintln (method_id 2)追加 - ✅ ドキュメント更新: 3ファイル(hako_logging/logging_policy/core_boxes) ### 実装詳細 #### 1. TypeRegistry (src/runtime/type_registry.rs) ```rust const CONSOLE_METHODS: &[MethodEntry] = &[ MethodEntry { name: "log", arity: 1, slot: 400 }, MethodEntry { name: "warn", arity: 1, slot: 401 }, MethodEntry { name: "error", arity: 1, slot: 402 }, MethodEntry { name: "clear", arity: 0, slot: 403 }, // Phase 122: println は log のエイリアス MethodEntry { name: "println", arity: 1, slot: 400 }, ]; ``` #### 2. ConsoleBox (src/boxes/console_box.rs) - WASM/非WASM両方にprintln()メソッド追加 - 内部的にlog()に委譲 #### 3. VM Method Dispatch (src/backend/mir_interpreter/handlers/calls/method.rs) - ConsoleBox専用ハンドラ追加 - log/println/warn/error/clearをサポート - args配列の正しい処理(len > 1時はargs[1]を使用) #### 4. Plugin設定 (nyash.toml) - ConsoleBox.methodsにprintln追加(method_id=2) - method_id整合性: log=1, println=2 ### テスト結果 - ✅ esc_dirname_smoke.hako実行成功 - 旧エラー: "Unknown method 'println'" ← **完全解消** - 新出力: `[Console LOG] dir1/dir2` ### Phase 120問題解決 **Phase 120ベースラインでの課題**: - ❌ esc_dirname_smoke.hako: ConsoleBox.println未実装 **Phase 122での解決**: - ✅ TypeRegistryレベルでprintln→log正規化 - ✅ 全経路(JSON v0/selfhost/通常VM)で一貫性保証 ### ファイル構成 **新規作成**: - docs/development/current/main/phase122_consolebox_println_unification.md **修正**: - src/runtime/type_registry.rs (+5行) - src/boxes/console_box.rs (+14行, WASM/非WASM両対応) - src/backend/mir_interpreter/handlers/calls/method.rs (+60行) - nyash.toml (+1メソッド定義) - docs/development/current/main/hako_logging_design.md (+40行) - docs/development/current/main/logging_policy.md (+30行) - docs/development/current/main/core_boxes_design.md (+20行) ### 技術的成果 - **Alias First原則**: VM/TypeRegistryレベルで正規化 - **Phase 120連携**: ベースライン確立→問題発見→根本解決 - **全経路統一**: selfhost/JSON v0/通常VMすべてで動作 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:16:06 +09:00
/// Phase 122: println は log の別名
pub fn println(&self, message: &str) {
self.log(message);
}
pub fn warn(&self, message: &str) {
println!("[Console WARN] {}", message);
}
pub fn error(&self, message: &str) {
println!("[Console ERROR] {}", message);
}
pub fn clear(&self) {
println!("[Console CLEAR]");
}
}
#[cfg(not(target_arch = "wasm32"))]
impl BoxCore for ConsoleBox {
fn box_id(&self) -> u64 {
self.base.id
}
fn parent_type_id(&self) -> Option<std::any::TypeId> {
self.base.parent_type_id
}
fn fmt_box(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "[ConsoleBox - Mock Implementation]")
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
#[cfg(not(target_arch = "wasm32"))]
impl NyashBox for ConsoleBox {
fn to_string_box(&self) -> StringBox {
StringBox::new("[ConsoleBox - Mock Implementation]")
}
fn equals(&self, other: &dyn NyashBox) -> BoolBox {
BoolBox::new(other.as_any().is::<ConsoleBox>())
}
fn type_name(&self) -> &'static str {
"ConsoleBox"
}
fn clone_box(&self) -> Box<dyn NyashBox> {
🔧 Phase 9.75D: Fix 74 compilation errors - complete share_box() trait implementation ## Summary - Fixed 74 compilation errors related to missing/misplaced share_box() methods - Implemented complete NyashBox trait for all Box types across the codebase - Updated extern_box.rs to modern trait structure ## Changes Made ### Core trait fixes (17 files): - ✅ Fixed syntax errors: moved share_box() methods to correct positions - ✅ Added missing share_box() implementations in 17 files - ✅ Updated extern_box.rs with proper BoxCore and NyashBox implementations ### Files modified: **Core trait system:** - src/box_trait.rs: Added share_box() for 7 basic Box types - src/box_arithmetic.rs: Added share_box() for 4 arithmetic Box types - src/instance.rs, src/channel_box.rs, src/exception_box.rs: Added missing methods - src/method_box.rs, src/type_box.rs: Complete trait implementations **Box implementations (20+ files):** - All boxes in src/boxes/ directory: Fixed share_box() positioning - extern_box.rs: Modernized to current trait structure - Web boxes: Fixed WASM-specific implementations ### Implementation pattern: ```rust /// 仮実装: clone_boxと同じ(後で修正) fn share_box(&self) -> Box<dyn NyashBox> { self.clone_box() } ``` ## Result - ✅ `cargo check` now passes successfully (only warnings remain) - ✅ All NyashBox trait implementations complete - ✅ Ready for Phase 9.75D VM/WASM backend work - ✅ "Everything is Box" philosophy maintained 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-15 14:29:47 +09:00
Box::new(self.clone())
}
/// 仮実装: clone_boxと同じ後で修正
fn share_box(&self) -> Box<dyn NyashBox> {
self.clone_box()
}
}
// Display implementations for both WASM and non-WASM versions
#[cfg(target_arch = "wasm32")]
impl Display for ConsoleBox {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.fmt_box(f)
}
}
#[cfg(not(target_arch = "wasm32"))]
impl Display for ConsoleBox {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.fmt_box(f)
}
}