ifが返す値の型はそろえないとダメ
ABCプログラマのみなさん、こんにちは。ABCは文書化されていない仕様が多いことで有名ですけど、今日もひとつ新しい仕様を発見しました。
if式(?:演算子)が返す値の型は統一しないといけないみたいです。
ダメなやつ
(if #t (f) 10)
自前の処理系であるHappyABCでこれをコンパイルすると、以下のようなエラーがでる。
VerifyError: Error #1068: int and * cannot be reconciled.
いろいろ試したところ、Any型の(f)とint型の10を混ぜて使っているのが問題っぽい。
2 pushtrue 3 iffalse L1 7 findpropstrict f 9 callproplex f (0) 12 jump L2 L1: 16 label 17 pushbyte 10 L2: 19 label
OKなやつ
対応するActionScriptのコードをコンパイルしてみる。
true ? f() : 10;
ダンプすると、coerce_aでAnyにキャストしている。たぶんこれがポイント。
8 pushtrue 9 iffalse L1 13 findpropstrict f 15 callproperty f (0) 18 coerce_a 19 jump L2 L1: 23 pushbyte 10 25 coerce_a L2: