GCのせい?
“Lisp as an Alternative to Java”のお題を Squeak Smalltalk で - Smalltalkのtは小文字ですに習ってioで挑戦中なんだけど、どうも挙動が…。
方針としては、マッピングに列挙された文字オブジェクトそのものに、対応する数値を入れた"asDigit"スロットを追加する。結果的には、全てのアルファベット1文字からなる52個のオブジェクトに"asDigit"スロットが追加される。で、文字列のプロトタイプオブジェクトに"asDigits"スロットを追加し、構成する文字の"asDigit"スロットの数値を連結して返却する。
ちょっと乱暴だけど、プロトタイプベースっぽい感じで実装してみるテストです。
で、結果が下のコードです。
list("E","JNQ","RWX","DSY","FT","AM","CIV","BKU","LOP","GHZ") map(seq, list(seq, seq asLowercase)) foreach(i, l, l foreach(seq, seq foreach(c, c asCharacter asDigit := i asString ) ) ) Sequence asDigits := method( r := "" asMutable self foreach(c, if(c asCharacter hasSlot("asDigit"), r append(c asCharacter asDigit at(0)), r)) r )
ところが、挙動を調べてみると、以下のように、途中で"g"オブジェクトの"asDigit"スロットが消失してるわけ。
2つめのまでは"g" asDigitは存在するけど、3つめの"hoge" asDigitでは既に消えていて、再び"g" asDigitとすると「そんなスロットねーよ!」と怒られました。
Io> "g" asDigit ==> 9 Io> "g" asDigits ==> 9 Io> "hoge" asDigits ==> 80 Io> "g" asDigit Exception: Sequence does not respond to 'asDigit' --------- Sequence asDigit Command Line 1
GCの影響…なんだろか。
と言うところまで。