パーレンと中置記法で出てきた YoYoGames 公式ドキュメントで示されているコードについて補足します。
型が一致しない場合のエラーとか
a = ((b == c) || d);
上記式は true
か false
しか返しません。要するにこれは if
ステートメントは別の書き方ができるってことで、
if ((b==c)||d) { STATEMENT; };
これとやっていることは大差ありません。
ただし処理系に依存するため (b==c)
の部分はサンプルとしてちょっと微妙で、型の一致しない変数を等価比較した場合の動作互換性を考慮していないです。
実際に (b==c)
の部分は利用するビルドターゲット毎にエラーが出たり出なかったりします。型の不一致をきちんとチェックする場合と、チェックせず暗黙的にキャストされる場合もあるからです。
例えば HTML5 だと文字列型と数値の等価比較がエラー扱いにならない上、文字列型と数値で型が違っていてもコアーション(coercion=強制型変換)が機能してしまうので
b="100"; c=100; if (b==c)
という記述はエラーが発生せず、かつ (b==c)
は true
です。
var a,b,c,d;
// このコードはHTML5ではエラーが出ませんa="sample";b="100";c=100;d=false;
a=((b==c) || d);
// この部分が本来は変数型の不一致です if a draw_text(x,y,a+"!?");
しかし型の不一致のまま等価比較した場合、Windows PC や Android ではコンパイル後にエラーが出ます。これは型が不一致のまま等価比較したのが原因です。
Invalid comparison type
とエラーメッセージが出ているのが以下のスクリーンショット。
処理系依存について
基本的には HTML5 あるいは Javascript が型の不一致でも等価比較できてしまうから問題なのですが、これはバグではなく言語仕様の差です。そもそも GML はインタプリタなので演算における型の不一致をコンパイル前に検出できません。
しかし特定のスクリプト言語ではコアーション(強制型変換/coercion)があるため、文字列と数値の比較でもへっちゃらだし、文字列と数値を明示的なキャスト無しでも計算に利用できたりします。
("100"+100==200)
これが成り立ってしまう言語(Lua)があるってことです。
ちなみに上記例の場合、HTML5 モジュールでの出力はどうなるかというと
文字列にキャストされました。
そして以下が Lua という計量言語におけるコアーションの結果です。
処理系依存ですが同じ書き方でもエラーが出たり出なかったり、演算結果も違ってきます。GML を使う以上コードの互換性には気を付けたいので、なるべく無難にコードを書いたほうが良いです。
静的型付けな言語だとコンパイルすら通らないのですが、GML は動的型付けなのでビルドして実行するまでデータ型に依存したエラーは検出されないのです。