付録
std アイテムのコンパイラ規則
この付録は、シグネチャ以外にコンパイラが std アイテムに課す規則をまとめたものです:物語が保持できる std の型、リテラルとフォームの型付け、特別なシグネチャ、そしてどの評価の失敗がコンパイルエラーになるか。各規則には、違反したときの診断を記載します。診断の説明は 診断 にあります。
種別
- std の関数はすべて、宣言された種別を持ちます:ページの
Kind:バッジのとおりです。 - 言語の呼び出し規則は、std のメソッドとビルトインにも自作の関数とまったく同じように適用されます(
E3001)。そのため、レンダー(const fn)はSetting::getを呼べず、UI コンポーネント(fn)はpush_stepを呼べません。 push_step(つまりs!とchoice!)とrng_chooseは、シーンからのみ呼べます(E3002、E3024)。
有限型
物語が実行時に保持できるのは有限型だけです(E3008)。std の型のうち、次は有限型です。
Text- 5 つのファイルのアセット型(
ImageAsset、AudioAsset、VoiceAsset、VideoAsset、FontAsset) Render(const fnポインタ)Option、Result、Rangeなど、フィールドがすべて有限型の std の構造体と列挙型。例:Visibility、PlayMode
次は有限型ではありません。
String、Vec<T>、Rat、DecimalScreen、Narrative、Meta、Settingなど、すべての#[builtin]のハンドル型・状態型。ShaderAsset、ColorShader<A>などのシェーダー型、ShaderArgsも含むので、std::screen::shaderの効果値も有限型ではありません- Rust の整数や
Decimalを保持するデータ:Duration、Color、EntityId、Part、Mark、Point、TextEffect、TextStyleなど
物語のコードでも、畳み込まれる定数式の中では有限型でない値を書けます:ステップ内の ms(300) や Mark(1) は問題ありません。実行時引数を持つ const fn 呼び出しは表化され、その結果は有限型でなければなりません。
型の規則
- 文字列リテラルの型は
Text、小数点を含むリテラルの型はDecimalです。 t![…]の{expr}はto_text(expr)なので、T: ToTextであるexpr: Tが必要です(E2026)。- 物語の中では、有限型の実行時の値に対する
to_textは他のconst fn呼び出しと同じく表化されるので、行は物語の状態の有限な関数のままです。 #[entry]シーンの引数と戻り値の型はTextを含んではなりません。fnのコードがto_textで実行時のテキストを作れるからです(E3009)。a..bとa..=bの型はRange<T>で、Tはaとbの両方が変換できる型です:0..7はRange<Int<0, 7>>です。範囲式には両端が必要で、a..、..b、..はパターンにのみ書けます(E2030)。x: SをTに変換するx.into()(どちらもInteger)には、Sのすべての値がTに収まることが必要です(E2018)。x.saturate()にはその条件はありません。
フォーム
choice!の id は文字列リテラルで、関数内で一意です(E3019)。choice!のアームの値はフィールドを持たない列挙型のバリアントで、1 つの選択肢につき各バリアント 1 回までです(E3020)。- ルビの親文字は文字列リテラルで、モノルビの読みは親文字 1 文字につき 1 つの読みを持つ配列リテラルです(
E3021)。 の効果は定数式です(E3022)。
トレイト
- トレイトを宣言するのは
stdだけで、どれも#[builtin]です。ゲーム内のtraitアイテムやimpl Trait for Tはエラーです(E1012、E1023)。 Eqは、プリミティブ型、Int、関数ポインタ、そしてフィールドがすべてEqの構造体・列挙型・タプル・配列に成り立ちます。#[builtin]型では、std内のimpl Eqがあるときだけ成り立ちます。クロージャは決してEqではありません。Eqでない型への==はE2017です。- 満たされない境界(
A: Asset、T: RandChoose、T: ToText、A: ShaderArgなど)はE2026です。 ShaderArgは()と#[shader_arg]を付けた構造体に成り立ち、それ以外には成り立ちません。
#[shader_arg]
シェーダーの引数型は () か、#[shader_arg] を付けた構造体です。引数 を参照してください。
- 構造体以外への
#[shader_arg]はE3018です。 - 構造体は名前付きフィールドを持ち、型パラメータを持ってはなりません(const パラメータは使えます)(
E3025)。 - 各フィールドは
bool、i32、u32、Decimal、Rat、Color、Point、Offset、Size、Anchor、Angle、Duration、Kagari で宣言されたバリアントが 1 つ以上でフィールドのない列挙型、#[shader_arg]構造体、またはこれらの配列[T; N](N> 0)のいずれかです(E3026)。
asset::<A>
A: Assetが必要です(E2026)。- 引数は文字列リテラルで(
E2028)、空ではなく(E1028)、アセットディレクトリの中で(E1029)その予約されたディレクトリsystem-fontsとstdの外を指し(E1032)、ファイルが存在しなければなりません(E1027)。 system_fontも同じリテラルの規則に従います。固有のエラーはE1030とE1031です。
nav::start(entry, args, on_exit)
シグネチャ start<E, A, R>(entry: E, args: A, on_exit: Fn(R)) は特別です(E2027)。
entryは#[entry]シーンを指すscene fn(P1, …, Pn) -> Rポインタです。argsはタプル(P1, …, Pn)です。on_exitはFn(R)です。
const fn 内の設定とメタ
Setting<T>ハンドルは、const fn内では値としてだけ、つまりEntity::gateに渡す形でだけ使えます。getとsetはfnです。- メタフィールドは
constのコードでは一切使えません(E3013)。 SettingとMetaのハンドルは、不変のstaticの初期化子としてだけ存在します(E3011、E4007)。
#[must_use]
Change<T>、Swap、ChannelChange が対象です。捨てられた保留中の変更や、ローカル変数に束縛されたまま apply_animation で完了されない変更は警告(W3023)になり、その変更は起こりません。
for ループ
Vec<T>、配列、IntegerなTのRange<T>に対するforは、fnとconst fnで使えます。それ以外は反復できません(E2031)。pushdown fnでは、forは配列と、両端が定数式の範囲に対してだけ使えます(E3006)。
定数評価のエラー
std のコードが定数評価で実行されるとき、次の失敗はコンパイルエラーです。
| 失敗 | 診断 |
|---|---|
| 整数のオーバーフロー | E4001 |
ゼロ除算(Rat::new(_, 0)、Duration::div(0) など) | E4002 |
範囲外の Vec::set | E4005 |
static の初期化子以外での Setting や Meta のハンドル | E4007 |
Motion の規則違反:キーがない、at が狭義単調増加でないか 0 に等しい、最後のキーが恒等でない、repeat = 0 | E4008 |
トゥイーンまたは遷移モーションでの、0–1 の外にある CubicBezier の x、および Steps(0) | E4009 |
| テキストマークの重複 | E4010 |
マークに合わせている間の begin_text | E4011 |
0.0–1.0 が必要な箇所(不透明度、音量、アンカー)での範囲外の Decimal | E4012 |
Duration のオーバーフローやアンダーフロー | E4013 |
実行時には、fn のコードで起きた同じ失敗は、実行中のゲームの評価エラーになります。
最終更新日 2026年10月29日