読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

D言語をインストールして簡単にプログラム書いてみた

D-lang

はじめに

こんにちは、情弱D言語erです。先日風邪で2日も会社休むことになったんですが、食欲はあるしベッドにいるだけで暇なのでD言語触ってみました。

参考

日本語情報

あとTwitterで#d_langをつけて質問Tweetすると鬼速で回答が返って来てびっくりする。ありがたや。

インストール

色々と方法はあるのですが、試した結果zipを展開して、適当なディレクトリに突っ込むことにしました。

% mkdir /opt/d && chown ymotongpoo /opt/d
% unzip dmd.2.058.zip
% mv dmd2/osx dmd2/src /opt/d

整理するとこういう状態になった。

% tree -L 1 /opt/d
/opt/d
├── osx
└── src

d-modeの設定

とりあえず最初はSyntax Highlightとauto-indentさえしっかりしててくれたらいいので、下記の設定。スタイルガイドを参考にして4タブ設定。

(autoload 'd-mode "d-mode" "Major mode for editing D code." t)
(setq auto-mode-alist
    (cons '( "\\.d[i]?\\'" . d-mode ) auto-mode-alist))

(add-hook 'd-mode-hook
    '(lambda()
        (c-set-style "python")
        (setq c-basic-offset 4)
        (setq indent-tabs-mode nil)))

コードを書く

FizzBuzzはとりあえず書いたので、何かAPIを叩いてデータを取ってくるコードを書きました。今回は最新のpublicなGistを引っ張ってくるだけの簡単なお仕事。

  • test.d
import std.stdio    : writef;
import std.net.curl : get;
import std.json     : parseJSON;


void curlTest() {
    auto content = get("https://api.github.com/gists/public");
    auto result  = parseJSON(content);
    foreach (ref entry; result.array) {
        string user = entry.object["user"].object["login"].str;
        string url  = entry.object["git_pull_url"].str;
        string date = entry.object["created_at"].str;
        writef("%s (by %s at %s) \n", url, user, date);
    }
}


void main() {
    curlTest();
}

これをコンパイル。微妙にコンパイラオプションで、リンカオプションの渡し方を勘違いしてたのでハマった。-Lはライブラリの探索ディレクトリの追加じゃなくて、リンカオプションの追加だったんですね。

% dmd test -I/opt/d/src/druntime/import -I/opt/d/src/phobos -L-L/opt/d/osx/lib -L-lcurl

これでtestを実行する。

% ./test                                                                               
git://gist.github.com/2403342.git (by 8ig8 at 2012-04-17T03:50:42Z) 
git://gist.github.com/2403340.git (by Aliced3645 at 2012-04-17T03:49:46Z) 
...

とりあえず動きました。これでbuchoライブラリをD言語で実装できますね。

おまけ

ソースからビルドしようとしたらこけちゃいました。たとえばdmdのビルドの場合こんな感じ。実行したマシンはOS X 10.6.8なんですが、なぜかMacOSX10.5.sdkを見に行ってるし。

% make -f posix.mak dmd
MACOSX_DEPLOYMENT_TARGET=10.3 g++ -m32 -isysroot  /Developer/SDKs/MacOSX10.5.sdk idgen.c -o idgen
ld: library not found for -lcrt1.o
collect2: ld returned 1 exit status
make: *** [idgen] Error 1

で、とりあえずposix.makでMacOSX10.6.sdkを見に行くように変更したらビルド出来たんで、バージョン判定のところがおかしいんでしょうね。もうちょっと試して直ったら本家に送ろう。