謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

D言語

DuckTyping

合っているかは知らね。 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…

Walterさんのインタビュー

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…

dxpcom

http://code.google.com/p/dxpcom/ いくつか気になる点はあるものの良さげ。後で試す。

dstressが止まっている件

1系の最新版の結果出してみようとソース落としてみたけど、思ったよりソース多く実行してみたら時間かかりすぎワロタ。手に負えない。やっぱコンパイル早くても分割ならこんなもんか。同一プロセスで複数コンパイルできればいいのに>dmd。

dmd 2.016続き

__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…

dmd 2.016

エラーに行番号が無いのの修正が中心ぽ。他にも重要なバグが大量に修正されている。 文字列mixinのネストが出来るようになったのが大きい。とはいえ、使いどころ分からんが。 typeof(型)がエラーになったらしい。あとでブログの記事修正しないと。Done typeo…

再起テンプレートの使いどころ

タプルの生成ぐらいしか無い気がする。だいたいは関数のコンパイル時実行でおkだし。

これはどうなのだろう…

dmdをリコンパイル可能にしてくれとの話の流れで空気読まずにランタイムコンパイルの話だしたら、Article first draft: The Joy and Gibbering Terror of Custom-Loading Executablesってスレッド教えてもらった。それはいいんだが、そのコードのエラーの部…

リテラルのalias

これはエラーだが… 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があ…

DMD 2.015キタコレ

凄い凄い。テンプレート周りのバグ修正、新機能。 ニュースフォーラムでも話題でてるけど、auto foo()(){return 10;}と書ける。 関数テンプレートにはif付けられないんだな。まぁ二つの文に分ければうまくいくけど。 expression.dにif使ってみたけど何かおか…

dmdfeフォルダ吹っ飛んだ

一体何が起きた???? その他にも調子悪いし…。

ドキュメンテーションコメントで演算

BOOST MPLのようにできるかなと思ったけど、実装方法的に無理っぽい。むー。 いまいち使いこなせないなぁ > ドキュメンテーションコメント。

DMD 2.014

実行ファイルを作るときに生成されてた多数のオブジェクトファイルが一個にまとめられた。邪魔なオブジェクトファイルが無くなって楽。なんかバグってるような気もするけど。 一発でライブラリ作成できるようになった。ライブラリの生成が三倍早いらしいが良…

DMD 2.013 ktkr

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…

ntzの別の形

作って使ってみたもののmysortではテーブル引きより遅くなるなぁ(実際のコードはこのとおりでは無いから単純比較はできないけど)。 !!ってどうなってるのか気になったのでアセンブラも調べてみた。 uint ntz(uint x){ if(!x) return 32; x = x&(-x); uint rv…

D言語での高速化の問題点

ローカル変数の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…

式テンプレートをphobosに入れてもらおうと企みつつ整理中

ああ、言語の壁! 表現の壁! コンパイラのバグ! http://www4.pf-x.net/~nazodane/cgi-bin/index.cgi?mode=upload:show&name=expression.d 英語が怪しいのはいつもの事として、コンパイラのバグがどんどん浮いてくるなぁ。 あとopReturnType*が構文の都合上で…

自作ソート続き

メモリがワーストケースでもn*32で良くなった。入力バッファに出力するようにしたので、配列スライスやGCの無いC言語でも実装できるようになった。高速化した。まだ一ヶ所高速化途中の箇所あるけどもういいや。 速度的には、D言語の内部ソート(独自実装のqso…

ntzの高速化続き

重ねたテーブル使ってみた。遅かったのでインラインアセンブラで書き直したら早くなった。コンパイラは当てにできないなぁ。 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]…

radixソート

負数は未対応。 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;…

用語メモ2

IFTI implicit function template instantiation

dmd v2.012

structにデストラクタとコピーコンストラクタが付いた。C++との完全互換でも目指すつもりだろうか。もしそうならオペレーションオーバーロードが鬼門になりそうだが…。 >Added compile time error for comparing class types against null. は解説待ち。if(i…

多段replaceの文字列mixinを使った高速化(3)

次に、実装していきます。まずは、引数の制限を追加します。 string multiReplace(repstrs...)(string s){ /*static */assert(~repstrs.length & 1, "invalid repstrs.length"); mixin(genMultiReplaceCode(s.stringof, [repstrs])); } バグでstatic assert…

多段replaceの文字列mixinを使った高速化(2)

まず雛形とテストケースを作ります。名前はreplace.dとします。コンパイル及び実行はrdmd -unittest replace.dで行います。ちなみにこのテストケースはまだ抜けが多いということを覚えておいてください。 module replace; import std.stdio; /* * multiRepla…

多段replaceの文字列mixinを使った高速化(1)

.replace("",">")がうまく最適化される世の中なんて無い。最適化を研究してけばできるのだろうけど、個人的にどのコンパイラも文字列まわりの最適化の実装は遅れてる印象がある。というかあまり聞いたこと無い。ということで黒魔術っぽいmixinで解決しましょ…