D言語
合っているかは知らね。 import std.stdio, std.typetuple; class A{ private int _x = 10; int x(){return _x;}; } class B{ private int _x = 5; int x(){return _x;}; } class C{ private int _x = 2; int x(){return _x;}; } interface IDuck(string rty…
Would you do anything differently in the development of D if you had the chance? I'd be much quicker to turn more of the responsibility for the work over to the community. Letting go of things is hard for me and something I need to do a lo…
http://code.google.com/p/dxpcom/ いくつか気になる点はあるものの良さげ。後で試す。
1系の最新版の結果出してみようとソース落としてみたけど、思ったよりソース多く実行してみたら時間かかりすぎワロタ。手に負えない。やっぱコンパイル早くても分割ならこんなもんか。同一プロセスで複数コンパイルできればいいのに>dmd。
__vptr (invariant(void*)*)と__monitor (void*)。 module test; import std.stdio; class Foo{ int x=10; int baz(){return x;} } class Bar{ int x=10; int baz(){return x+10;} } void main(){ auto foo = new Foo; (cast(void function(Foo f))foo.__vpt…
エラーに行番号が無いのの修正が中心ぽ。他にも重要なバグが大量に修正されている。 文字列mixinのネストが出来るようになったのが大きい。とはいえ、使いどころ分からんが。 typeof(型)がエラーになったらしい。あとでブログの記事修正しないと。Done typeo…
タプルの生成ぐらいしか無い気がする。だいたいは関数のコンパイル時実行でおkだし。
dmdをリコンパイル可能にしてくれとの話の流れで空気読まずにランタイムコンパイルの話だしたら、Article first draft: The Joy and Gibbering Terror of Custom-Loading Executablesってスレッド教えてもらった。それはいいんだが、そのコードのエラーの部…
これはエラーだが… import std.stdio; alias "foo" foo; // エラー void main(){ writefln(foo); } 以下は通る。 import std.stdio; template bar(alias x){ alias x bar; } alias bar!("foo") foo; // OK void main(){ writefln(foo); } とはいえ、enumがあ…
凄い凄い。テンプレート周りのバグ修正、新機能。 ニュースフォーラムでも話題でてるけど、auto foo()(){return 10;}と書ける。 関数テンプレートにはif付けられないんだな。まぁ二つの文に分ければうまくいくけど。 expression.dにif使ってみたけど何かおか…
一体何が起きた???? その他にも調子悪いし…。
BOOST MPLのようにできるかなと思ったけど、実装方法的に無理っぽい。むー。 いまいち使いこなせないなぁ > ドキュメンテーションコメント。
実行ファイルを作るときに生成されてた多数のオブジェクトファイルが一個にまとめられた。邪魔なオブジェクトファイルが無くなって楽。なんかバグってるような気もするけど。 一発でライブラリ作成できるようになった。ライブラリの生成が三倍早いらしいが良…
opDotの実装の仕方がちょっと想定外だった。alias thisの代わりになったのかな。派生時に異なるのでalias thisの方が良いと思った(以下)。あと最適化がちゃんとされるか。 import std.stdio; interface I{ int x(); } class A{ int x(){return 0;}; } class …
昨日書いたこのコード、非末尾再帰からループにした形だけど、うまくESP/EBPを使ってくれるなら、呼び出しが無い分早く動くと思った。フィボナッチ数列をアセンブラcall無しで書ける予感。 #!/usr/bin/dmd -run import std.stdio,std.cstream,std.stream,std…
作って使ってみたもののmysortではテーブル引きより遅くなるなぁ(実際のコードはこのとおりでは無いから単純比較はできないけど)。 !!ってどうなってるのか気になったのでアセンブラも調べてみた。 uint ntz(uint x){ if(!x) return 32; x = x&(-x); uint rv…
ローカル変数のalignに対応してない? (align付きのstructを使えばいいのだろうけど) インラインアセンブラを使った関数は-inlineを付けてもインライン化してくれない? インラインアセンブラはレジスタの自動割り当てが使えない。 gdcならgasとalways_inline…
式テンプレートの上にライブラリ作ろうとしたら重要な問題が発覚した。 関数の依存性を外すことができない。対応するにはオプティマイザ外さないといけないはず? 実装しようとしてみたら"Error: variable _N is used before initialization"。分け分からん。…
意図してなかったのに、こんなコードも通ることに気づいた。 writefln((_0+_1)(_0-_1,_0)(4,2)); ってことで、こんなコードも通る。 auto add = _0 + _1; auto sub = _0 - _1; writefln(add(sub(_1,_!(2)),_0)(2,3)); 関数合成ktkr。 f!(writefln)(f!((int a…
ああ、言語の壁! 表現の壁! コンパイラのバグ! http://www4.pf-x.net/~nazodane/cgi-bin/index.cgi?mode=upload:show&name=expression.d 英語が怪しいのはいつもの事として、コンパイラのバグがどんどん浮いてくるなぁ。 あとopReturnType*が構文の都合上で…
メモリがワーストケースでもn*32で良くなった。入力バッファに出力するようにしたので、配列スライスやGCの無いC言語でも実装できるようになった。高速化した。まだ一ヶ所高速化途中の箇所あるけどもういいや。 速度的には、D言語の内部ソート(独自実装のqso…
重ねたテーブル使ってみた。遅かったのでインラインアセンブラで書き直したら早くなった。コンパイラは当てにできないなぁ。 invariant ubyte[152] table=[ 0, 0, 1, 0, 2, 0, 8, 9, 3,10, 0,16,17,11,18, 0, 4, 0,19, 0, 0,12, 0, 0,24,25,20,26, 0, 0, 0,2…
O(n)で打倒qsortを目指し。勝てないなぁ。 アルゴリズム考えてるときから分かってたけど、メモリ喰いまくり。ワーストケースでn*33bytesも喰う。 あとntzはもっと早く求めることできる気がする。 uint bit_count(uint bits) { bits = (bits & 0x55555555) + …
↓勘違いしてる。uint[] nextを使えばオブジェクト毎ソートできる。 import std.stdio; int[] mapsort(int min, int max)(int[] arr){ size_t[max-min+1] len; foreach(i;0..arr.length) len[arr[i]-min]++; size_t c; foreach(i;0..max) foreach(j;0..len[i]…
負数は未対応。 import std.stdio; uint[] sort(uint[] arr){ scope uint[] buf = new uint[arr.length]; foreach(k;0..uint.sizeof){ size_t[0x101] count; foreach(a;arr) count[((a>>(8*k))&0xff) + 1]++;//FIXME: 0xffの時は数えなくていい。 foreach(i;…
IFTI implicit function template instantiation
structにデストラクタとコピーコンストラクタが付いた。C++との完全互換でも目指すつもりだろうか。もしそうならオペレーションオーバーロードが鬼門になりそうだが…。 >Added compile time error for comparing class types against null. は解説待ち。if(i…
次に、実装していきます。まずは、引数の制限を追加します。 string multiReplace(repstrs...)(string s){ /*static */assert(~repstrs.length & 1, "invalid repstrs.length"); mixin(genMultiReplaceCode(s.stringof, [repstrs])); } バグでstatic assert…
まず雛形とテストケースを作ります。名前はreplace.dとします。コンパイル及び実行はrdmd -unittest replace.dで行います。ちなみにこのテストケースはまだ抜けが多いということを覚えておいてください。 module replace; import std.stdio; /* * multiRepla…
.replace("",">")がうまく最適化される世の中なんて無い。最適化を研究してけばできるのだろうけど、個人的にどのコンパイラも文字列まわりの最適化の実装は遅れてる印象がある。というかあまり聞いたこと無い。ということで黒魔術っぽいmixinで解決しましょ…