Hatena::ブログ(Diary)

あどけない話

2009-04-14

DMD

プログラミング言語Dホームページを久しぶりに読んでみると、Mac 用のDMDがリリースされていて、びっくりしました。早速、インストールしてみましたが、インストール方に書かれている内容があまりにも適当なので、僕がやった作業を書き記しておきます。

設定ファイルの作成

ライブラリなどは /usr/local/d にインストールすることにして、以下のような /etc/dmd.conf を作成します。

[Environment]

DFLAGS=-I/usr/local/d/phobos -I/usr/local/d/druntime/import -L-L/usr/local/d/lib

コマンドのインストール

dmd/osx/bin の dmd, dumpobj, obj2asm を適当なディレクトリにコピーします。

% cd $ANYWHERE/dmd/osx/bin
% sudo cp dmd dumpobj obj2asm /usr/local/bin

ライブラリなどのインストール

dmd/osx/lib を /usr/local/d にコピーします。

% cd $ANYWHERE/dmd/osx
% sudo cp -r lib /usr/local/d

dmd/src/druntime と dmd/src/phobos を /usr/local/d にコピーします。

% cd $ANYWHERE/dmd/src
% sudo cp -r druntime phobos /usr/local/d

動かす

dmd には "-l" オプションはありませんし、アーカイブ拡張子は ".a" に限定されています。そこで、Mac の ".dylib" をリンクするには、作業ディレクトリからリンクしたいライブラリへ、".a" という名前でシンボリックリンクを張る必要があります。

2008-05-13

Mac で DMD 2 相当の GDC

Mac で動く D 言語の実装は、GDC のみです。あるプログラムを書こうとして、std.getopt がないことに気付き、がっくり来ました。

std.getopt は、最近実装されたライブラリのようで DMD 2 にしか入っていません。いろいろ調べた結果、SVNGDCDMD 2 に対応しているようだったので、取って来てコンパイルしてみました。

まず、GDCSVN で取り出します。

% svn co https://dgcc.svn.sourceforge.net/svnroot/dgcc dgcc

次に適当なところから GCC を入手します。僕は、gcc-core-4.1.2.tar.bz2 を使いました。

GDC を展開し、GDCディレクトリをコピーします。

% bunzip2 -c gcc-core-4.1.2.tar.bz2 | tar xvf -

% cd gcc-4.1.2

gcc-4.1.2% cp -r $(パス)/dgcc/trunk/d gcc

あとは、INSTALL に従って、コンパイルするだけです。後でさくっと消せるように、/usr/gdcインストールすることにしました。

gcc-4.1.2% ./gcc/d/setup-gcc.sh --d-language-version=2

gcc-4.1.2% ./configure --prefix=/usr/gdc --enable-languages=d

gcc-4.1.2% make

gcc-4.1.2% sudo make install

仕上げで PATH に /usr/gdc を通せば OK です。

Mac でも std.getopt が使えるようになって幸せです。

課題

以下のリンクエラーは、まだ消す方法が分りません。

indirect jmp without `*'

2008-05-04

D で契約プログラミング

プログラミング言語 D で、Design by Contactにある例題を実装してみて気付いたこと。

エラー・メッセージ

assert にひっかかったときに表示されるメッセージが貧弱。 (ショボーン)

Error: AssertError Failure dbc.d(26)

まぁ、debug と組み合わせるといいのかな? (面倒だけど。)

out {
  debug(1) {
    writefln("count: " , count);
  }
  assert(count >= 0);
}

古い値

Eiffel でいう old は、どう書くんだろうと調べてみたところ、D’s design by contract is missing ”old”?で議論されているように、書けないみたいです。使えなーい。

せめて、in と out のローカル変数のスコープが一緒なら、以下のように書けて、よかったのにぃ。

in {
  int oldcount = count;
}
out {
  assert(count == ++oldcount);
}

2007-12-05

今日の MacPorts

来たー! 今日の sync で、GDCインストールできるようになりました!

これで、D 言語を勉強できるよ!