Prog

Non Virtual Interface

「Exceptional C++ Style」を買って読んだ。 C++ In Depth シリーズはたまに読むが買ったのは久しぶり。「Effective C++」の3版も出ていてこちらも欲しいのだが、2版とダブる項目多いだろうし、立ち読みしてみると、丁寧語で書かれていてユーモアの部分がカ…

インスタンスメソッドのタプル化

構造体やクラスには tupleof プロパティがあるがこれは、フィールドつまりデータメンバに関してのみ取り出せる。しかし function や delegate も型であり値を持つわけだから、インスタンスメソッドや、static メソッドをタプル化することもできる筈である。 …

とりあえずめでたい

Ver-1.00 リリースおめでとさんです。 でも、今後大きな仕様追加がされない思うとちと残念な気もする。TIOBE Index | TIOBE - The Software Quality Companyとか見ると、いい線いってますな〜。 どんだけ C# にせまれるか。PS. id:shinichiro_h さん、monooki…

値オブジェクトのオーバーライド

え〜、まず CopyTuple の修正。 template CopyTuple(Values...) { void to(Types...)(inout Types lhs) in { static assert(Values.length <= lhs.length); } body { foreach (i, v; Values) lhs[i] = v; } }で、次に Object のオーバーライドについて。Obje…

Tuple で遊ぶ

Ver-0.174 が出て、嬉々として遊んでいる人多いだろうな、と思いながらこれを書いている。さて Tuple である。 std.typetuple には template TypeTuple(TList...) { alias TList TypeTuple; }というテンプレートがあるが、これは引数を型か値か特定していな…

Tuple恐るべし

Ver-0.174 がリリースされた。それに伴い、11/11 のコードで writefln(TA.length); writefln(typeid(TA)); writefln(typeid(TA[0])); writefln(typeid(TA[1])); writefln(typeid(TA[2])); ... 3 TypeInfo TypeInfo[0] TypeInfo[1] TypeInfo[2]だったのが、 3…

可変個型引数あれこれ

昨日のちょっと修正。 char[] ToString(T1, T2, TA...)(T1 value1, T2 value2, TA values) { const char[] delim = ", "; char[] buffer = ToString(value1) ~ delim ~ ToString(value2); foreach (v; values) { buffer ~= delim; buffer ~= ToString(v); } …

まとめて配列

しばらく更新しない間にD言語の方が更新されていた。 遅延評価はなにやらすごそうだけど、価値が判断できん。(Haskell知らないので) 配列リテラルと、可変個テンプレート型引数が嬉しい。で、こんなのを作ってみた。 char[] ToString(T1, T2, TA...)(T1 val…

配列の共有

配列をラッピングして共有するためのクラスを作った。 なんでこんなものを作ったかと言うと、配列の共有のされ方が ハンパだからである。 char[] ar1 = "ABC"; char[] ar2 = ar1; // 配列を代入 assert(ar1.ptr == ar2.ptr); // この時点で2つの配列は同じ…

STLとDTL

なんか、id:shinichiro_hさんがトラバってくれてるので、STLの functional のポーティングしたのとか。 ちなみに id:shinichiro_h がせっかく教えてくれた mem_fun はまだ未実装m(__)m。 型コンテナ使った、汎用ファンクタも未実装。 ポーティングの際には、…

InExpression

Ver 0.160 がリリースされた。 更新履歴を読む。 Added operator overloading of InExpression. ほー、in 式 のオーバーロードがサポートされたんだ。 連想配列をラッピングしたクラス定義が完璧にできるな。 さっそくお試し。 import std.stdio; import std…

typelist と mem_fun

Loki の Typelist、誰か実装してくれてないかな〜、と思っていたら、 2004-01-16の方で、やってくれてました。 チェックが足りん。 ん〜、シンプルで美しいですね。 私は、Typelist の中身を型 alias 2つにして、できねぇできねぇ言ってたんですが、これ見…

汎用ファンクタ

できないと言っていた汎用ファンクタができてしまった。 ArgType の定義で、インスタンス化した TypeArray.typeAt に typeof をかけているのがミソ。 (TypeArray の定義は 5-23 のと同じ) module doki.functor; import doki.typearray; class Functor(R, A…

型コンテナ(ナサケナVersion)

Loki の Typelist をD言語にポートし、可変個型引数を実装できないかな〜と思った。 だがやってみると難しく、Length と TypeAt すら実装できずに挫折した。 (誰かやった人はいないのかしら?) で、代わりに作ったのが以下のような羅列型のテンプレート。 …

比較関数つきsort

最近、STLをD言語へポーティングするみたいな作業をしている。 DTLがあるじゃないかと言われそうだが、DTLは bind2nd など足りないものが多い。 D言語組み込みの動的配列と連想配列だけでコンテナはすませようと思ってるので iterator もポーティングする気…

連想配列の同一性

奇妙な現象に遭遇したので報告。 配列へのユーティリティ的なテンプレートをいろいろ書いていたが、連想配列についてはあまり追加したいほどの機能はあまり見当たらない。連想配列は辞書的な使い方が殆どだから、挿入、取出し、検索ができれば十分なので、組…

配列にメソッド追加

id:kurimura さんとこの 2006-02-08の第1引数が配列の関数は、配列のメソッドのように扱えるというの。 これがなんと template でもできた。 しかも ver0.149 から template の暗黙のインスタンス化がサポートされたので、記法もシンプル。 template max(T) …

interface と Object

なんのことはない。 interface は Object に(明示的に) cast できた。2006-3-20 に書いた interface は Object として扱えないという問題も cast すれば殆ど問題にならない。それにともない、もう変えないと言っていた文字列化関数を更新した。 interface の…

Double meaning of "auto"

まずコード import std.string; import std.cstream; import std.windows.charset; char[] _TEXT(char[] s) { return std.string.toString(toMBSz(s)); } class C { private char[] value; this(char[] value) { this.value = value.dup; } ~this() { dout.w…

配列の共有

D言語のリファレンスページを読んでいると、なにげに char[] a = new char[20];という記述が目に入った。そっか配列を new する手もあるのだな。 new はポインタっぽいし、動的配列は宣言後追加か、Wikiに載ってる配列リテラルを使ってばっかしいたので、あ…

文字列化関数(もう変えない)

構造体だろうが連想配列だろうが何でも文字列化するための関数テンプレートだが、今後とも使用すること多いので、最新版をあげておく。 完全版とは言い難く、static if なんかで分岐するよりも、同名のディスパッチで分けるもんだろうが、本人不都合はないし…

参照恐い

D において変数を同じ型の別の変数へ代入したとき、 ・基本型、構造体は値渡し ・class 型は参照渡し でコピーが行われる。 このことに曖昧さはない。 曖昧なのは配列のコピーである。 以下コード。 import house.tostring; struct S { private char[] value…

interface

D の interface は Java のと違う。 Java の interface は Object として扱える。 interface I { } class InterfaceTest implements I { private int id; InterfaceTest(int id) { this.id = id; } public static void main(String[] args) { InterfaceTest …

ver-0.150

土曜日も仕事されているのですね。 ご苦労様です。 string.*の関数をstd.stringから、std.c.stringに移動 とあるので、あぁソースの修正が必要だ、と思ってしまった。 よく見ると string.「h」の関数をstd.stringから、std.c.stringに移動 なので、std.strin…

ver0.149

連想配列を攻撃してハイになっている間に、D言語のバージョンが上がっていた。 今回は、暗黙のテンプレートインスタンス化機能がついにサポートされた。 喜んでる人多いですな。 さっさとDLしてやってりゃ、3/7の日記もだいぶコード量減ってたなぁ。 型汎用…

連想配列への攻撃

マップの実装には大きく分けて、ハッシュテーブルと平衡2分木の2つがあるらしい。ハッシュテーブルは java.util.Hashmap や Hashtable、2分木は、java.util.TreeMap や C++ の std::map などがある。2分木の方は大小比較という相対評価だが、ハッシュテ…

配列のnullチェック

返事が遅れましたが、ideoさんからトラバいただきました。ありがとうございます。 h_sakuraiさんからも過分な評価をいただきありがとうございました。で、以下は 2/22の日記の kurimura さんからのコメントへのお返事(遅い) array = x[y .. y] とか, array…

配列あれこれ

配列のプロパティに max と min がないので不思議に感じた。 sort プロパティがあるのに、である。 sort ができるってぇこた大小比較をしているんだから、配列内の max や min を返すことはできそうに思える。 で、自分で作ってみることを考えると何故だかわ…

文字列化できた

文字列化できる型の文字列化テンプレートがようやくできた。 template ToString(T) { char ToString(T value) in { static assert (!(is (T == union))); static assert (!(is (T == function))); static assert (!(is (T == delegate))); } body { static i…

またまた文字列

いいかげん、D言語ネタは他にないのかいという感じであるが、またぞろ文字列化関数テンプレートの改良版。 template ToString(T) { char ToString(T value) in { static assert (!(is (T == union))); static assert (!(is (T == function))); static assert…