D言語 Part22
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/22(月) 01:38:41過去スレ、関連スレは >>2
■前スレ
http://pc12.2ch.net/test/read.cgi/tech/1234363551/
■本家
ttp://www.digitalmars.com/d/
ttp://www.kmonos.net/alang/d/ (和訳)
■コンパイラ
http://www.digitalmars.com/d/dcompiler.html (DMD, 本家)
http://dgcc.sourceforge.net/ (GDC, gccフロントエンド)
http://www.dsource.org/projects/ldc (LDC, バックエンドにLLVM)
■参考URL
ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究)
ttp://f17.aaa.livedoor.jp/~labamba/?D%B8%C0%B8%ECBOF (D言語BOF)
ttp://dsource.org/ (dsource)
ttp://tinyurl.com/candcpp2d (C/C++に疲れた人のD言語)
ttp://www.kmonos.net/alang/wnd/ (わかったつもりになるD言語)
ttp://shinh.skr.jp/d/ (SDL, SDL_*, OpenGL, GLU, glutのポーティングとか)
ttp://shoo.s20.xrea.com/shoo/programing (D言語とTangoの入門講座)
ttp://www.nicovideo.jp/mylist/4453698 (D言語で作られた芝ゲー niconico動画)
ttp://www.asahi-net.or.jp/~cs8k-cyu/ (ABA Games)
■ IDE
ttp://dronten.googlepages.com/dscite (DSciTE)
ttp://forums.codeblocks.org/index.php?board=20.0 (Code::Blocks)
ttp://www.dprogramming.com/entice.php (Entice Designer)
ttp://www.dsource.org/projects/descent (Descent)
ttp://www.dsource.org/projects/poseidon (Poseidon)
0331デフォルトの名無しさん
2009/07/25(土) 12:25:03向こうのレスにある
> テンプレートとプリプロセッサの黒魔術で無理矢理DSLを作ってどうにかする
だよ。
auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
};
0x風の書き方にするとauto result = linq<"from ... n">というような式で、
linq = テンプレート関数か何かを指すシンボル。
! = テンプレートの明示的インスタンス化。テンプレートパラメタ(cppで言う<>の中身)を続けて書くと括弧が省略できる。
q{ .. } Dで有効なトークンのみを記述することが出来る文字列リテラル(これがテンプレートパラメタ)
linqの中身をコンパイル時または実行時パーサにすると、そういう構文が書けるというお話。
しばらく前にお遊びで作られた黒魔術の一つ。
実用に供すことも可能だが、やった人は知らん。
0332デフォルトの名無しさん
2009/07/25(土) 12:29:39向こうを久方ぶりに見たが、まったく同じ内容のレスがあるとは
0333デフォルトの名無しさん
2009/07/25(土) 12:34:52面白そうだから書いてみた(適当だけど)。ASTマクロが実装されてからが本番だな。
//Public Domain
string[] lexLinq(string code){
string[] r = [""];
foreach(c; code){
if(c == ' ' || c == '\r' || c == '\n' || c == '\t'){
if(r[r.length-1] != "") r ~= "";
continue;
}
r[r.length-1] ~= c;
}
return r;
}
0334デフォルトの名無しさん
2009/07/25(土) 12:36:05string aggregate, variable, condition, item, cur;
foreach(i, a; lexLinq(code)){
if (a == "from" || a == "in" || a == "where" || a == "select"){
cur = a;
continue;
}
if (cur == "from" ) variable ~= " " ~ a;
if (cur == "in" ) aggregate ~= " " ~ a; // 複数の時はstd.rangeに落とすべき
if (cur == "where" ) condition ~= " " ~ a;
if (cur == "select") item ~= " " ~ a;
}
return "
alias typeof({
mixin(\"foreach(index, "~variable~"; "~aggregate~")return "~item~";\");
assert(0);
}())[] ResultType; // イテレータかレンジで返すべき
ResultType r;
foreach(index, "~variable~"; "~aggregate~"){
if ("~condition~") r ~= "~item~";
}
";
}
0335デフォルトの名無しさん
2009/07/25(土) 12:37:33mixin(translateLinq(code));
return r;
}
import std.stdio;
void main(){
auto numbers = [1,2,3,4][];
auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
}(numbers);
writefln(result);
}
0336デフォルトの名無しさん
2009/07/26(日) 01:16:14客層同じだしな
0337デフォルトの名無しさん
2009/07/26(日) 01:32:53GCない方がいいってのはなんでだ?GCあったってリソースの管理くらいできるのに。
0338デフォルトの名無しさん
2009/07/26(日) 01:40:220339デフォルトの名無しさん
2009/07/26(日) 01:42:45そうじゃないからこそ敢えてC++使ってることが多い
0340デフォルトの名無しさん
2009/07/26(日) 02:00:21ところで、GC使えなくてC++使える環境ってたとえば何があるかな?
マイコンとかだとC++すら使えなかったりしないか?
0341デフォルトの名無しさん
2009/07/26(日) 02:01:530342デフォルトの名無しさん
2009/07/26(日) 02:06:20うーん
そういう人は何があっても新しいものに移行しない希ガスるので放っておくしか
0343デフォルトの名無しさん
2009/07/26(日) 02:07:200344デフォルトの名無しさん
2009/07/26(日) 02:07:380345デフォルトの名無しさん
2009/07/26(日) 05:12:580346デフォルトの名無しさん
2009/07/26(日) 17:24:18スレッド毎にコレクトするならいいんだけどなぁ
スレッドローカル仕様になったし、そうなることに期待
0347デフォルトの名無しさん
2009/07/26(日) 19:13:05スレッドごとにコレクトしやすくなるのか
0348デフォルトの名無しさん
2009/07/27(月) 03:16:20どのトピックか忘れたけどSeanが「スレッド毎にGCを動作させるようにする」みたいなこと言ってた気がする
0349デフォルトの名無しさん
2009/07/27(月) 04:50:070350デフォルトの名無しさん
2009/07/27(月) 05:04:21これをchar[]型にコピーする最も簡単な方法は何ですか?
0351デフォルトの名無しさん
2009/07/27(月) 05:05:40それ、ロックレスなアルゴリズムと相性悪そうだな。
>>349
むしろPauseless GCが欲しい。ページフォルトをトラップすればいけるはず?
0352デフォルトの名無しさん
2009/07/27(月) 05:35:15import std.conv
to!string(cstring).dup
0353デフォルトの名無しさん
2009/07/27(月) 05:38:46ありがとう。
0354デフォルトの名無しさん
2009/07/27(月) 06:14:19参照の先がnewによって生成された物じゃない場合ってどうなってるんですか?
参照カウント方式で寿命が管理されているわけではない?
0355デフォルトの名無しさん
2009/07/27(月) 06:39:20mallocとかつかってメモリを割り当てて.__ctor()とか使ってコンストラクタを読んでクラスを作った場合、
GCにGC.addRange()でそのことを伝えておけばGCに回収されないで済む。
解放するときは.__dtor()とかfree()とか使って自力で解放する。
ただし、デストラクタでそれをやろうとすると危険かもしれない。
0356デフォルトの名無しさん
2009/07/27(月) 07:46:07なるほど。
一応GC使わない書き方もできるわけですね。
でも、さすがに手間がかかりすぎるなぁ。
0357デフォルトの名無しさん
2009/07/27(月) 18:28:20クロージャあるしクロージャリテラルあるしモジュールもあるし多態関数もあるしGCもあるし
でもリソースの管理はできないんだよな
0358デフォルトの名無しさん
2009/07/27(月) 19:53:36逆に、楽にTLS化する予約語を用意した方がいいんじゃないかと思う。
0359デフォルトの名無しさん
2009/07/27(月) 19:54:58>リソース管理
RAIIとかいう話じゃなくて?
0360デフォルトの名無しさん
2009/07/27(月) 20:41:50__thread
0361デフォルトの名無しさん
2009/07/27(月) 21:49:05D言語ってLinuxで動くわけ?
0362デフォルトの名無しさん
2009/07/27(月) 21:54:22それが自分で調べられない人には敷居の高い言語だと思う
0363デフォルトの名無しさん
2009/07/27(月) 21:57:29別に勉強しようと思っているわけじゃないんだけどな
0364デフォルトの名無しさん
2009/07/27(月) 21:59:110365デフォルトの名無しさん
2009/07/27(月) 22:22:16string j = "あいうえお";
writeln(j[0]); // 'あ' がほしい
0366デフォルトの名無しさん
2009/07/27(月) 22:28:43変換関数はPhobosのどっかにあったな
0367デフォルトの名無しさん
2009/07/27(月) 22:30:05writeln(std.utf.toUTF32(j)[0]);
0368デフォルトの名無しさん
2009/07/27(月) 22:32:070369デフォルトの名無しさん
2009/07/27(月) 22:38:190370デフォルトの名無しさん
2009/07/27(月) 22:52:570371デフォルトの名無しさん
2009/07/27(月) 23:16:02いける。toはできる子だからなんでもおまかせ。
0372デフォルトの名無しさん
2009/07/27(月) 23:21:22doFormatでやれそうなんですが、「出力は一文字ずつdelegateへ」っていうのがめんどくさいです。
もっと簡単な方法はないですか?
0373デフォルトの名無しさん
2009/07/27(月) 23:49:49toだけでどれほど邪悪な変換が出来る事やら
0374デフォルトの名無しさん
2009/07/27(月) 23:52:51所望の関数はなぜかstd.stringにある
format("%0.3lf", f);
0375デフォルトの名無しさん
2009/07/28(火) 00:05:270376デフォルトの名無しさん
2009/07/28(火) 01:10:44thx
0377デフォルトの名無しさん
2009/07/28(火) 01:29:05ポインタを使うということは、邪悪な変換とは何か知っているということさ。覚悟して使ってくれたまえよ。
何?なぜそんな邪悪を許すかって?それがeclectic languageというものさ。HAHAHA
0378デフォルトの名無しさん
2009/07/28(火) 01:39:500379デフォルトの名無しさん
2009/07/28(火) 01:54:34std.convには無いようです
0380デフォルトの名無しさん
2009/07/28(火) 03:56:325分いらん
0381デフォルトの名無しさん
2009/07/28(火) 03:58:48sscanf とか?
0382デフォルトの名無しさん
2009/07/28(火) 08:09:44strtoll
0383デフォルトの名無しさん
2009/07/28(火) 09:49:33やっぱりCの関数使うのが良さそうですね
ありがとうございました
0384デフォルトの名無しさん
2009/07/28(火) 15:50:100385デフォルトの名無しさん
2009/07/28(火) 15:56:13更新だってさ
D2にも対応して欲しいね
0386デフォルトの名無しさん
2009/07/28(火) 16:12:42long hexToDecimal(char hex)
{
return hexToDecimal([hex]);
}
long hexToDecimal(const(char)[] hex)
{
long sum;
foreach(char c; hex)
sum = sum*16 + ((c|0x20)-'0')%('W'-'0');
return sum;
}
unittest
{
assert(hexToDecimal('A') == 10);
assert(hexToDecimal("FF") == 255);
}
0387デフォルトの名無しさん
2009/07/28(火) 16:41:53昆布w
たしかにtoで対応してくれるとうれしいけども
こうなったらsscanfの機能も取り込んでしまえば…
to!("%x")(str);
0388デフォルトの名無しさん
2009/07/28(火) 18:38:040389デフォルトの名無しさん
2009/07/28(火) 18:39:240390デフォルトの名無しさん
2009/07/28(火) 20:08:360391デフォルトの名無しさん
2009/07/28(火) 20:17:500392デフォルトの名無しさん
2009/07/28(火) 20:34:390393デフォルトの名無しさん
2009/07/28(火) 20:51:17と思ってドキュメントを見ても無い
なんだ気のせいか
0394デフォルトの名無しさん
2009/07/28(火) 22:20:400395デフォルトの名無しさん
2009/07/29(水) 01:56:55それってどれだ
0396デフォルトの名無しさん
2009/07/29(水) 02:08:460397デフォルトの名無しさん
2009/07/29(水) 03:14:470398デフォルトの名無しさん
2009/07/29(水) 12:00:280399デフォルトの名無しさん
2009/07/29(水) 21:18:50マジレス厳禁
0400デフォルトの名無しさん
2009/07/30(木) 00:01:470401デフォルトの名無しさん
2009/07/30(木) 00:57:230402デフォルトの名無しさん
2009/07/30(木) 01:00:160403デフォルトの名無しさん
2009/07/30(木) 07:03:580404デフォルトの名無しさん
2009/07/30(木) 09:25:21なんだよ!!!
0405デフォルトの名無しさん
2009/07/30(木) 10:46:55存在しない物と思っておくべき?
0406デフォルトの名無しさん
2009/07/30(木) 18:27:13あなたが作ってポストすればおkって言語ですから。
0407405
2009/07/30(木) 21:21:390408デフォルトの名無しさん
2009/07/31(金) 00:22:03D言語に関するアンケートの実施です。
あなたの興味のあるトピックについて、もしよろしければご回答ください
0409デフォルトの名無しさん
2009/07/31(金) 00:47:23const void f() {
auto that = this;
writeln(typeid(typeof(this))); // C
writeln(typeid(typeof(that))); // const(C)
}
}
これ違うの気持ち悪くない?
0410デフォルトの名無しさん
2009/07/31(金) 01:24:24気持ち悪いね
0411デフォルトの名無しさん
2009/07/31(金) 01:28:55thisがconstじゃないのではなくて、typeof(this)がthisの型に関係なく常にCになる。
0412デフォルトの名無しさん
2009/07/31(金) 02:26:370413デフォルトの名無しさん
2009/07/31(金) 03:49:110414デフォルトの名無しさん
2009/07/31(金) 04:22:430415デフォルトの名無しさん
2009/07/31(金) 04:26:360416デフォルトの名無しさん
2009/07/31(金) 08:23:29なるほど。
でも、階層にできないと、規模が大きく(モジュールが多く)なってきた時に整理の面で不便なことないんですかね?
0417デフォルトの名無しさん
2009/07/31(金) 11:46:26.dをフォルダに入れたらフォルダがパッケージになるけどそういうことじゃない?
0418デフォルトの名無しさん
2009/07/31(金) 13:02:380419デフォルトの名無しさん
2009/07/31(金) 15:22:08ドット含むモジュール名にしたら普通に階層化されないか?
0420デフォルトの名無しさん
2009/07/31(金) 16:44:49int dbl(int i) { return i*2; }
に対して
int n=10;
assert(n.dbl() == 20);
って実装された?
0421デフォルトの名無しさん
2009/07/31(金) 17:38:500422デフォルトの名無しさん
2009/08/01(土) 02:10:50さっきやった時はプロジェクト直下のところと、パッケージの中と2箇所に新規パッケージができてしまったんですが、
今もう一度やったらちゃんとパッケージの中だけにできました。
さっきのはなんだったんだろう・・・。
0423デフォルトの名無しさん
2009/08/01(土) 02:11:570424デフォルトの名無しさん
2009/08/02(日) 20:14:340425デフォルトの名無しさん
2009/08/02(日) 20:33:53プラットフォーム依存を無くすために仮想マシンを用意してだな…
0426デフォルトの名無しさん
2009/08/02(日) 20:37:410427デフォルトの名無しさん
2009/08/02(日) 20:46:52コンパイラのなんのお咎めもなく外に持ち出せるって話だけど、
これはスタック変数へのポインタを関数外に持ち出せてしまう問題と同じなわけだし、
やっぱり仕方ないんじゃないかなあ。
scope変数に対する静的解析を実装すれば解決できるんだろうけど。
0428デフォルトの名無しさん
2009/08/02(日) 22:13:48じゃあ仕方なくないのかね
0429デフォルトの名無しさん
2009/08/02(日) 22:58:19typeof(this)ってのがそのクラス固有の関数を呼ぶために特別扱いされてるとかそういう関係で
型がおかしくなってるっていうバグかと思ってたんだけど、違うの?
0430デフォルトの名無しさん
2009/08/02(日) 23:15:22いあ、それとは関係ない。
誰かがどこかでつぶやいてた話。
■ このスレッドは過去ログ倉庫に格納されています