Skip to main content
このページの環境プロファイル・字句短縮・診断統一は、Storm Lua EngineのSDK統合ブランチに対応する実装の仕様です。既存の公開済みパッケージへ遡って適用されるものではありません。同じ版のSDKとStorm Minを使用してください。
StormMin のパーサは、Lua の構文として受理できるかどうかと、その参照先が Stormworks のサンドボックスで実際に使えるかどうかを別々に判定します。この 2 つは診断としても別のレイヤーで扱われます。

対応する構文

パーサは次を含む Lua 構文を受理します。
  • goto / ::label::
  • ビット演算子(& | ~ << >>)
  • 整数除算 //
  • ロングブラケット文字列・コメント([[ ]]、[=[ ]=])
  • 可変長引数 ...
  • 複数戻り値・複数代入
  • ステップ付き数値 for、汎用 for(ipairs/pairs などとの組み合わせ)
  • クロージャ・アップバリュー
  • 16 進数値・浮動小数点数・指数表記(16 進浮動小数点を含む)
setmetatable/getmetatable/coroutine.* のような呼び出しは、Lua の構文としては通常の関数呼び出しなので構文的には受理されます。ただし、これらの名前自体が Stormworks サンドボックスで利用できないため、意味検証の段階で警告またはエラーになります(後述)。
引数リストが可変長引数のみ((...))の関数は、名前付き・無名を問わず現在のパーサではパースエラーになります。function f(...) end / local function f(...) end / local g = function(...) end は expected expression at <行>:<列>, got )、文としての function(...) end は expected (, got ... at <行>:<列> になります。回避するには function f(a, ...) end のように名前付き引数を 1 つ以上前置してください。

構文と環境の診断

構文エラーは常にエラーです。環境に存在しない既知の組み込み関数への依存は、編集用のanalyze()ではsw-unavailable-global警告、単一ソースのcompile()とプロジェクトのcompileProject()ではエラーになります。非短縮ビルドと目標サイズによる早期終了も同じ条件を使います。 environment: "game"が既定です。debug.logは利用できますが、print、pcall、xpcall、errorなどは公開しません。debugのほかの標準メンバーは提供しません。environment: "extended"は明示的な開発・組み込み用であり、ゲーム互換の保証ではありません。 type(pcall)、pcall == nilのような存在確認と、自分で定義した同名ローカルは、禁止語として拒否しません。requireはプロジェクトの静的リンクが処理するもので、実行環境にファイル読み込みを開放する意味ではありません。 input.*/output.*はonTickでの使用を前提に診断します。ゲームの動作規則と、ツール側の静的に判断できる範囲は区別してください。

意味保存モデル

StormMin はパース後に lexical binding を解決し、最適化の同値性判定には文字列名ではなく解決済みの binding identity を使います。そのため math、screen、input、output、property などと同名のローカル変数や引数は、それらをシャドウしている限り builtin として扱われません。 主に次を解析した上で最適化を行います。
  • binding の read/write
  • ユーザー定義関数呼び出し/builtin 呼び出しの区別
  • 順序付きの screen 副作用
  • 例外が発生しうるかどうか
  • コールバック内での安定性
screen.setColor/screen.draw* は順序付き副作用として扱われます。評価回数・評価順・例外発生位置を変える最適化は、必要な証明条件を満たさない限り採用されません。
pass ごとの ON/OFF(passToggles)は通常のチューニングつまみではなく、問題が見つかった場合の一時的な回避手段として提供されています。

動的な_ENVと外部の名前

_ENV[name]は有効なLuaです。警告を出しただけでグローバル名を変えてよい、という意味ではありません。ソース内で代入されない外部グローバルを別名へ変えたり、未知の外部値をnilだと決めつけたりしません。 _ENVの動的アクセス・別名化・再束縛を含む場合、現在の実装は字句短縮だけを行います。識別子、リテラルの綴り、順序、元の行番号を保持し、コメントと余分な区切りだけを減らします。拡張環境・ホスト関数の置換も同じ保守的な経路を使います。 結果のconservative-minification診断とsearch.mode: "lexical"で確認できます。property固定化やAST最適化は適用されず、目標サイズを超えても意味を変える探索へ切り替えません。元コードにある実行時エラーを解消したり、動的な参照先が必ず存在すると保証したりする機能ではありません。

数値モード

  • tolerant(既定): numericTolerance.abs/.rel の範囲内の近似を許可します。
  • exact: 近似やユニット再スケーリングなど、exact semantics を保証できない次のパス を強制的に無効化します。
pack/unpack、ビット演算、インデックス、numeric-for の境界値など、exact route に到達する binding は tolerant モードでも近似の対象になりません。