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

構文

Rust との違い

Kagari の構文は Rust の部分集合にいくつかの追加を加えたもので、本リファレンスに別の記述がない限り、構文の意味は Rust と同じです。この章では、Rust のプログラマーが知っておくべき違い、つまり何がなく何がその代わりになるのか、なじみのある構文がどこで違う振る舞いをするのかをまとめます。

言語にないもの

Rust の機能ない理由、または代わりのもの
ライフタイム、借用チェッカー、ムーブ、Drop値はコピーされ、参照は共有ポインターです。値、参照、クロージャを参照
浮動小数点数(f32、f64)浮動小数点数は Eq ではなくプラットフォームによって結果が異なりますが、画面は厳密に比較できなければなりません。Decimal(0.5)か Rat を使います。数値を参照
as キャストx.into()(損失なし、検査付き)と x.saturate()(範囲内に丸める)。as は構文解析されますが E2019 です
ユーザー定義トレイト、impl Trait for T、derive存在するのは標準ライブラリの #[builtin] トレイトだけです(E1012、E1023)。Eq は自動的に実装されます。言語トレイトを参照
dyn Trait、impl Trait 型、where 句、<T as Trait>::f標準トレイトしかありません。境界はジェネリクスパラメーターの並びに書きます(T: Eq)
マクロ(macro_rules!、println!、vec! など)テンプレートやインクルードが担っていたことは関数とシーンで書けます。フォームは構文に組み込まれた固定の集合です
unsafe、生ポインター、extern不要です。コードは検証済みの VM で実行されます
async、スレッドステップでの物語の中断は言語に組み込まれています。ステップを参照
goto、位置としてのラベル構造化された制御フローだけです。制御フローとループを参照
char、バイト文字列、生文字列、&str文字列リテラルは Text です。String は実行時の文字列です
Box、Rc、HashMap、スライス配列 [T; N] と Vec<T>。すべての型は値型です
Iterator トレイト、.iter()、.map(…) の連鎖for ループで配列、Vec<T>、整数の範囲を直接反復します
move クロージャクロージャは常に値でキャプチャします
let … else、if let … && … の連鎖、ラベル付きブロックmatch、入れ子の if let、ループのラベル
スライスパターン、& パターン、ref、name @ pattern使えるパターンの形はパターンを参照
構造体更新構文 S { a: 1, ..base }すべてのフィールドを書きます
#[derive]、#[cfg]、#[test] などの属性#[scene]、#[entry]、#[must_use]、#[shader_arg](と標準ライブラリの #[builtin])だけです。それ以外の属性は E1006 です。属性を参照
pub(crate)、pub(super)pub だけです
値としての開いた範囲 a..、..b、..=b、..範囲式には両端が必要です(E2030)。パターンでは a.. と ..=b は使えますが、..b はありません。範囲パターンを参照

振る舞いが異なるもの

関数種別

すべての関数は種別を持ちます。fn、pushdown fn、const fn のいずれかで、pushdown fn は #[scene] にもできます。種別によって、関数が何を呼べて何をできるかが決まります。const fn は純粋で、物語変数、設定、メタを読めません。関数種別を参照してください。

数値

  • Int<lo, hi> はプリミティブの有界整数です。その算術は結果の範囲を計算し、複合代入はオーバーフローせず境界で飽和します。
  • 整数リテラルと、範囲を含む別の Int 型への拡大を除き、整数型が暗黙に変換されることはありません。
  • オーバーフローとゼロ除算は、定数のコードではコンパイルエラー、実行時にはパニックです。ラップアラウンドする算術はありません。
  • Int<lo, hi> に対する match は、lo から hi までを網羅すれば _ なしで網羅的です。

数値を参照してください。

値と参照

代入、引数渡し、戻り値はすべて値をコピーします。&T と &mut T は借用チェッカーのない共有ポインターで、fn と const fn のコードでは 1 つの場所への &mut が 2 つ同時に存在できます。pushdown fn の中では参照とクロージャは第二級で、渡して呼び出すことはできますが、格納したり返したりはできません。値、参照、クロージャを参照してください。

等価性と順序

PartialEq も PartialOrd もありません。== と != は標準トレイト Eq を使い、構造的な等価性を持つすべての型が自動的にこれを実装します。クロージャは決して実装しません(E2017)。<、>、<=、>= は整数、Int、Decimal、Rat にだけあります(E2015)。

static

static mut は物語変数を宣言します。安全ですが、pushdown fn のコードからしか使えません(E3007)。不変の static に入れられるのは Setting か Meta のハンドルだけです(E3011)。それ以外の定数には const を使います。

束縛とパターン

  • 束縛への代入は、最初の代入であっても変更として数えられます。初期化子のない let に後から代入するには let mut が必要です(E3017)。
  • 構造体パターンでは .. を書かずにフィールドを省略できます。
  • ..b はパターンではありません。..=b だけがあります。

? 演算子

? は Rust と同じく Option と Result に使えますが、エラーの From 変換はありません。関数は同じエラー型の Result を返さなければなりません(E2034)。

文字列とテキスト

文字列リテラルの型は &str ではなく、ゲームの定数の表示テキストである Text です。.kix ファイルでは、リッチテキストを t![…] で書きます。String は、fn のコードが実行時に組み立てるテキストの型です。

ファイル

.kis ファイルには普通のコードを書きます。.kix ファイルではフォームも使えます。ソースファイルとモジュールを参照してください。

最終更新日 2026年10月29日