NEPLg2.1 Trait システム仕様

最終更新: 2026-03-27


1. 設計原則

  • trait は型能力の契約として扱う
  • オーバーロード解決と trait 境界判定を統一する
  • API 名は bare 名で揃える
  • 表層構文は Zenn #1 / #2 の let / lambda / 前置型記法に合わせる

2. trait / impl

2.1 trait 定義

let Eq trait:
    let eq %fn Self fn Self bool \a \b ...

2.2 impl 定義

let i32 impl for Eq:
    let eq %fn i32 fn i32 bool \a \b i32_eq a b

3. trait 境界

trait 境界の詳細構文は今後も調整がありうるが、関数型そのものは fn A B 形式へ揃える。

let sort .T: Ord %fn Vec .T Vec .T \v ...

複数引数ならカリー化して書く。

let merge .T %fn Vec .T fn Vec .T Vec .T
    where .T: Ord
    \a \b ...

4. Coherence

  • 同一 (trait, target type) への重複 impl を禁止する
  • Orphan Rule を適用する
  • impl の重複は修飾名では救済せず compile error とする

この設計自体は維持し、表記のみ新構文へ追従させる。


5. Copy / Clone / Drop

  • Copy は暗黙複製可能な型のみ
  • Owned / Linear 型に Copy は実装不可
  • Clone は明示複製
  • Drop は自動破棄規則に接続する

6. モジュール分離によるオーバーロード

Core 層と Casual 層を別モジュールに分け、同じ bare 名を使い分ける設計は維持する。

use core::collections::vec as *
get vec proof

use std::collections::vec as *
get vec 3

7. オーバーロード解決

7.1 制約で絞る

where 節や trait 境界を満たさない候補を落とす。

7.2 期待型で絞る

let x %Option i32 get vec idx
let y %i32 get vec idx

7.3 それでも曖昧なら修飾名を要求する

core::vec::get vec proof
std::vec::get vec 3

ここで修飾名で解決できるのは bare 名の候補集合 の曖昧性だけである。impl Eq for i32 のような同一 (trait, target type) への重複 impl は Coherence 違反であり、修飾名では解決できない。


8. 標準 trait

Trait意味
Eq等値比較
Ord全順序比較
Hashハッシュ
Stringify人間向け文字列化
Debugデバッグ表現
Serialize .F直列化
Deserialize .F逆直列化
Parse文字列からのパース
Defaultデフォルト値
Clone明示複製
Copy暗黙複製
Add .U .R加算演算
Drop自動破棄対象
Readerバイト列の読み出し
Writerバイト列の書き込み
Seekableシーク操作
Bufferedバッファリング
Allocator領域確保・解放ポリシー
EventSource .Eイベント発行源
EventSink .Eイベント消費先

9. 将来導入する capability trait

compiler.md で言及している次の capability trait は、現時点ではコア構文として凍結していない将来拡張である。

  • MemReadable .T
  • MemWritable .T
  • RegionOwned

これらは Resource IR 導入後のメモリ API / 解放 API を trait 境界で表す候補であり、本章では名前と役割だけを予約する。stdlib.md の trait 一覧でも将来導入候補として同じ位置づけで扱う。

On this page