>>  Main > Diary > 0803

日記

2008年02月

2008年03月

2008/03/05(水) 明日からスキーしてきます。内容とは関係ないけど。

Tango 0.99.5 Jascha リリース
http://dsource.org/projects/tango/forums/topic/409
Tangoの最新版がリリースされました。
今回のバージョンからXMLの利用が可能となっています。

ためしにDOMのほうを使ってこんなコードを書いてみました。
import tango.text.xml.Document;
import tango.text.xml.XmlPrinter;
import tango.group.file;
import tango.group.stream;

void main()
{
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    // 生成のテスト
    
    // XMLドキュメント生成
    scope doc = new Document!(char);
    // 出力先はとりあえずバッファ
    // これをFileConduitとかにすればファイルに出力できる
    // Cout.stream なら標準出力に…
    scope buf = new GrowBuffer(4096, 1024);
    // 出力用のストリーム作成
    scope fmt = new FormatOutput(buf);
    // XMLのヘッダを作成
    doc.header;
    // この辺はドキュメントからぱくった。
    // 次のようになる。
    //
    // <element attrib1="value" attrib2="">
    //   <child>value</child>
    // </element>
    doc.root.element( null, "element" )
        .attribute( null, "attrib1", "value" )
        .attribute( null, "attrib2" )
        .element( null, "child", "value" );
    
    // 出力するときはXmlPrinterなるものを使用。
    scope dXmlPrinter = new XmlPrinter!(char);
    // 出力。
    fmt(dXmlPrinter(doc)).flush;
    
    
    
    // 読み込みのテストのために、
    // もう一個XMLドキュメント生成
    scope doc2 = new Document!(char);
    // バッファから書き込まれた文字列をすべて取り出す。
    // ぶっちゃけこれをするなら
    // auto str = dXmlPrinter(doc);
    // でOK
    auto str = cast(char[])buf.slice;
    // パーズ
    doc2.parse(str);
    
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    // アクセスのテスト。
    
    
    // アクセスの際にはそれぞれ foreach を書かなきゃいけない
    // …めんどい。
    // なんとかならんの?これ。
    bool dPassed = false;
    foreach (node; doc.query["element"]["child"])
    {
        assert( dPassed==false );
        dPassed = true;
        assert( node.name == "child" );
        assert( node.value == "value" );
    }
    assert( dPassed );
    
    // こんな関数を作ると楽にアクセスできるかも?
    // というか、 first, last, nth, opIndex のあたりは
    // アクセス利用でももっと簡単にしてほしいかも。
    alias Document!(char).Node Node;
    alias XmlPath!(char).NodeSet NodeSet;
    static Node getNode(NodeSet set, int idx=0)
    {
        foreach (node; set.nth(idx))
        {
            return node;
        }
        return Node.init;
    }
    auto node = getNode(doc2.query["element"]);
    assert( node.name == "element" );
    assert( node.getAttribute("attrib1").value  == "value");
    assert( node.getAttribute("attrib2").value  == "");
    node = getNode(doc2.query["element"]["child"]);
    assert( node.name == "child" );
    assert( node.value == "value" );
    
    // むしろ query からじゃなくて、 root からたどるべき?
    // でも、rootが "element" じゃないのか…?
    // とりあえず root.firstChild が一番最初のノードらしい
    node = doc2.root.firstChild;
    assert( node.name == "element", node.name );
    assert( node.getAttribute("attrib1").value  == "value");
    assert( node.getAttribute("attrib2").value  == "");
    //node = node.firstChild;
    //assert( node.name == "child", "なぜかダメ。" );
    //assert( node.value == "value", "なぜかダメ。" );
    
    version (FileOutput)
    {
        // ファイルに書き出す場合はこう。
        // ヘッダを書き込み。
        doc2.header;
        scope dXmlPrinter2 = new XmlPrinter!(char);
        scope strm = new TextFileOutput("test.txt");
        strm(dXmlPrinter(doc2)).flush;
    }
}
う~ん、もうちょっとインターフェース良くなるといいんだけど…
とりあえずは、できるみたい。

2008/03/09(日) 帰ってきました。でも日記の内容は関係なかったり

D言語がバージョンアップしました。
http://www.digitalmars.com/d/2.0/changelog.html
今回のバージョンアップで、構造体にデストラクタが使えるようになりました。
他にはPhobosのアップデートが中心です。
また、今回のアップデートによって、PhobosのThreadの致命的バグが取れたそうで、安心して使えるようになった…とのこと。試していないけど。
D1.0系のほうは、バグフィックスが中心。目立った変化はなしでした。


しっかし、こういう更新が中心になると、Blogとかのほうがわかりやすいよなぁ…移転するかなぁ…

2008/03/11(火) 久しぶりの更新

久しぶりに⑨でもわかるパチュリーのD言語講座を更新しました。
今回は Tango のIO関係の話について触れました。
文章書くよりアイコン決めるほうが面倒だったり…

第04講 TangoのIO
ここから見ることができますよ

TangoのIOは、 opCall 以外は割と使いやすくて、わかりやすい印象です。
opCall自体も、慣れると割と使いやすかったりしますが…
けど、どっちかっていうと C++ の << のオーバーロードのほうがしっくりくる気もします。
<< を忌避して opCall 使ってたんじゃ結局同じ気もしますしね…

2008年04月

Copyright©SHOO All rights reserved. / LastModified : 2008/03/31(月)[06:40:16.518]