目的
複数ファイルをまとめた package(ディレクトリ単位のモジュール束) を言語の一級構造として導入し、pub / private などの可視性で API 境界を制御できるようにする。
背景
現在の rw には「package 機能」に該当する 3 つのレイヤのうち 2 つしか issue が無い:
| レイヤ |
既存 issue |
| (a) モジュール = 1 ファイル単位の名前空間 + import |
#11 |
| (b) package = 複数モジュールをまとめた配布/可視性単位 |
本 issue |
| (c) パッケージマネージャ = 依存解決・lockfile |
#57 |
(b) は #11 (import foo) の自然な延長で、Rust の mod/pub、Go のディレクトリ単位 package、Python の __init__.py、Java の package 宣言に相当する。stdlib (#33〜#43) を整理する際にも (b) の境界が無いと「どの関数を公開するか」「どの名前を re-export するか」を統一的に決められない。
スコープ
非ゴール
設計検討メモ
- package 宣言方式の選択肢:
- 暗黙(Go 方式): ディレクトリ = package。ファイルヘッダの宣言不要。シンプル
- 明示(Rust 方式): `mod foo;` または `package foo` をヘッダに書く。リネーム耐性が高い
- ハイブリッド: ディレクトリ名を package 名のデフォルトにし、
package 宣言で上書き可
- 可視性キーワード:
- Python 慣習の "アンダースコア prefix で private" は弱い規約なので、コンパイラで強制したい
- 候補: `pub fn` (Rust 風)、 `export def` (TS 風)、 大文字始まりで公開 (Go 風)
- テスト用 friend 可視性(例: `pub(crate)` 相当)が必要か → 当面は不要、必要になったら追加
関連
受け入れ基準(最低限)
目的
複数ファイルをまとめた package(ディレクトリ単位のモジュール束) を言語の一級構造として導入し、
pub/privateなどの可視性で API 境界を制御できるようにする。背景
現在の rw には「package 機能」に該当する 3 つのレイヤのうち 2 つしか issue が無い:
(b) は #11 (
import foo) の自然な延長で、Rust のmod/pub、Go のディレクトリ単位 package、Python の__init__.py、Java のpackage宣言に相当する。stdlib (#33〜#43) を整理する際にも (b) の境界が無いと「どの関数を公開するか」「どの名前を re-export するか」を統一的に決められない。スコープ
mypkg/foo.rw,mypkg/bar.rwで同一 package)。または明示的なpackage mypkgヘッダ構文(要検討)非ゴール
設計検討メモ
package宣言で上書き可関連
受け入れ基準(最低限)