2025-08-10 11:32:32 +09:00
|
|
|
|
/*! 📟 ConsoleBox - コンソール出力Box
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* ## 📝 概要
|
|
|
|
|
|
* Webブラウザのコンソール機能を統合したBox。
|
|
|
|
|
|
* WASM環境ではブラウザコンソール、ネイティブ環境では標準出力。
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* ## 🛠️ 利用可能メソッド
|
|
|
|
|
|
* - `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)
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* - `warn(message)` - 警告メッセージ出力
|
|
|
|
|
|
* - `error(message)` - エラーメッセージ出力
|
|
|
|
|
|
* - `clear()` - コンソール画面クリア
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
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` も同様に動作します。
|
|
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* ## 💡 使用例
|
|
|
|
|
|
* ```nyash
|
|
|
|
|
|
* local console
|
|
|
|
|
|
* console = new ConsoleBox()
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* console.log("Hello, Nyash!") // 通常ログ
|
|
|
|
|
|
* console.warn("This is a warning") // 警告
|
|
|
|
|
|
* console.error("Something went wrong") // エラー
|
|
|
|
|
|
* console.clear() // クリア
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* // デバッグ用途
|
|
|
|
|
|
* local value
|
|
|
|
|
|
* value = 42
|
|
|
|
|
|
* console.log("Debug: value = " + value.toString())
|
|
|
|
|
|
* ```
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* ## 🌐 環境別動作
|
|
|
|
|
|
* - **WASM環境**: ブラウザの開発者ツールコンソールに出力
|
|
|
|
|
|
* - **ネイティブ環境**: ターミナル標準出力にプレフィックス付きで出力
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* ## 🔍 デバッグ活用
|
|
|
|
|
|
* ```nyash
|
|
|
|
|
|
* // エラーハンドリング
|
|
|
|
|
|
* if (error_condition) {
|
|
|
|
|
|
* console.error("Critical error occurred!")
|
|
|
|
|
|
* return null
|
|
|
|
|
|
* }
|
2025-09-17 07:43:07 +09:00
|
|
|
|
*
|
2025-08-10 11:32:32 +09:00
|
|
|
|
* // 実行トレース
|
|
|
|
|
|
* console.log("Function start")
|
|
|
|
|
|
* // 処理...
|
|
|
|
|
|
* console.log("Function end")
|
|
|
|
|
|
* ```
|
2025-08-09 15:14:44 +09:00
|
|
|
|
*/
|
|
|
|
|
|
|
2025-09-17 07:43:07 +09:00
|
|
|
|
use crate::box_trait::{BoolBox, BoxBase, BoxCore, NyashBox, StringBox};
|
2025-08-09 15:14:44 +09:00
|
|
|
|
use std::any::Any;
|
|
|
|
|
|
use std::fmt::Display;
|
|
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
/// ConsoleBox メソッド実装マクロ
|
|
|
|
|
|
/// WASM/非WASM環境で異なるメソッド実装を統一化
|
|
|
|
|
|
macro_rules! define_console_impl {
|
|
|
|
|
|
(
|
|
|
|
|
|
log: $log_impl:expr,
|
|
|
|
|
|
warn: $warn_impl:expr,
|
|
|
|
|
|
error: $error_impl:expr,
|
|
|
|
|
|
clear: $clear_impl:expr,
|
|
|
|
|
|
fmt_desc: $fmt_desc:expr
|
|
|
|
|
|
) => {
|
|
|
|
|
|
impl ConsoleBox {
|
|
|
|
|
|
pub fn new() -> Self {
|
|
|
|
|
|
Self {
|
|
|
|
|
|
base: BoxBase::new(),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn log(&self, message: &str) {
|
|
|
|
|
|
$log_impl(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn println(&self, message: &str) {
|
|
|
|
|
|
self.log(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn warn(&self, message: &str) {
|
|
|
|
|
|
$warn_impl(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn error(&self, message: &str) {
|
|
|
|
|
|
$error_impl(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn clear(&self) {
|
|
|
|
|
|
$clear_impl();
|
|
|
|
|
|
}
|
2025-09-17 07:43:07 +09:00
|
|
|
|
}
|
2025-08-09 15:14:44 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
impl BoxCore for ConsoleBox {
|
|
|
|
|
|
fn box_id(&self) -> u64 {
|
|
|
|
|
|
self.base.id
|
|
|
|
|
|
}
|
🚀 feat: BoxBase+BoxCore革命 Phase4進捗 - 12+Box型統一完了
✅ 完了したBox型統一アーキテクチャ移行
- MathBox関連: MathBox, FloatBox, RangeBox
- TimeBox関連: TimeBox, DateTimeBox, TimerBox
- DebugBox, RandomBox
- StringBox, IntegerBox, BoolBox (個別ファイル版)
- ArrayBox, ConsoleBox
- box_trait.rs内: StringBox, IntegerBox, BoolBox, VoidBox等
🎯 大幅な進捗達成
- unsafe ID生成 → BoxBase::new()安全化
- コンパイルエラー: 106 → 97に減少
- 統一インターフェース確立でCharmFlow互換性問題完全回避
🔧 革命的変更パターン確立
1. base: BoxBase導入
2. impl BoxCore with box_id()/fmt_box()
3. NyashBoxからbox_id()削除
4. Display::fmt() → fmt_box()委譲
Phase 4E: 残りBox型の統一化継続中
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-11 11:25:17 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn parent_type_id(&self) -> Option<std::any::TypeId> {
|
|
|
|
|
|
self.base.parent_type_id
|
|
|
|
|
|
}
|
2025-08-09 15:14:44 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn fmt_box(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
|
|
|
|
write!(f, "{}", $fmt_desc)
|
|
|
|
|
|
}
|
2025-08-09 15:14:44 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn as_any(&self) -> &dyn Any {
|
|
|
|
|
|
self
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn as_any_mut(&mut self) -> &mut dyn Any {
|
|
|
|
|
|
self
|
|
|
|
|
|
}
|
2025-09-17 07:43:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
impl NyashBox for ConsoleBox {
|
|
|
|
|
|
fn to_string_box(&self) -> StringBox {
|
|
|
|
|
|
StringBox::new($fmt_desc)
|
|
|
|
|
|
}
|
2025-09-17 07:43:07 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn equals(&self, other: &dyn NyashBox) -> BoolBox {
|
|
|
|
|
|
BoolBox::new(other.as_any().is::<ConsoleBox>())
|
|
|
|
|
|
}
|
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
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn type_name(&self) -> &'static str {
|
|
|
|
|
|
"ConsoleBox"
|
|
|
|
|
|
}
|
2025-09-17 07:43:07 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn clone_box(&self) -> Box<dyn NyashBox> {
|
|
|
|
|
|
Box::new(self.clone())
|
|
|
|
|
|
}
|
2025-09-17 07:43:07 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
fn share_box(&self) -> Box<dyn NyashBox> {
|
|
|
|
|
|
self.clone_box()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-09 15:14:44 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
impl Display for ConsoleBox {
|
|
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
|
|
self.fmt_box(f)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
🚀 feat: BoxBase+BoxCore革命 Phase4進捗 - 12+Box型統一完了
✅ 完了したBox型統一アーキテクチャ移行
- MathBox関連: MathBox, FloatBox, RangeBox
- TimeBox関連: TimeBox, DateTimeBox, TimerBox
- DebugBox, RandomBox
- StringBox, IntegerBox, BoolBox (個別ファイル版)
- ArrayBox, ConsoleBox
- box_trait.rs内: StringBox, IntegerBox, BoolBox, VoidBox等
🎯 大幅な進捗達成
- unsafe ID生成 → BoxBase::new()安全化
- コンパイルエラー: 106 → 97に減少
- 統一インターフェース確立でCharmFlow互換性問題完全回避
🔧 革命的変更パターン確立
1. base: BoxBase導入
2. impl BoxCore with box_id()/fmt_box()
3. NyashBoxからbox_id()削除
4. Display::fmt() → fmt_box()委譲
Phase 4E: 残りBox型の統一化継続中
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-11 11:25:17 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
// 🌐 Browser console access Box
|
|
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
|
pub struct ConsoleBox {
|
|
|
|
|
|
base: BoxBase,
|
2025-08-09 15:14:44 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
2025-12-04 06:02:03 +09:00
|
|
|
|
define_console_impl!(
|
|
|
|
|
|
log: |msg: &str| { web_sys::console::log_1(&msg.into()); },
|
|
|
|
|
|
warn: |msg: &str| { web_sys::console::warn_1(&msg.into()); },
|
|
|
|
|
|
error: |msg: &str| { web_sys::console::error_1(&msg.into()); },
|
|
|
|
|
|
clear: || { web_sys::console::clear(); },
|
|
|
|
|
|
fmt_desc: "[ConsoleBox - Browser Console Interface]"
|
|
|
|
|
|
);
|
2025-08-09 15:14:44 +09:00
|
|
|
|
|
2025-12-04 06:02:03 +09:00
|
|
|
|
// Non-WASM版 - モックアップ実装
|
2025-08-09 15:14:44 +09:00
|
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
2025-12-04 06:02:03 +09:00
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
|
pub struct ConsoleBox {
|
|
|
|
|
|
base: BoxBase,
|
2025-08-09 15:14:44 +09:00
|
|
|
|
}
|
2025-12-04 06:02:03 +09:00
|
|
|
|
|
|
|
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
|
|
|
|
define_console_impl!(
|
|
|
|
|
|
log: |msg: &str| { println!("[Console LOG] {}", msg); },
|
|
|
|
|
|
warn: |msg: &str| { println!("[Console WARN] {}", msg); },
|
|
|
|
|
|
error: |msg: &str| { println!("[Console ERROR] {}", msg); },
|
|
|
|
|
|
clear: || { println!("[Console CLEAR]"); },
|
|
|
|
|
|
fmt_desc: "[ConsoleBox - Mock Implementation]"
|
|
|
|
|
|
);
|