Files
hakorune/docs/development/proposals/nyash.link/README.md
Moe Charm cc2a820af7 feat(plugin): Fix plugin BoxRef return and Box argument support
- Fixed deadlock in FileBox plugin copyFrom implementation (single lock)
- Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs
- Improved plugin loader with config path consistency and detailed logging
- Fixed loader routing for proper Handle type_id/fini_method_id resolution
- Added detailed logging for TLV encoding/decoding in plugin_loader_v2

Test docs/examples/plugin_boxref_return.nyash now works correctly:
- cloneSelf() returns FileBox Handle properly
- copyFrom(Box) accepts plugin Box arguments
- Both FileBox instances close and fini correctly

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-21 00:41:26 +09:00

6.9 KiB
Raw Blame History

nyash.linkシステム設計 - モジュール・依存関係管理革命

🎯 設計背景

📊 現状調査結果

  • include使用状況: 主にexamples/text_adventureで10件程度、実用性は限定的
  • usingキーワード: 未実装(トークナイザーにも存在しない)
  • namespace設計: Phase 9.75eで仕様完成、実装待ち

🌟 Gemini先生の推奨

「技術的に非常に妥当であり、現代的なプログラミング言語の設計として強く推奨される」

結論: includeほぼ未使用 + using未実装 = 完全に新設計で進められる!🎉

🚀 設計方針

💡 基本コンセプト

依存関係管理nyash.link + モジュールインポートusing = 完璧な統合

🎯 他言語成功モデル

  • Rust: Cargo.toml + mod/use - 厳格で分かりやすい
  • Node.js: package.json + import/export - エコシステム成功
  • Python: pyproject.toml + import - 依存関係分離

📋 nyash.linkファイル仕様

基本フォーマット

# nyash.link (プロジェクトルート)
[project]
name = "my-nyash-project"
version = "0.1.0" 
description = "素晴らしいNyashプロジェクト"

[dependencies]
# 標準ライブラリ
nyashstd = { path = "./stdlib/nyashstd.nyash" }

# ユーザーライブラリ
mylib = { path = "./libs/mylib.nyash" }
utils = { path = "./src/utils.nyash" }

# 将来の外部パッケージ(例)
# http_client = { version = "1.0.0", registry = "nyash-pkg" }

[search_paths]
stdlib = "./stdlib/"
libs = "./libs/"
src = "./src/"

[build]
entry_point = "./src/main.nyash"

依存関係タイプ

1. ローカル依存

[dependencies]
my_module = { path = "./src/my_module.nyash" }

2. 標準ライブラリ

[dependencies]
nyashstd = { stdlib = true }  # 特別扱い

3. 将来の外部パッケージ

[dependencies]
awesome_lib = { version = "^1.2.0", registry = "nyash-pkg" }

🔧 usingシステム設計

1. トークナイザー拡張

// src/tokenizer.rs に追加
pub enum TokenType {
    // 既存...
    USING,           // using (モジュールインポート)
    NAMESPACE,       // namespace (名前空間宣言)
}

2. パーサー拡張

// AST拡張
pub enum Statement {
    // 既存...
    UsingStatement {
        module_path: Vec<String>,  // ["nyashstd", "string"]
        alias: Option<String>,     // using nyashstd.string as str
    },
    NamespaceDeclaration {
        name: String,
        body: Vec<Statement>,
    },
}

3. 基本構文

// ===== using構文パターン =====

// パターンA: 名前空間全体
using nyashstd
string.upper("hello")  // nyashstd.string.upper
math.sin(3.14)        // nyashstd.math.sin

// パターンB: 特定機能(将来拡張)
using nyashstd.string
upper("hello")        // string.upperを直接

// パターンC: エイリアス(将来拡張)
using nyashstd.string as str
str.upper("hello")

// パターンD: 完全修飾名(常時利用可能)
nyashstd.string.upper("hello")  // using不要

📁 推奨ディレクトリ構造

基本プロジェクト構造

my-nyash-project/
├── nyash.link              # 依存関係定義
├── src/
│   ├── main.nyash         # エントリーポイント
│   ├── utils.nyash        # ユーティリティモジュール
│   └── models/
│       └── user.nyash     # モデル定義
├── libs/                  # プロジェクト固有ライブラリ
│   └── mylib.nyash
├── stdlib/                # 標準ライブラリ(システム配布)
│   └── nyashstd.nyash
└── tests/                 # テストファイル
    └── test_main.nyash

標準ライブラリ構造

stdlib/
├── nyashstd.nyash         # メインエントリー
├── string/
│   └── mod.nyash         # string関連機能
├── math/
│   └── mod.nyash         # 数学関数
├── http/
│   └── mod.nyash         # HTTP関連
└── io/
    └── mod.nyash         # I/O関連

🔄 動作フロー

1. プロジェクト初期化

# 将来のCLI例
nyash init my-project      # nyash.linkテンプレート生成
cd my-project

2. 実行時解決

main.nyash実行
  ↓
nyash.link読み込み
  ↓
using nyashstd解析
  ↓
./stdlib/nyashstd.nyash読み込み
  ↓
namespace nyashstd解析・登録  
  ↓
string.upper()利用可能

3. 名前解決アルゴリズム

string.upper() 呼び出し
  ↓
1. ローカルスコープ検索
2. usingでインポートされた名前空間検索
3. 完全修飾名として解釈
4. エラー(未定義)

🧪 実装段階

Phase 1: 最小実装

// ✅ 実装目標
using mylib              // 単純パス解決
mylib.hello()           // 関数呼び出し

// nyash.link
[dependencies]  
mylib = { path = "./mylib.nyash" }

Phase 2: 名前空間サポート

// ✅ 実装目標
using nyashstd
string.upper("hello")

// nyashstd.nyash
namespace nyashstd {
    static box string {
        static upper(str) { ... }
    }
}

Phase 3: 高度機能

  • エイリアス(using ... as ...
  • 選択インポート(using nyashstd.string
  • 循環依存検出
  • パッケージレジストリ連携

実装優先順位

🚨 Critical即時

  1. UsingTokenizer実装 - Token::USINGを追加
  2. 基本パーサー - using文AST構築
  3. nyash.link解析 - TOML読み込み機能

High今週

  1. 名前解決エンジン - モジュール→ファイル解決
  2. 基本テスト - using mylib動作確認
  3. エラー処理 - 未定義モジュール等

📝 Medium来週

  1. namespace構文 - static box解析
  2. 標準ライブラリ設計 - nyashstd.nyash作成
  3. 完全修飾名 - nyashstd.string.upper()

🔮 Future今後

  1. IDE連携 - Language Server補完
  2. パッケージマネージャー - 外部レジストリ
  3. 循環依存検出 - 高度エラー処理

🎉 期待効果

📈 開発体験向上

  • IDE補完: ny→全標準機能表示
  • 探索可能性: モジュール構造が明確
  • エラー削減: 名前衝突・未定義の事前検出

🏗️ プロジェクト管理

  • 依存関係明確化: nyash.linkで一元管理
  • ビルド再現性: 他環境での確実な動作
  • スケーラビリティ: 大規模プロジェクト対応

🌍 エコシステム発展

  • ライブラリ共有: 標準化されたモジュール形式
  • コミュニティ成長: パッケージレジストリ基盤
  • 言語成熟度: モダンな言語仕様

🐾 この設計でNyashが真にモダンなプログラミング言語になるにゃ