ヨーキョクデイ

いろいろ雑食

std.stdio の write 系関数と invariant(char) / immutable(char)

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(ブログ) で語られていた。