DMD 0.170 -> 0.171 -> 0.172 [D言語]
Thunderbird のニュースグループ購読に前回の記事のD言語ニュースグループを追加してみたのだけど、その最近のスレッド。
2006/10/17 18:53 DMD 0.170 release
2006/10/18 16:23 DMD 0.171 release
2006/10/19 07:42 DMD 0.172 release
3つ目のポストの本文は "Try again." だった。
これは昔から追いかけてきた early adopter でもない限り途中から乗っかることは到底できないな…
(その種の人たちしかついてこない構図を作るのはそのソフトウェアにとっての先細りを意味するものでもあると思う。余計なお世話かもしれないけど)
CライブラリのDバインディング [D言語]
comp.lang.tcl 経由で読んだD言語メーリングリストのスレッド。
http://lists.puremagic.com/pipermail/digitalmars-d/2006-October/008776.html
Tk を D の GUI ライブラリにすればいいんじゃないの?という提案に、リプライした人が見事に全員興味なしという。
D/Tk はともかくとして、その興味なしの人の一人がこのスレッドで D から Tcl を呼ぶコードを作って見せたりしているのが目に付いた。
そこでちょっと疑問に思ったのは、今までD言語へのCライブラリバインディングはおそらく数多く作られてるんだろうけど、ヘッダファイルの変換―D は C とバイナリ互換らしいからきっと基本的にはヘッダファイルの変換だけですむのだろう―はバインディングを作る人たちがそれぞれ自前のノウハウでやっているんだろうか。それともD言語の歴史の中でそういったことを簡単にするツールが確立しているのかな。
EndianStream [D言語]
Dの標準ライブラリ (Phobos) の EndianStream というクラスが便利そうだ。というかD言語以外でも似たようなものがあるのかもしれないけど。
要はストリームのエンディアンを指定してあげるとシステムエンディアンに合わせてひっくり返すなりそのままで通すなりということをしてくれる。
import std.cstream;
import std.system;
int main(char[][] args)
{
File o = new File("a.tmp", FileMode.Out);
o.printf("\x01\x02\x03\x04\x05\x06\x07\x08");
o.close();
{
File i = new File("a.tmp", FileMode.In);
ushort x, y; // 16bit
uint z; // 32 bit
i.read(x);
i.read(y);
i.read(z);
printf("%04x, %04x, %08x\n", x, y, z);
i.close();
}
{
File j = new File("a.tmp", FileMode.In);
EndianStream i = new EndianStream(j, Endian.BigEndian);
ushort x, y; // 16bit
uint z; // 32 bit
i.read(x);
i.read(y);
i.read(z);
printf("%04x, %04x, %08x\n", x, y, z);
i.close();
}
return 0;
}
これを Windows でコンパイルして動かすとこうなる。
0201, 0403, 08070605 0102, 0304, 05060708
ただし下の例では i と j のどちらを close するのが正しいのだろうか?というのがいまいちよくわからない。
printf の第2引数に文字列リテラルを渡すと実行時エラーになる [D言語]
こんなコードを書いた。
import std.system;
int main(char[][] args)
{
printf("sytem endian=%s\n",
endian == Endian.BigEndian ? "BigEndian" : "LittleEndian");
return 0;
}
その結果
sytem endian=Error: Access Violation
うーん、なんでダメなの。
ていうか、ひょっとしたらCでもダメなんだっけ?と思ってCで同じようなことをやってみたけど普通に動く。
D言語の仕様?Dコンパイラのバグ?
D言語の Hello World に思いのほか苦戦 [D言語]
去年そんなに深くやりこむつもりでもなく買った「D言語パーフェクトガイド」という本があるのだが、最近ちょっと D への興味が出てきたので付属CDでDコンパイラを入れて触ってみることにした。
何はなくとも Hello World というわけで、こんなのを打ち込んで実行する。
import std.stream;
int main(char[][] args)
{
stdout.writeLine("Hello World");
return 0;
}
よしよし動くね、とかやっていたのだが D は結構バージョンアップがあるらしい。どうせなら新機能とかも入ってるほうがいいのでウェブサイト [1] から最新のコンパイラを入れなおす。
そこで上記のプログラムをもう一度コンパイルすると…
hello.d(5): undefined identifier stdout hello.d(5): undefined identifier stdout hello.d(5): no property 'writeLine' for type 'int' hello.d(5): function expected before (), not 1 of type int
??? 通らないのだ。
ZIPを解凍するだけでインストールには失敗のしようもない。
ウェブでいろいろ調べてみたらなんとバージョン0.126の更新内容 [2] に以下の記述が。
stream.d:
(snip)
deprecate stdin,stdout,stderr
ええっ。
で、現在は以下の書き方が正しいようだ。
import std.cstream;
int main(char[][] args)
{
dout.writeLine("Hello World");
return 0;
}
つまり std.stream の stdout は廃止になって代わりに std.cstream に dout というのが追加になっているというわけだ。
しかしこの「D言語パーフェクトガイド」を買ったのは去年の話なのだが、 Hello World サンプルが動かなくなるような仕様変更が入るとは D おそるべしである。
[1] http://www.digitalmars.com/d/index.html
[2] http://www.digitalmars.com/d/changelog1.html#new0126