Files
hakorune/docs/reference/boxes-system/everything-is-box.md

5.0 KiB
Raw Blame History

🌟 Everything is Box - Nyashの核心哲学

📦 すべては箱である

Nyashでは、すべての値が「Box」と呼ばれるオブジェクトです。 数値も、文字列も、関数も、そしてBoxそのものも、すべてがBoxです。

// これらはすべてBox
local number = 42              // IntegerBox
local text = "Hello"           // StringBox  
local flag = true              // BoolBox
local nothing = null           // NullBox
local container = new MapBox() // MapBox

🎯 なぜEverything is Boxなのか

1. 統一性

プリミティブ型と参照型の区別がないため、すべてを同じ方法で扱えます。

// すべて同じ方法でメソッドを呼べる
local strLen = "Hello".length()      // StringBoxのメソッド
local doubled = 42.multiply(2)       // IntegerBoxのメソッド
local formatted = true.toString()    // BoolBoxのメソッド

2. 拡張性

すべてがオブジェクトなので、どんな型にもメソッドを追加できます。

// ユーザー定義Boxで数値を拡張
box Money from IntegerBox {
    pack(amount) {
        from IntegerBox.pack(amount)
    }
    
    format() {
        return "$" + me.toString()
    }
}

3. 一貫性

型チェック、メソッド呼び出し、デリゲーションがすべて統一的に動作します。

// 型チェックも統一的
if value.isType("StringBox") {
    console.log("It's a string!")
}

// nullチェックも同様
if value.isType("NullBox") {
    console.log("It's null!")
}

🏗️ Box設計の基本原則

1. Boxは不変の契約

すべてのBoxはNyashBoxトレイトを実装し、以下のメソッドを提供します:

  • type_name() - Box型名を返す
  • clone_box() - Boxの複製を作成
  • as_any() - 動的型変換用
  • to_string_box() - StringBox変換

2. メモリ管理の統一

すべてのBoxはArc<Mutex<dyn NyashBox>>として管理され、自動的にメモリ安全です。

3. 明示的な操作

暗黙的な型変換は行わず、すべての操作を明示的に行います。

// ❌ 暗黙的な変換はない
local result = "Hello" + 42  // エラー!

// ✅ 明示的な変換
local result = "Hello" + 42.toString()  // OK: "Hello42"

📊 Box型の分類

基本Box型

  • StringBox - 文字列
  • IntegerBox - 整数
  • FloatBox - 浮動小数点数
  • BoolBox - 真偽値
  • NullBox - null値

コレクションBox型

  • ArrayBox - 配列
  • MapBox - 連想配列
  • SetBox - 集合(予定)

システムBox型

  • ConsoleBox - コンソール入出力
  • FileBox - ファイル操作
  • TimeBox - 時刻操作
  • MathBox - 数学関数

ネットワークBox型

  • SocketBox - TCP/UDPソケット
  • HTTPServerBox - HTTPサーバー
  • P2PBox - P2P通信

GUI Box型

  • EguiBox - GUIアプリケーション
  • CanvasBox - 描画キャンバス

特殊Box型

  • FutureBox - 非同期処理
  • WeakBox - 弱参照
  • ExternBox - 外部ライブラリ統合

🔄 Boxの生成と利用

基本的な生成

// newによる明示的生成
local str = new StringBox("Hello")
local num = new IntegerBox(42)

// リテラルによる暗黙的生成
local str = "Hello"  // 自動的にStringBox
local num = 42       // 自動的にIntegerBox

ユーザー定義Box

box Point {
    init { x, y }
    
    pack(xVal, yVal) {
        me.x = xVal
        me.y = yVal
    }
    
    distance() {
        return (me.x * me.x + me.y * me.y).sqrt()
    }
}

local p = new Point(3, 4)
console.log(p.distance())  // 5

デリゲーションによる拡張

box Point3D from Point {
    init { z }
    
    pack(xVal, yVal, zVal) {
        from Point.pack(xVal, yVal)
        me.z = zVal
    }
    
    override distance() {
        local xy = from Point.distance()
        return (xy * xy + me.z * me.z).sqrt()
    }
}

🌐 外部世界との統合

Everything is Box哲学は、外部ライブラリにも適用されます。

// ExternBoxで外部APIもBoxに
local fetch = new ExternBox("fetch")
local response = fetch.call("get", "https://api.example.com/data")

// JavaScript APIもBoxとして利用
local dom = new ExternBox("document")
local element = dom.call("getElementById", "myDiv")

🎉 まとめ

Everything is Box哲学により、Nyashは

  1. シンプル - すべてが同じルールに従う
  2. 強力 - どんなものにもメソッドを追加できる
  3. 安全 - 統一的なメモリ管理
  4. 拡張可能 - 新しいBox型を簡単に追加
  5. 統合的 - 外部ライブラリも同じ方法で利用

この哲学こそが、Nyashを特別な言語にしているのです。


関連ドキュメント: