Hatena::ブログ(Diary)

みずぴー日記 Twitter

2008-11-09(日)

ifが返す値の型はそろえないとダメ

| 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:
トラックバック - http://d.hatena.ne.jp/mzp/20081109/abc