Kagari
キーワードを入力してドキュメントを検索します。

構文

アイテム

アイテムはモジュールに属する宣言です。関数、型、定数、static、実装、モジュール、インポートがあります。アイテムはファイルの最上位、インラインモジュール、ブロック(ブロック内のアイテムを参照)に置けます。関数と定数は impl の中にも置けます。

概要

アイテム形参照
関数fn f() {}、const fn f() {}、pushdown fn f() {}関数
構造体struct Point { x: i32, y: i32 }、struct Id(u32);、struct Marker;構造体
列挙型enum Route { None, Hanako, Azusa }列挙型
定数const HANAKO: EntityId = EntityId(216);定数
物語変数static mut ROUTE: Route = Route::None;物語変数
ハンドルstatic MUSIC: Setting<Volume> = setting(volume(60));ハンドル
型エイリアスtype Pair<T> = (T, T);型エイリアス
実装impl Point { … }実装
モジュールmod story;、mod ui { … }ソースファイルとモジュール
インポートuse story::Day1;use 宣言

アイテムの一般的な形は次のとおりです。

text
Item = Attribute* "pub"? ItemBody
Attribute = "#" "[" Path "]"

アイテムは宣言より前で使えます。ファイル内のアイテムの順序に意味はありません。

構造体

kis
struct Point { x: i32, y: i32 } // record struct
struct Affection(Int<0, 5>); // tuple struct
struct Marker; // unit struct
struct Pair<T> { a: T, b: T } // generic struct
  • レコード構造体は名前付きのフィールドを持ち、Point { x: 1, y: 2 } で作ります。
  • タプル構造体は番号付きのフィールドを持ち、.0、.1 … でアクセスします。その名前はコンストラクタ関数でもあり、Affection(3) のように使います。コンストラクタは const fn で、const fn(…) -> … 型の関数ポインタの値として使えます。
  • ユニット構造体はフィールドを持ちません。その名前が唯一の値です。
  • 構造体は型や定数についてジェネリックにできます。ジェネリクスを参照してください。where 節やジェネリクス引数の既定値はありません。
  • フィールドには pub や属性を付けられます。コンパイラは現在フィールドの可視性を検査しません。可視性を参照してください。
  • derive はありません。等価性は自動です。等価性を参照してください。

列挙型

kis
enum Route { None, Hanako, Azusa }
enum Ending {
Normal,
Good(Int<0, 3>),
Bad { reason: Route },
}
  • バリアントは、構造体の 3 つの形と同じく、ユニットバリアント、タプルバリアント、レコードバリアントのいずれかです。
  • バリアントはインポートしない限り Route::Hanako のように列挙型を通して指定します。use Route::*; ですべてのバリアントをインポートできます。Option と Result のバリアントはプレリュードにあります。
  • タプルバリアントの名前は、タプル構造体の名前と同じくコンストラクタ関数です。Ending::Good(2) のように使います。
  • 明示的な判別値(A = 1)は構文エラーです。列挙型は数値を持ちません。数値への変換には match を使います。
  • どのバリアントもデータを持たない列挙型はフィールドなし列挙型です。フィールドなし列挙型は RandChoose を実装し、choice! のアームの値になります。

定数

kis
const HANAKO: EntityId = EntityId(216);
const MAX_AFFECTION: Int<0, 100> = 5 * 20;
const ROOF: ImageAsset = asset("bg/roof.png");
  • 型は必須です。
  • 初期化子は定数式でなければなりません(E3010)。値はコンパイラが計算します。値のない定数は E1011 です。
  • 型に参照を含めることはできません(E3012)。
  • 定数は、その型にかかわらず物語の中を含めどこでも使えます。値がコンパイル時にわかっているからです。
  • 定数は impl の中(関連定数。Point::ORIGIN や Self::ORIGIN として使います)やブロックの中にも置けます。
  • 定数の初期化子は const のコードとして検査され、const fn だけを呼べます。

static

static は、ゲームの実行全体を通じて 1 つの場所を持つ値を宣言します。用途はちょうど 2 つで、コンパイラは mut の有無で区別します。

物語変数

kis
static mut ROUTE: Route = Route::None;
static mut AFFECTION_MIO: Int<0, 5> = 0;

static mut は物語変数です。物語の状態であり、物語とともにセーブ・復元されます。

  • 型は有限型でなければならず(E3008)、参照を含められません(E3012)。
  • 初期化子は定数式です(E3010)。
  • 読み書きできるのは pushdown fn のコードだけです(E3007)。

意味については物語変数を参照してください。

ハンドル

kis
static MUSIC: Setting<Volume> = setting(volume(60));
static CLEARED_AZUSA: Meta<bool> = meta(false);

不変の static はハンドルで、Setting<T> か Meta<T> を保持します(E3011)。初期化子は定数を引数とする setting(…) か meta(…) の呼び出しです。これらの呼び出しは static の初期化子でしか使えません(E4007)。普通の定数には const を使います。設定とメタはゲームシステムで説明します。

型エイリアス

kis
type Pair<T> = (T, T);
type Board = Square<8>;

型エイリアスは型に別の名前を付けます。新しい型は作りません。ジェネリックにできます。型のないエイリアスは E1011、自分自身に展開されるエイリアスは E2010 です。構造体や列挙型のエイリアスを通して関連アイテムを指定でき、impl の対象にもできます。Board::new() のように使います。

実装

kis
struct Square<const N: u64> {
side: u64,
}
impl<const N: u64> Square<N> {
const CELLS: u64 = N * N;
pub const fn new() -> Self {
Self { side: N }
}
pub const fn cells(&self) -> u64 {
self.side * Self::CELLS
}
}

固有実装 impl Type { … } は、構造体や列挙型に関連関数と関連定数を追加します。self パラメータを持つ関数はメソッドです。メソッドと関連関数を参照してください。

  • 対象は構造体か列挙型で、ジェネリクス引数を付けて書きます。impl は使うジェネリクスパラメータを宣言します(impl<T> Pair<T> { … })。標準ライブラリの構造体や列挙型も対象にできます。プリミティブ型は拡張できません(E1022)。
  • impl の中では Self が対象の型です。
  • 関連アイテムは pub が付いていなければプライベートです。1 つの型で同じ名前の関連アイテムが 2 つあると、別の impl ブロックにあっても E1014 です。
  • 1 つの型に、ゲームのどのモジュールからでも複数の impl ブロックを書けます。
  • impl Trait for Type は標準ライブラリ専用です(E1023)。

トレイト

ユーザーのコードはトレイトを宣言せず(E1012)、実装もしません(E1023)。標準ライブラリが固定のトレイト集合を宣言し、コードはそれをジェネリクスパラメータの境界として使います(トレイト境界を参照)。各トレイトは言語トレイトで説明します。

モジュールとインポート

mod はモジュールを宣言し、use は名前をインポートします。どちらもソースファイルとモジュールで説明します。

ブロック内のアイテム

ブロックには文と並べてアイテムを置けます。そのアイテムは宣言より前を含むブロック全体と、入れ子のブロックから見えます。ブロックの外からは見えません。

kis
fn uses() -> u64 {
const STEP: u64 = 2;
fn helper(x: u64) -> u64 {
x + STEP
}
use crate::widen as w;
helper(1) + w(3u8)
}
fn widen<T: Integer>(value: T) -> u64 {
Integer::into(value)
}

ブロック内のアイテムは普通のアイテムです。入れ子の関数は外側の関数のローカル変数をキャプチャせず、入れ子の const はコンパイル時に計算されます。ファイルモジュール(mod name;)はブロックの中では宣言できません(E1005)が、インラインモジュールは宣言できます。

属性

属性はアイテムの前、pub より前に #[name] と書きます。コンパイラが知っている属性は 4 つです。

属性対象
#[scene]pushdown fn
#[entry]#[scene] の関数
#[must_use]構造体または列挙型
#[builtin]標準ライブラリの関数、構造体、トレイト

それ以外の属性は E1006、引数付きの属性(#[scene(x)])は E1007、誤ったアイテムへの属性は E3018 です。内部属性 #![…] は構文エラーです。各属性の意味は属性で説明します。

最終更新日 2026年10月29日