型システム リファレンス

NagiScript の型システム全体を解説します。


基本型

整数型

ビット幅 範囲 デフォルト
i8 8 -128 〜 127
i16 16 -32,768 〜 32,767
i32 32 約 ±21 億
i64 64 約 ±922京
u8 8 0 〜 255
u16 16 0 〜 65,535
u32 32 0 〜 約42億
u64 64 0 〜 約1844京

浮動小数点型

ビット幅 精度
f32 32 約7桁
f64 64 約15桁

その他の基本型

説明
bool 真偽値 (true / false)
str 文字列(不変)
void 単型(戻り値なし)

複合型

構造体 (Struct)

main.ngs
struct Point {
    x: f64
    y: f64
}

struct Person {
    name: str
    age: i32
    email: str
}

列挙型 (Enum)

main.ngs
enum Color {
    Red
    Green
    Blue
}

// データを持つ列挙型
enum Shape {
    Circle(f64)
    Rectangle(f64, f64)
    Triangle(f64, f64, f64)
}

タプル

main.ngs
val pair: (i32, str) = (42, "hello")
val triple: (i32, f64, bool) = (1, 2.0, true)

val (a, b, c) = triple  // デストラクチャリング

ジェネリクス型

基本的なジェネリクス

main.ngs
struct Vec2<T> {
    x: T
    y: T
}

val v1 = Vec2<i32> { x: 1, y: 2 }
val v2 = Vec2<f64> { x: 1.5, y: 2.5 }

複数の型パラメータ

main.ngs
struct Pair<A, B> {
    first: A
    second: B
}

val p = Pair<i32, str> { first: 42, second: "hello" }

標準ジェネリクス型

Option<T>

main.ngs
enum Option<T> {
    Some(T)
    None
}

Result<T, E>

main.ngs
enum Result<T, E> {
    Ok(T)
    Err(E)
}

List<T>

main.ngs
struct List<T> {
    data: Rc<ListData<T>>
}

struct ListData<T> {
    items: RawSlice<T>
    len: i32
}

型変換

隠示的変換

main.ngs
val a: i64 = 100
val b: i32 = a  // OK: i64 から i32 へ安全な縮小

val x: i32 = 42
val y: f64 = x  // OK: i32 から f64 への拡張

明示的なキャスト

main.ngs
val x: i32 = 42
val y: f64 = x as f64  // 明示的な型変換

ポインタ型

基本的なポインタ

main.ngs
val x = 42
val ptr: *const i32 = &x  // 不変ポインタ
val mut_ptr: *mut i32 = &x  // 可変ポインタ

配列ポインタ

main.ngs
val arr = [1, 2, 3, 4, 5]
val ptr: *const i32 = &arr[0]

関数型

main.ngs
// 関数ポインタ
val add: fn(i32, i32) i32 = fn(a: i32, b: i32) i32 { a + b }

// 関数型の引数
fn apply(f: fn(i32) i32, x: i32) i32 {
    f(x)
}

val result = apply(fn(x: i32) i32 { x * 2 }, 5)  // 10

型エイリアス

main.ngs
type IntVec = Vec2<i32>
type Result<T> = Result<T, str>

val v: IntVec = Vec2 { x: 1, y: 2 }

型安全性

コンパイル時チェック

main.ngs
val x: i32 = 42
val y: str = "hello"

// 型エラー: i32 と str は加算できない
// val z = x + y  // コンパイルエラー

実行時チェック

main.ngs
val list = List<i32> { 1, 2, 3 }
// val value = list[5]  // 実行時エラー: インデックス範囲外