DMD 2.025 で実験したこと。
std.stdio の write 系関数に invariant(char) や immutable(char) を渡すと、それが表す文字ではなくその文字の ASCII コードが表示される件。つまり、「文字」としてではなくただの整数として扱われているかもしれないということ。
import std.stdio; void main(){ char a = 'a'; const(char) b = 'b'; invariant(char) c = 'c'; immutable(char) d = 'd'; writeln(a, b, c, d); writefln(a, b, c, d); writefln("%s%s%s%s", a, b, c, d); string s = "abcd"; foreach(e; s){ // 型推論で e は immutable(char) write(e); } writeln(); foreach(char e; s){ write(e); } writeln(); }
この出力結果は次のようになる。
ab99100 ab99100 ab99100 979899100 abcd
これはひどい。普通の人は次のように出力されてほしいはず。
abcd abcd abcd abcd abcd
気をつけよう。
既出かもしれないなぁ。
追記。ソースを追ってみたら formatGeneric がアレゲっぽいのでググってみた。Memory Over:StringIO on D - livedoor Blog(ブログ) や Memory Over:再・writef - livedoor Blog(ブログ) で語られていた。