ポインター
Wave Explicit Memory Type Model
Waveのポインタ設計はWave Explicit Memory Type Modelを基にしています。 このモデルは、ポインタと配列を文法的トリックやライブラリ抽象化ではなく、言語レベルの明示的なメモリタイプとして定義することを目標としています。
このような設計により、Waveではポインタを ptr<T> 形式のタイプで表現し、
これは特定のタイプ T の値を保存しているメモリアドレスを指すタイプであることを明確に示します。
このアプローチはポインタを演算子や宣言文法ではなく、
タイプシステムの一部として扱うことでメモリ構造をより直感的で一貫性のあるものにします。
Waveにおいて、ポインタは ptr<T> 形式の明示的な型です。
アドレスの取得には &、逆参照には derefを使用します。
宣言と初期化
var x: i32 = 10;
var p: ptr<i32> = &x;
ポインタ型はネスト可能です。
var p1: ptr<i32> = &x;
var p2: ptr<ptr<i32>> = &p1;
逆参照
var x: i32 = 10;
var p: ptr<i32> = &x;
println("{}", deref p); // 10
deref p = 20;
println("{}", x); // 20
nullリテラルの規則
nullは正式なリテラルです。 識別子ではなく、変数名として使用することはできません。
核心規則:
nullはptr<T>ターゲットだけに代入できます。i32、bool、array<...>のような非ポインタ型には代入できません。- 整数リテラル (
0、123、-1など) でポインタを初期化することはできません。 明示的にnullを使用します。
var p: ptr<i32> = null;
var arrp: ptr<array<i32, 3>> = null;
// var n: i32 = null; // ERROR
// var b: bool = null; // ERROR
