Concurrent Clean : CleanJ : StdList

次のプログラムの結果が合わない。

Start = avg ['a'..'z']

instance / Char
  where
    (/) a b = toChar (toInt a / toInt b)

CleanJでは、ある程度期待通りの結果なのだけれど、

$ java test03.Avg
'i'

Cleanでは、何か良く分からない文字になる(コントロールコードのようだ)

$ Avg.exe
''
      • -

toIntしたら、CleanJでは「105」だけど、Cleanでは「1」になっていた。

      • -

原因、わかりました。

toInt ('a' + 'b' + 'c')

の結果が、Cleanでは「38」になるのに対し、CleanJでは「294」になっていました。
これは、Cleanの文字型は、1バイトなので、「38 = 294 mod 256」という関係になっていたのでした。
で、CleanJはJavaVMなので、文字型はUTF-16(下記参照)で、2バイトになります。さらに、文字型と整数型がスタック上で同一視されているという観察から、現時点の実装では、スタック上でint型として扱っているので、4バイトとして扱われています。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Character.html

      • -

今のところ、ItoC命令を無視しているのですが、ItoC命令の時に、9bit目以上の桁をクリアする処理を入れてしまうべきかもしれないです。それでも、Cleanとは動作が変わりますが、VMが違って、内部表現が違うことを考えれば、動作が違うのは当然と考えてよいのではないかと思います。