これらの検査は、各関数とアイテムの種別を対象とします。素の fn コード、const コード、pushdown fn の物語コード、#[scene] のシーンには、それぞれ何を呼び出し、読み、保持できるかの規則があります。物語変数、第二級の参照とクロージャ、choice! とテキストフォームの形もここで検査されます。
E3001 call-rule
エラー。 関数が、呼び出しを許されない種別の関数を呼んでいます。たとえば fn から物語への呼び出し、pushdown fn から fn の呼び出し、const fn から fn の呼び出しです。
fn start() -> Int<0, 3> { 0 }
pushdown fn visit() { start();}修正方法: 呼び出しを、それが許される種別の関数に移します。fn コードから物語に入る唯一の方法は、エントリーシーンの nav::start です。
E3002 step-outside-scene
エラー。 シーンではない関数が s! や choice! でステップを実行しています。クロージャと即時手続きも含みます。
pushdown fn visit() { s!(t!["no"]);}修正方法: 関数に #[scene] を付けるか、ステップをシーンに移します。
E3003 scene-call-outside-scene
エラー。 即時手続き(#[scene] のない pushdown fn)がシーンを呼んでいます。
#[scene]pushdown fn Other() {}
pushdown fn visit() { Other();}修正方法: 別の #[scene] 関数からシーンを呼ぶか、呼び出し元に #[scene] を付けます。
E3004 unbounded-loop
エラー。 即時手続きが while などの上限のないループを使っています。即時手続きで使えるのは、配列か定数の境界を持つ範囲に対する for だけです。
static mut ROUTE: Int<0, 3> = 0;
pushdown fn visit() { while ROUTE < 3 { ROUTE += 1; }}修正方法: for i in [1, 2] { ROUTE = i; } のような有界ループを使うか、関数に #[scene] を付けます。
E3005 instant-recursion
エラー。 即時手続きどうしが、直接または関数ポインターを介して循環的に呼び合っています。
pushdown fn ping() { pong(); }pushdown fn pong() { ping(); }修正方法: どれか 1 つの関数に #[scene] を付け、ステップを経由させます。
E3006 for-not-constant
エラー。 物語コードの for ループが、境界が定数式でない範囲を反復しています。
static mut ROUTE: Int<0, 3> = 0;
pushdown fn visit() { let n = ROUTE; for i in 0..n { }}修正方法: 配列か、for i in 0..MAX { ... } のような定数の境界を持つ範囲を反復します。
E3007 story-variable-outside-story
エラー。 物語変数(static mut)が pushdown fn コードの外で読み書きされています。
static mut ROUTE: Int<0, 3> = 0;
fn system() { let route = ROUTE;}修正方法: 物語変数には pushdown fn からだけアクセスします。
E3008 not-finite
エラー。 物語変数、エントリーシーンのパラメーター、または表化される const fn 呼び出しの結果の型が、値を持ちすぎています。これらの型は有界整数、bool、列挙型のような有限型でなければなりません。
static mut COUNT: u32 = 0;修正方法: static mut COUNT: Int<0, 10> = 0; のような有界の型を使います。
E3009 text-in-entry
エラー。 エントリーシーンのパラメーターの型または戻り値の型が Text を含んでいます。fn コードは実行時にテキストを組み立てられるため、Text は物語に渡せません。
enum Ending { Normal }
#[scene]#[entry]pushdown fn Named(name: Text) -> Ending { Ending::Normal}修正方法: 列挙型のような有限の値を渡し、テキストは物語の中で選びます。
E3010 not-constant
エラー。 const(または static mut)の初期化子が定数式ではありません。代入や fn 関数の呼び出しは定数式ではありません。
const COUNTED: u32 = { let mut n = 0; n += 1; n };修正方法: 初期化子を const COUNTED: u32 = 1; のような定数式で書きます。
E3011 bad-handle
エラー。 不変の static が、Setting<T> や Meta<T> のハンドル以外のものを保持しています。
static LIMIT_HANDLE: u32 = 3;修正方法: 定数には const(const LIMIT: u32 = 3;)、物語変数には static mut を使います。
E3012 reference-in-item
エラー。 const または static の型が参照を含んでいます。
const BORROWED: &u32 = &1;修正方法: const BORROWED: u32 = 1; のように値そのものを保持します。
E3013 meta-in-const
エラー。 const コードが Meta フィールドを使っています。メタは fn コードが読み物語が書くもので、const コードからは決して見えません。
static CLEARED: Meta<bool> = meta(false);
const fn render(mut screen: Screen) -> Screen { let cleared = CLEARED; screen}修正方法: メタの値を fn コードで読むか、パラメーターとして const fn に渡します。
E3014 second-class-reference
エラー。 物語コードが参照をローカルに保存するか返しています。物語では参照は第二級で、引数として渡すことしかできません。
struct Point { x: Int<0, 3>, y: Int<0, 3> }
pushdown fn alias(p: &mut Point) { let q = &p.x;}修正方法: 参照を直接引数として渡すか、let q = p.x; で値をコピーします。
E3015 second-class-closure
エラー。 物語コードがクロージャをローカルに保存しています。物語ではクロージャは第二級で、引数として渡すことと呼び出すことしかできません。
pushdown fn twice(f: pushdown Fn()) { f(); let g = f;}修正方法: f をローカルに束縛せず、直接呼び出します。
E3016 aliased-mut-argument
エラー。 物語コードで、ある場所が &mut 引数として渡され、同じ呼び出しの別の引数としても渡されています。
struct Point { x: Int<0, 3>, y: Int<0, 3> }
pushdown fn shift(a: &mut Point, b: &Point) { a.x = b.y;}
pushdown fn alias(p: &mut Point) { shift(p, p);}修正方法: shift(&mut a, &b); のように別々の場所を渡します。
E3017 immutable-place
エラー。 ルートの束縛が可変として宣言されていない場所に代入しています。
struct Point { x: Int<0, 3>, y: Int<0, 3> }
#[scene]pushdown fn Moves() { let b = Point { x: 1, y: 2 }; b.x = 3;}修正方法: let mut b = Point { x: 1, y: 2 }; のように束縛を可変にします。
E3018 misplaced-attribute
エラー。 属性が、適用できないアイテムに使われています。たとえば fn への #[scene]、#[scene] のない #[entry]、関数への #[must_use]、構造体以外への #[shader_arg] です。
#[scene] fn not_a_story() {}修正方法: #[scene] pushdown fn not_a_story() {} のように、適用できる場所にだけ属性を付けます。
E3019 choice-id
エラー。 同じ関数の 2 つの choice! フォームが同じ id を使っています。セーブは選択肢の id を記録するため、関数内で一意でなければなりません。
enum Map { A, B }
#[scene]pushdown fn Main() { match choice!{ id = "map", t!["A"] => Map::A, t!["B"] => Map::B } { _ => {} } match choice!{ id = "map", t!["A"] => Map::A, t!["B"] => Map::B } { _ => {} }}修正方法: id = "map2" のように、選択肢ごとに別の id を付けます。
E3020 choice-arms
エラー。 choice! が同じバリアントを複数のアームに並べています。各バリアントは最大 1 回しか選べません。
enum Map { A, B }
#[scene]pushdown fn Main() { match choice!{ id = "map", t!["A"] => Map::A, t!["A again"] => Map::A } { Map::A => {} _ => {} }}修正方法: 各アームを別々のバリアントに対応させます。
E3021 ruby-readings
エラー。 モノルビが、親文字 1 文字につきちょうど 1 つの読みを与えていません。
#[scene]pushdown fn Main() { s!(t]);}修正方法: s!(t]); のように 1 文字につき 1 つの読みを与えます。
E3022 effect-not-constant
エラー。 テキストの effect(base, e) の効果引数が定数式ではありません。
use std::narrative::text::{effect, mark};
fn tagged(n: u8) -> Text { effect("a", mark(n))}修正方法: effect("a", mark(1)) のように定数の効果を渡します。
W3023 unused-must-use
警告。 Swap のような #[must_use] 型の値が作られ、そのまま捨てられています。それが表す変更は、使われるまで起こりません。
const fn render(mut screen: Screen) -> Screen { screen.background().clear(); screen}修正方法: screen.background().clear().apply_animation(cut()); のように変更を適用します。
E3024 rng-outside-scene
エラー。 シーンではない関数が rng_choose を呼んでいます。乱数を引けるのはシーンだけです。
enum Coin { Heads, Tails }
pushdown fn flip() -> Coin { rng_choose::<Coin>()}修正方法: 関数に #[scene] を付けるか、シーンで値を引いてから渡します。
E3025 shader-arg-shape
エラー。 #[shader_arg] の構造体が、名前付きフィールドを 1 つ以上持つレコード構造体ではないか、型パラメータを持っています。シェーダーは引数を、型の決まった名前付きメンバーを持つ WGSL の構造体として読みます。配列の長さのような const パラメータは使えます。
#[shader_arg]struct Pair(Decimal, Decimal);修正方法: フィールドに名前を付け、型パラメータをなくします。例: #[shader_arg] struct Pair { a: Decimal, b: Decimal }。
E3026 shader-arg-field
エラー。 #[shader_arg] の構造体のフィールドが、シェーダーが読めない型であるか、長さ 0 の配列です。使えるフィールドの型は bool、i32、u32、Decimal、Rat、Color、Point、Offset、Size、Anchor、Angle、Duration、フィールドのない enum、他の #[shader_arg] 構造体、およびこれらの空でない配列です。
#[shader_arg]struct Caption { text: String,}修正方法: シェーダーには数値のデータだけを渡します。例: #[shader_arg] struct Caption { strength: Decimal }。
最終更新日 2026年10月29日