3-b6. Tangoを試す

初出: 2007/03/07
最新: 2007/04/27
[3. D言語各論] に戻る

Tango とは

Tango とは、現在の D の標準ライブラリ Phobos を置き換えることを目標として新規開発中のライブラリです。

2007/04/27 現在、0.97 RC1 がリリースされています。 機能面で完全に Phobos を置き換えきれてはいない上、Phobos で書かれた 既存のコードが動かなくなったりするので、Tango に移行するのはまだ難しいですが、 とりあえずこんな風味になってるよという感触をお伝えできればと思います。

インストール方法

ダウンロードページ から、zipファイルもしくはインストーラ形式でダウンロードできます。

Tangoは単なる追加ライブラリではなく、コンパイラ付属の標準ライブラリを目指して開発されているものなので、 DMD版のダウンロードページでは、「Tango + DMDコンパイラ」が一括セットになっています。 DMDのインストール手順で、dmd.zip(Phobos+DMDセット)の代わりに このTangoセットを使えばインストール完了です。

ひとつのマシンでPhobosもTangoも両方使いたい場合は、DMDをTangoセットとPhobosセットの2つ インストールすることになります。それを避けたい場合は 切り替えスクリプト を書く方法が紹介されていますので参考にされるとよいかと思います。

tango.io

詳細は Tango API Index をどうぞ。

標準入出力 (LowLevel)

import tango.io.Console;
import tango.text.Util;

void main()
{
    for(;;)
    {
        Cout(`コマンド? `)();

        char[] line = Cin.get(); // 1行入力
        if( line is null )
            return; // EOFだったら終了

        Cout(`入力されたのは"`)( line.trim() )(`"です`).newline;
    }
}

tango.io.Console の Cin と Cout、Cerr が標準入出力です。見ての通りです。 Coutに出力した後に、空括弧 () か、改行 .newline を送らないとフラッシュされません。注意。 あと注目すべきは、少なくともWindows環境では、UTF-8→ShiftJIS変換をやってくれてるみたいです。 Phobosと違って文字化けません。でもLinuxでEUC-JP環境とかだとダメぽい。

標準出力 (HighLevel)

import tango.io.Stdout;

void main()
{
    Stdout( "Coutと" )( "同じ" )( "使い方" ).newline;

    for(int i=0; i<3; ++i) // 文字列以外も自動で文字列化して出力
    for(int j=0; j<3; ++j)
        Stdout( i )( " + " )( j )( " = " )( i+j ).newline;

    for(int i=0; i<3; ++i) // {} の位置を後ろの引数で置き換え
    for(int j=0; j<3; ++j)
        Stdout.formatln( "{} * {} = {}", i, j, i*j );

    for(int i=0; i<3; ++i) // 順番入れ替えもOK
    for(int j=0; j<3; ++j)
        Stdout.formatln( "{2} - {1} = {0}", i-j, j, i );
}

tango.io.Stdout の Stdout と Stderr で、整形出力です。名前のCout/Cerrよりはこっちを使うのが便利ですね。 文字列への変換処理は、tango.text.convert モジュールとして単独でも使えるようです。

標準入力 (HighLevel)

import tango.io.Console;
import tango.text.stream.LineIterator;

void main()
{
    auto lit = new LineIterator!(char)(Cin.conduit);
    foreach(line; lit)
        Cout( ">> " )(line).newline;
}

入力は、StreamIterator というものを使って切り分けて使います。例えば LineIterator は行毎に分割して foreach で回ったり get() メソッドで取ってきたりできるようにします。 指定したデリミタで区切るには SimpleIterator:

import tango.io.Console;
import tango.text.stream.SimpleIterator;

void main()
{
    auto it = new SimpleIterator!(char)(Cin.conduit, " \t\n"); // 空白区切りで
    foreach(tok; it)
        Cout( ">> " )(tok).newline;
}

他に、指定したデリミタで区切りつつ二重引用符 "" でくくった部分は区切らない QuoteIterator と、 正規表現を指定して区切る RegexIterator が用意されています。

一般的に入出力

「Conduit(導管)というオブジェクトがベースで、それを色々ラップして見せる」 というのが tango.io の基本モデルみたいです。

import tango.io.FileConduit;
import tango.text.stream.LineIterator;
import tango.io.Stdout;

void main()
{
    // Fileの入出力にはFileConduit
    auto inp = new FileConduit("in.txt",  FileConduit.ReadExisting);
    auto Fin = new LineIterator!(char)(inp);

    foreach(line; Fin)
        Stdout( "# " )(line).newline;
}

Stdout風の出力を FileConduit に対してつけようと思ったのですが、 それっぽい整形をしているクラスが tango.io.Stdout の中にあったりして、 まだこの辺は整頓されてない雰囲気です。とりあえずimportが長いのがもうちょいなんとかならないかな…。

tango.net

ネットワークに関しては、ごく順当に Socket と SocketConduit が用意されてます。 IOとネットワークについて大きな Phobos との違いとしては、tango.io.selector.* で、 SelectSelector の他に PollSelector, EpollSelector を選べるようになっているようです。 select は遅くて嫌だ派の人には待望の機能かもしれません。

http

他には、http と ftp をしゃべる専用のクラスが実装されてるのが Phobos と比べてのプラスαでしょうか。

import tango.net.http.HttpClient;
import tango.net.http.HttpHeaders;
import tango.io.Stdout;

void main()
{
	auto http = new HttpClient( HttpClient.Get, "http://www.kmonos.net/" );
	http.open();

	if( http.isResponseOK )
	{
		int len = http.getResponseHeaders.getInt( HttpHeader.ContentLength, int.max );
		http.read( (void[] data){Stdout(cast(char[])data)();}, len );
	}

	http.close();
}

tango.text.collection

コレクションクラス色々。インターフェイスは Java 風。うーん?

tango.math.cipher

ダイジェスト関数いろいろ。

tango.math.Random

Phobosと違ってオブジェクトになってるので便利。アルゴリズムは一緒かな。

import tango.math.Random;
import tango.io.Stdout;

void main()
{
    auto r = new Random;
    for(int i=0; i<10; ++i)
        Stdout( r.next() ).newline;
}

tango.core.Thread

のがポイント。

[3. D言語各論] に戻る

presented by k.inaba   under NYSDL.