- 1 名前:デフォルトの名無しさん [2008/02/10(日) 15:06:12 ]
- プログラミング言語 D (D Programming Language) について語るスレッドです。
過去スレは >>2 ■本家 ttp://www.digitalmars.com/d/ ttp://www.kmonos.net/alang/d/ (和訳) ■コンパイラ ttp://www.digitalmars.com/d/dcompiler.html (DMD, 本家) ttp://dgcc.sourceforge.net/ (GDC, gccフロントエンド) ttp://gdcmac.sourceforge.net/ (GDCのmac用バイナリ) ■参考URL ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究) ttp://dsource.org/ (dsource) ttp://tinyurl.com/3da5oa (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動画) ■ 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)
- 644 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 15:32:15 ]
- >>641
ヤマカンでどこら辺があやしと思う? GC?ライブラリ?自前?
- 645 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:21:28 ]
- 現在の実装では、GCが確保した領域は解放されないとか、誰か書いてた覚えがある。
- 646 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:37:32 ]
- >>641
TangoのGC使うとちょっとはマシになるかも(minimize実装されてる)。 phobosのGCの実装はプログラム終了時以外に確保したメモリを返却しない。
- 647 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:50:22 ]
- >>645
>>646 ということはGCあってもfreeしろってことか。 freeつうかdelete
- 648 名前:647 [2008/03/09(日) 17:21:28 ]
- つまり、Dの場合はリトルエンディアン(パソコンでプログラムを使う際に使用される16進数の形式のネイティブWinAPI関数)は
静的(ガベージコレクタによって関数がオーバーロードされ変数のスコープからはずれたりするのを防ぐコア関数) なデストラクタ(使い終わったオブジェクトをユーザーからのイベントパンドラ無しにイベント駆動型のラムダ式) として扱われると言うこと。 uint* uiにするとβ変換(変数をグローバルなスコープから外し新しいシステム型変数として使うための変換) が正常に行えなくなるのでfile*uint[ui]にしておいたほうがいいということ
- 649 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:21:46 ]
- >>647
違う
- 650 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:35:34 ]
- >>647
解放する手段は無いってこと。
- 651 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:49:23 ]
- つまりサブプロセスを立ち上げて不要になったら殺すしかいないと。
- 652 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:01:55 ]
- >>647
プロセスとして確保した領域を解放する話と、 各オブジェクトに使っていた領域を解放する話が マゼコゼになってるぞ。
- 653 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:06:56 ]
- >>652
ごめん、あまり読まずにレスしてた。 穴があったら埋まりたい・・・
- 654 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:16:51 ]
- みんなスルーしててワロス
- 655 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:00:46 ]
- 自分で開放するにはmalloc&freeしかないってことでおk?
- 656 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:21:27 ]
- レスどうも。
>>643 そうだったんですか。 最小化されるとページアウトさせるのはOSですよね。 >>644 疑おうと思えば全部と言えます。 ただ、自動で回収されるとなってる以上、malloc,freeを使わなきゃいけないのもおかしい気が。。。 >>645-646 以前同じようなことを聞いたときも同じような回答でした。 確かstd.gcの話だったと思います。 minimizeが動かないと言う結論でした。 >>655 mallocでメモリを確保することは出来ても、freeで開放されません。
- 657 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:22:56 ]
- リリースビルドしてる?
解放されてると思うんだけど
- 658 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:23:13 ]
- いや、freeは解放されるだろ。GC関係ないんだから。
- 659 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:25:26 ]
- メモリが解放されないって事はD言語で作られてるゲームとかどうなってるんだろう
- 660 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:29:52 ]
- import std.stdio; import std.c.stdlib;
void main(){ writef("malloc "); void* p = malloc(104857600); writef("ok"); readln(stdin); writef("free "); free(p); writef("ok"); readln(stdin); } #include <stdlib.h> #include <stdio.h> void main(){ void* p; printf("malloc"); p = malloc(104857600); printf(" ok\n"); getch(); printf("free"); free(p); printf(" ok\n"); getch(); } こんな感じで試してみました。 Cのほうはもちろん開放されましたが、 Dの方は開放されませんでした。
- 661 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:32:24 ]
- >>657
dmd -release main これで良いんでしょうか? freeでは開放されませんでした。GCの方はまだ試してません。 DMDのパージョンは1.028です。
- 662 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:33:47 ]
- Dのmalloc&freeはプロセスとしてOSからmalloc&freeしているのではなくて、
Dのプロセスが一括してmallocしてきたメモリプールから小分けしているだけでは。 だからプロセスとしては使用メモリは増加する一方。minimizeしないから。
- 663 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:45:37 ]
- んー、卒研のプログラム書いた時は
newとdeleteでメモリ開放されてた気がするなぁ。 少なくとも増え続けることはなかった。 @Linuxだけど。
- 664 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:52:22 ]
- 卒研でD言語か・・・無茶しやがって(AA略
- 665 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:15:03 ]
- メモリの解放をどのような意味で使ってるかよくわからない
- 666 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:19:50 ]
- ガベコレだよ?
- 667 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:29:25 ]
- GCは必要なメモリをOSから確保するが、必要のなくなったメモリをOSに解放することはしていない。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:31:29 ]
- C#やC++/CLIと同じ様にOSの提供するメモリ管理機能にメモリ管理を任せてるだけ
- 669 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:41:44 ]
- 「メモリの解放」 は何を意味するか
1. デストラクタが呼ばれる。 2. 内部的に free の処理が走る。 3. free したメモリが実際に OS に返される。
- 670 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:43:07 ]
- 襲いかかる(笑)
- 671 名前:670 mailto:sage [2008/03/09(日) 23:43:29 ]
- ごめん誤爆
- 672 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:43:55 ]
- 4. 襲いかかる
- 673 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:48:17 ]
- std.c.stdlib.mallocはCのラインタイムライブラリとリンクされるから、
おそらくfreeした領域は可能であれば適当な時期にOSに返還されるはず。 std.gc.mallocはGCの管理領域から割り当てられるから、 phobosの実装だと、freeしても永久にプールされつづける、と思う。 >>663 deleteした領域は、空き領域としてプールされて再利用されるから、 new/deleteの繰り返しで増え続けることはないよ。
- 674 名前:637 mailto:sage [2008/03/10(月) 00:02:51 ]
- ちょっと付け足しとくと、
> おそらくfreeした領域は可能であれば適当な時期にOSに返還されるはず。 って書いたけど、Windows版DMDの場合は、DMCのsnn.libを使って、 linux版やGDCはglibcを使うと思うから、そこで実装の差が出てくる可能性はある。
- 675 名前:デフォルトの名無しさん [2008/03/10(月) 00:33:17 ]
- 僕のブログ見てほしいんですけど
o.z-z.jp/thbbs.cgi?id=sasanunu&p3=&th=541
- 676 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:33:49 ]
- すぐ返還
import std.stdio, std.loader; void main() { scope ExeModule msvcrt = new ExeModule("msvcrt.dll"); extern(C) void* function(size_t) malloc; extern(C) void function(void*) free; malloc = cast(typeof(malloc)) msvcrt.getSymbol("malloc"); free = cast(typeof(free)) msvcrt.getSymbol("free"); writef("malloc "); int size = 32*1024*1024; ubyte* p = cast(ubyte*)malloc(size); for( int i = 0; i < size; i++ ) p[i] = 0; writef("ok"); readln(stdin); writef("free "); free(p); writef("ok"); readln(stdin); }
- 677 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:27:12 ]
- >>675は危険
- 678 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:12:20 ]
- D言語終了のお知らせ
- 679 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:19:48 ]
- どのD言語?
- 680 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:20:56 ]
- ばかやろう、まだはじまってもいねぇよ
- 681 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:22:46 ]
- さっさと開始してくれ
- 682 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:24:28 ]
- 3.0になったら始動する
- 683 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:33:37 ]
- 型が同じ連想配列の結合ってできないの?
- 684 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 09:53:38 ]
- できないね。
キーが重複した場合に左右オペランドのどっちを優先するかって問題があるし、 自分で実装したほうが安心なんじゃない? K[V] merge(K, V)(K[V] a, K[V] b) { K[V] c; foreach(k, v; a) c[k] = v; foreach(k, v; b) c[k] = v; return c; }
- 685 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 09:55:18 ]
- AAに.dupがなかったことに今更きづいた
- 686 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 10:03:03 ]
- dup欲しいよねdup
- 687 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 17:49:06 ]
- tangoでsprintfみたいな文字列の整形が出来るのはどの関数ですか?
- 688 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:26:39 ]
- >>687
tango.text.convert.Sprint かな??
- 689 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:51:28 ]
- >>688
どうもです。C#の文章整形というものははじめて見ましたが、結構使えそうですね。 phobosに比べてclassいっぱい日本語資料ほとんどなしで、 英語の資料もあるには有るけどなれない言語なので情報にたどり着くのが大変です。
- 690 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:36:00 ]
- Tangoはクラス名と関数名だけでだいたい何をするかわかるから、慣れればかなり楽だよ。
細かい挙動は英語読まなきゃいけないけど。 ただ、opCallのオーバーロードがキモイ。それだけ。
- 691 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:42:33 ]
- Tango 0.99.5
ttp://dsource.org/projects/tango/wiki/0_99_5_release
- 692 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:43:55 ]
- tangoのopCallは本当に不人気だな
- 693 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:29:18 ]
- 俺の中ではあれのせいでかなり印章悪いけど他は割と強いのかなあ
- 694 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 03:20:02 ]
- そろそろgdcも新しいの出して欲しい
- 695 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 04:35:54 ]
- sf.netのSVNリポジトリからチェックアウトすればいいんじゃね?
今どうなってるのかは俺は知らんが
- 696 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 10:28:44 ]
- >>694
Subversionリポジトリの方では、1.024と2.008に追従する更新が 9日に来たばかりですね。 lists.puremagic.com/pipermail/d.gnu/2008-March/001474.html
- 697 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:38:12 ]
- あまり使わないんで気が付かなかったけど
Tangoだとphobosと違ってmainへの一個目の引数がフルパスにならないんだな。 呼び出しに使ったコマンドそのものになる。 たとえばコマンドプロンプトで tango使ってdmdでコンパイルしたmain.exeのあるディレクトリをカレントにして mainと入力して実行すると、第一引数が"main"になる。 windows上での話だけど。
- 698 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:58:47 ]
- TangoはGetCommandLineWで取ってるけど、
phobosはCのargvをそのまま使ってるね。 ということは、phobosはマルチバイト文字でおかしくなる可能性があるのかも。
- 699 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:13:56 ]
- その辺はガイシュツ
- 700 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:07:06 ]
- import tango.io.Console;
import tango.core.Memory; void main(){ GC gc; Cout("malloc").newline; Cin.copyln; void* p = gc.malloc(104857600); Cout("free").newline; Cin.copyln; gc.free(p); Cout("finish").newline; Cin.copyln; } TangoだとGCがしっかり動いてると言うので書いてみた。 やっぱりと言うかなんと言うか、仮想メモリはTangoでも開放されないな。 Cのmallocとは等価じゃないってことか。 Win32API使ってphobosのstd.file.readのような関数を作って30MB位のファイルを読み込んで それに一文字半角スペースを~で足してscope char[]に読み込みcollectとminimizeをやると言うループを作って Cout.copylnでウエイトを入れながらまわしてみたけど260MBまで遠慮なくメモリを使うぜ。 多分これが効率的だからそうなってるんだろうけど、collectやminimize使っても制御が出来ないのはなぁ。
- 701 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:28:12 ]
- どっちのGCもcompaction機能もってないし、
GC周りはどうにかしないといけないよなあ。
- 702 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:11:06 ]
- リンカがGCライブラリを切り替えられるようにすればいい。
- 703 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:40:03 ]
- >>700
はずしてるかもだけど、この辺の話? ttp://d.hatena.ne.jp/NyaRuRu/20080306/p1 ちょっと前に読んだなぁって、思い出した。
- 704 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:43:28 ]
- Windowsのdmcも、即OSに返還されないね。orz
#include <stdlib.h> #include <stdio.h> #include <string.h> void main(){ printf("malloc"); void* p = malloc(104857600); memset( p, 0, 104857600 ); printf(" ok\n"); getch(); printf("free"); free(p); printf(" ok\n"); getch(); }
- 705 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:52:06 ]
- >>704
てか原因はそこじゃないかな?
- 706 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:59:57 ]
- タスクマネージャのプロセス一覧で見えるメモリ消費量は、
そのプロセスが使ってるメモリ領域を正確に表示した物じゃないらしいので、 freeしたら即減るかっつーとそう言うもんでもないようです。 あとDのメモリ管理ってメモリプールみたいな感じで一度メモリ領域拡張されると縮小されにくい物なんじゃ?
- 707 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:05:52 ]
- >>704
www2s.biglobe.ne.jp/~hig/q_a/Programing_QA02.html#Q4
- 708 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:11:25 ]
- なあんだ、結局Dのnew&deleteとほぼ同じかもしれないってことかー
- 709 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 02:10:28 ]
- >707
ほぉ〜勉強になったさんくす
- 710 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 07:31:22 ]
- >>706
VCのclやgccだとfreeですぐに減ってるので、多分2段落目のとおりだと思う。 これも実装の違いなんだろう。 結局、Cみたいにある程度管理しながらうまいことメモリを使わないといけないのは変わらないわけかな。
- 711 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 09:18:41 ]
- ガベージコレクタのおかげで、うっかりdelete忘れてプロセス起動中に延々と
メモリを圧迫し続ける心配がないっていう程度ですかねえ。
- 712 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 09:50:29 ]
- 基本的にはDでメモリをOSには返せないってこと?
VC++だかgccだかでDLL作ってそっちのmalloc/free使えばいいのか。
- 713 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 10:00:05 ]
- 自前でHeapAllocすればいいんじゃ
- 714 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 13:26:29 ]
- 返還する目処のある処理を別プロセスにすりゃいいんじゃ?
すりゃいいってほど簡単じゃないけど。
- 715 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:16:30 ]
- プロセスにオブジェクトを渡してオブジェクトを受け取る、とか出来ないから
モジュール化がだいぶしょぼくなるな。 出来ればいいのになー。.NET環境だとそういうのもあるのになー。 OSはメモリもオブジェクトのメタデータも管理しちゃえばいいのに。
- 716 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:35:02 ]
- tangoにシリアライザなかったっけ。
- 717 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:37:26 ]
- >>715
モジュールをDLLとして作れば、Dのオブジェクトを渡したり GCをプロセス間で共有したりできるみたいよ。
- 718 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:13:25 ]
- マイクロソフトD言語潰す宣言
「既存のD言語のライセンスはもちろん買収するつもりだ」――CEO会長坂田雄太 an.to/?microsoft01news
- 719 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:18:29 ]
- >>718
Fxで開いたらrundll32.exe url.dll,TelnetProtocolHandlerとか出てきたが何をするつもりなんだ。
- 720 名前:デフォルトの名無しさん [2008/03/14(金) 10:22:03 ]
- >>718
正確に「潰す」とは言ってないんだろ? だったら問題ないと思うが
- 721 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:33:20 ]
- ブラクラです
- 722 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:35:46 ]
- 別にE言語になってもイーっすよ
- 723 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:24:11 ]
- Dって元々Mars言語って名前だったのを、
をるたんの友人がD言語って言い張るもんでいつの間にかDになったんじゃなかったっけ。 MSに名前押さえられても元のMars言語って名乗れば問題ないよね。
- 724 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:32:39 ]
- >723
マスコットキャラかわいそう・・・・・・
- 725 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:45:40 ]
- >>724
あんなゴキブリみたいな顔してるムカつくマスコットなんだから どこか別の場所に生きる術を見出せるさ。
- 726 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:54:18 ]
- >in パラメタ記憶域クラスを scope const の意味としました
あれ、finalは・・・
- 727 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:17:30 ]
- finalはみんなの心の中で生き続けるよ
- 728 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:58:12 ]
- むしろ「かぶっちゃったけどどうしてもこの名前使いたい」って言って
MSがお金払ってくれたら棚ぼたなのにw
- 729 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 15:05:36 ]
- >>728
最初からそれ狙いでしょ。 つーか、世の中にD言語って、このD言語以前からも色々あるわけだが。
- 730 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 15:27:27 ]
- なるほど、D言語と名づけたのは金狙いか
思惑通りMSが金払ってくれるのは、むしろいいことじゃあないか めでたしめでたし
- 731 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 15:57:12 ]
- ??????????
- 732 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:05:10 ]
- このスレもやたらレベルがさがったな
- 733 名前:デフォルトの名無しさん [2008/03/14(金) 16:12:38 ]
- だってD言語だもんな
- 734 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:36:42 ]
- なんかマイクロソフトの"D言語"の話題を何回も蒸し返したがる子がいるのね。
- 735 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:08:00 ]
- MSにあのマスコットキャラ売っちゃえばいいんじゃね?
- 736 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:36:28 ]
- MSならきっと立派に育ててくれる
- 737 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:53:46 ]
- マイクロソフトに期待してる人が結構いるんだね
Linux使ってる俺にとってはどうでもいい話だが
- 738 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:12:14 ]
- M$ が主導しても自分では Windows でしかコンパイラ作らないんだろ?
価値ないよ。
- 739 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:13:53 ]
- そろそろxamlでDFLフォームを作るコンバータをだな
- 740 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:23:43 ]
- WPFのDバインディングとかは使ってみたいよね。
Dから.NETのリフレクション機能をさわるのはできたけど、 CLRのGCとDのGCを上手いこと動かしてリークを防ぐのがめんどい。
- 741 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:28:30 ]
- Iron DなのかD.NETなのかD#なのかが問題だ。
- 742 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:38:43 ]
- どうでもいい
- 743 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:08:43 ]
- D.NET はもうある(正確にはあった)
- 744 名前:デフォルトの名無しさん [2008/03/14(金) 22:23:18 ]
- 静的に文字列を置換する方法てないですかね
const string foo = "pal = 5;"; class Hoge{ int val; void DoSomething(){ const string myfoo = static_replace(foo,"p","v");// <-こんなかんじ mixin(myfoo); // val = 5; に展開して欲しい } }
- 745 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:24:55 ]
- F#はもうある。
- 746 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:33:36 ]
- >>737、向こうで噴いた
200 :login:Penguin :sage :2008/03/14(金) 18:53:16 ID:mDbK1QBH マイクロソフトに期待してる人が結構いるんだね Linux使ってる俺にとってはどうでもいい話だが 201 :login:Penguin :sage :2008/03/14(金) 18:54:22 ID:mDbK1QBH ↑誤爆
- 747 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:34:00 ]
- >>744
ないんだったら作ればいいんだ。 string static_replace(string text,string from,string to){ string result; while(text.length >= from.length){ if(text[0..from.length] == from){ result ~= to; text = text[from.length .. $]; }else{ result ~= text[0]; text = text[1..$]; } } return result ~ text; } あと、const string myfooだとなぜかdmd君は落ちやがったのでstatic付けてみた const static string myfoo = static_replace(foo,"p","v");
- 748 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:37:42 ]
- CTFEあるからstd.string.replaceでイケるっぽくない?
- 749 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:45:26 ]
- >>748
残念ながらstd.string.replace君の中のstd.string.findはCTFEで対応していない機能(memchrとか)を使ってるんだよね。 個人的にはversion(compileTime)相当のものを処理系が用意するなりなんなりで、 std.stringとかはCTFE時にも動作するように作り直してほしいなあとか思ってたり。
- 750 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:49:40 ]
- pure関数はCTFEされるとかいう風になると思うんだがどうだろう
- 751 名前:744 mailto:sage [2008/03/14(金) 22:50:11 ]
- >>747
>>748 >>749 ありがとうございます CTFE・・ 初めて聞く単語だ(実はD言語習いたて) ググってきます 家の環境にはD言語入れてないのでこれからインスコして試してみます
- 752 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:01:48 ]
- CTFE の条件てどこにかいてありますか?
- 753 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:05:39 ]
- >>752
ソース
- 754 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:19:52 ]
- ttp://www.kmonos.net/alang/d/2.0/function.html#interpretation
- 755 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:32:52 ]
- >>754
サンクス!
- 756 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 00:23:30 ]
- CTFEでwithが使えないってのはどういう理由なんだろう
- 757 名前:737 mailto:sage [2008/03/15(土) 00:35:21 ]
- >>746
ヽ( ・∀・)人(・∀・ )ノナカーマ
- 758 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:08:08 ]
- >>756
シンボルの検索は兎も角として、ポインタ使えないのにwithが使えてどうするという気が。
- 759 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:16:15 ]
- 多くのメンバを持つ構造体にアクセスするときとか、
with(std.stdio)みたいに普段は使わないモジュールを導入するとか 便利だと思うんだけどなあ。 withとポインタが使えないことに何の関係があるのかはよくわからない。
- 760 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:24:57 ]
- MacOSX 10.5 Leoprad でD言語の環境をそろえようと思って
sudo port install gdc して、簡単な HELLO WORLD つくって test.d で保存して gdc test.d したんだけど object.d が見つからんと言われたので、ひとまずインポートパスを指定して gdc -I "/opt/local/include/d/4.1.2" test.d ってやったら、 ld: file not found: crt.o てエラーが出たんだが。。。これってリンカエラーだよね。 crt3.o ってファイルは dmc 関係のフォルダでいくつか見つかったんだけど、 どこでパスを指定するの? というか、gdc のリンカに dmc のオブジェクトファイル渡してもいいのかな??
- 761 名前:760 mailto:sage [2008/03/15(土) 17:26:03 ]
- いや、よく見たら gcc のフォルダにも crt3.o がありました
- 762 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:36:01 ]
- file not found: crt.o
なのになんでcrt3.oを探してるの?
- 763 名前:760 mailto:sage [2008/03/15(土) 17:53:03 ]
- あ、しつれい
ld: file not found: crt3.o だった
- 764 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 19:42:15 ]
- Phobosのboxer.dの中に
TypeInfo type() const { return cast(TypeInfo)p_type; } こういうメソッドがあるけど、constがメソッド名の後ろにあるのってどんな意味があるんでしょう?
- 765 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 19:48:01 ]
- それはC++風の書き方で、普通はconst TypeInfo type()と前置する。
constをつけたメンバ関数はconstメンバ関数とみなされて、 thisポインタを経由してオブジェクトの状態を変更しないことが保障される。
- 766 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 20:19:41 ]
- >>765
なるほど、C++だとこういう風に表記するんですね。 わざわざ後ろにあるので何か特別な意味があるのかと思いました。 有難う御座いました。
- 767 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 21:43:32 ]
- Tangoについての質問です。
やりたいことは正規表現でstr中のURLをハイパーリンクにすることなんですが、 auto replaced = Regex(r"((?:f|ht)tp://[\w\.$,;:&=?!*~@#\(\)/]*)").replaceAll(str, "<a href=\"$1\">$1</a>"); こういうコードにしてみたら戻り値が無いんですが、perlの $str =~ s/((?:ht|f)tp\:\/\/[a-zA-Z0-9.$,;:&=?!*~@_\(\)\/#]*)/<a href="$1">$1<\/a>/g; のようにするにはどうすれば良いのでしょうか。
- 768 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:19:16 ]
- >>767
Tango使ってないけどソース見てみた. >戻り値が無い ということはnullということなんだろうけど, ただ単にその正規表現だと見つけれてないだけな気がする. ソース見る限りはsearchやってるだけだし. Phobosのregexp.dの中にURL用の正規表現文字列があるからそれ使ってみるとか. Phobosのregexp.dだと後方参照しないグループ化は出来なかったと思うんだけど(余り使ってないので自信なし), TangoのRegexp.dだと出来るのか.
- 769 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 01:06:49 ]
- >>767
俺もTangoは使ってないんだが、マニュアルを見る限り、 (?:ht|f)の所は(?ht|f)が正しいのではないかと思う。 あと、replaceAllで$1とかは使えないかもしれない。 ソースを見てみると単純に連結していて、$1とかでどうこうという処理はしていないようだから。
- 770 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 01:45:32 ]
- >>768
searchやってるだけじゃないよ。 >>767 なんとか動いた。 $1とかは置換してくれないみたいだね 固定した文字列との置換なら、delegateのいらない方のreplaceAllでもOK (?:)は使えないので()を使用する。 phobosのregexpもそうだったはず。 //tango-0.99.5 で新しくなったRegex用 import tango.text.Regex, tango.io.Stdout; void main() { char[] s = `hoge pc11.2ch.net/ hoge www.digitalmars.com/d/ fuga`; auto re = RegExpT!(char)(`((ht|f)tp\:\/\/[a-zA-Z0-9.$,;:&=?!*~@_\(\)\/#]*)`,`g`); auto dg = delegate char[] (RegExpT!(char) re) { return `<a href="`~re.match(1)~`">`~re.match(1)~`</a>`; }; char[] result = re.replaceAll(s, dg); Stdout(result).newline; }
- 771 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 01:57:58 ]
- aliasがあるから、わざわざRegExpT使わなくてもいいみたい
import tango.text.Regex, tango.io.Stdout; void main() { char[] s = `hoge pc11.2ch.net/ hoge www.digitalmars.com/d/ fuga`; char[] result = Regex(`((ht|f)tp\:\/\/[a-zA-Z0-9.$,;:&=?!*~@_\(\)\/#]*)`,`g`).replaceAll(s, (Regex r) { return `<a href="`~r.match(1)~`">`~r.match(1)~`</a>`; } ); Stdout(result).newline; }
- 772 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 07:27:35 ]
- >>770-771
どうもです。 そのソースをまるまるコピペして動かしてみたんですが、 object.Exception: Access Violation となってしまいました。 うーん。
- 773 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 14:11:47 ]
- >>772
とりあえずTangoを入れて動かしてみたけど >object.Exception: Access Violation となるのはStdoutのせいっぽい(俺の環境では). tango.io.ConsoleのCoutを使ったら,771のソースでちゃんと置換されたのが表示された. Stdoutでこのエラーになる原因は面倒なので追ってない.
- 774 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 16:32:06 ]
- tango.text.Regex の compileToD すごいな。
出力されたコードを少し書き換えたらCTFEでも動いた。 CTFEで正規表現使いたい時にいいかも。 単純な処理しかしてないから、 Cやアセンブラに書き換えるのも容易かも。しかし長いw
- 775 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 18:21:13 ]
- >>772
Stdoutでバグるのは,Regex.dでdebug時にStdout.dをimportしてたから コンパイル時にdebugオプションをつけたら動くようになった. といってもdebugなしで普通にimportしてもエラーが出るので, この辺の原因はよく分からない. static thisとかの初期化とかで何か問題が発生してるのかも. 力になれなくて申し訳ない.
- 776 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 18:54:33 ]
- PhobosとTangoが仲良くなりますように(-人-)
- 777 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 18:54:47 ]
- っTangobos
- 778 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 19:25:04 ]
- >>773>>775
うーむ、 Stdoutはデバッグで使いたいので、こうなると正規表現でURLを抜き出すのは面倒ですね。 別の手法も思いついたのでそっちで一度試して見ます。 どうもでした。
- 779 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:50:17 ]
- >>778
もういいかもしれないけど,とりあえず追加で書いとく. Stdoutがどうこうとか書いたけど,自分でもよく分からなくなってきたw 771のソース前提で,とりあえず出力される方法. ・Cout/Cerrを置く 色々試してたら,Cout/Cerrを置くと普通にStdoutでも出力されるようになった. ・Stdout(Stdout); これを置いても出力された.Stdoutの型も出力されるので使えない. ・Stdout.dと同じことをやる Stdout = new Print!(char) (new Layout!(char), Cout.stream); 同じことしてるのに効果が違うのはよく分からないんだけど. どれも根本的な解決策じゃないので応急処置的な感じ. >>770は動いているようだし,環境も関わってるのかなぁ. それにしてもStdout(Stdout)がまともに動くのは何故…
- 780 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 12:16:11 ]
- 日本語うめえ
- 781 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 12:16:34 ]
- 誤爆
- 782 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 15:57:50 ]
- なんかネタないの?
- 783 名前:770 mailto:sage [2008/03/18(火) 17:35:48 ]
- >>779
こちらでも、dmdでビルドしたものはAccessViolation出ました。 budで、tango-user-dmd.libを使わずにビルドすると正常動作するけど、 使う設定でビルドだと、AccessViolationでした。 tango-user-dmd.libを再makeすれば直るのかな??
- 784 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 20:37:12 ]
- >>783
budでOKということで,試しにDSSSでビルドしたら普通に動いた. これくらいは昨日試しておくべきだったorz 770の言うとおり,生成済みライブラリになんらかのバグ(コンパイル状況による?)があるっぽいね. Tangoのソースからのビルドが英語だらけで挫折.
- 785 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 06:46:04 ]
- >>782
ソースを落として、dmd.exeとdmc.exeにパスが通っている状態でlib内のbuild-tango.batとかを実行 …だと思うのだけど、再コンパイルできなかったりできてもやっぱりバグったリ…何かがおかしい。
- 786 名前:785 mailto:sage [2008/03/19(水) 06:47:12 ]
- >>782 じゃなかった… >>784 でした。申し訳ないorz
- 787 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 03:37:51 ]
- 今のところ2.0で動くGUIライブラリってない?
- 788 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 11:46:08 ]
- wxDの履歴にinvariant string対応とかあるけどどうなんでしょ
- 789 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:28:54 ]
- tangoのDateTimeとかはどこに消えたんですかね・・・
似たようなクラスって何かありますか?
- 790 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 19:29:35 ]
- tango.time.Timeの中にあるようだけど
- 791 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 19:55:15 ]
- 久しぶりにPoseidon落としてみたが、キーボードショートカットでrun_projectの割り当てが出来るようになってた。
軽いし、やっぱり気軽にプログラミングするにはいいエディタだな。
- 792 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:22:35 ]
- D言語をMac OS Xで始めました。
目的はWin/Linux用のD言語で書かれたコンソールアプリの移植です。 最初に既存のソースコードをXcodeからコンパイルして勉強できる環境を構築しようと思い立ち いろいろ調べていますが、参考になるサイト等見つかりません。 どなたかMacでその道に足を踏み入れた方はいらっしゃいますか?
- 793 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:46:49 ]
- D1/D2どちらでもいいので
C++のstringstreamみたいなのが欲しいんだけど ありませんでしたっけ? >>792 Macのは見かけたことないなー
- 794 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:02:49 ]
- MemoryStreamに書いて、readStringとか。
- 795 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:24:03 ]
- OutBufferに書いて、toBytesとか。
というかOutBufferの存在価値が昔から空気過ぎるんだけど必要なのかこれ。
- 796 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:27:01 ]
- >>794 こうだと何も表示されないんだけど何が足りないのでしょう?
import std.stdio; import std.stream; void main(){ Stream ms = new MemoryStream; ms.writeLine("hello"); string s = ms.readLine().idup; writefln(s); } >>795 OutBufferはいらないよな・・・
- 797 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:29:54 ]
- Streamは読み書きでpositionを共有してるからpositionのリセットが必要。
import std.stdio; import std.stream; void main(){ Stream ms = new MemoryStream; ms.writeLine("hello"); ms.position = 0; string s = ms.readLine().idup; writefln(s); }
- 798 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:30:16 ]
- これでできたようです
import std.stdio, std.stream; void main(){ Stream ms = new MemoryStream; ms.writeLine("hello"); ms.writeLine("world!"); string s = ms.toString(); writefln(s); }
- 799 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:31:30 ]
- >>797 もしかしてそうじゃないかなと思ってpositionを再設定しようと
思ったんだが 0 を入れればいいのかわからなかったので 発見した toString() を試してみたらいけました ありがとう
- 800 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:34:58 ]
- >>799
toStringでもOK。 ただ、toStringはread可能,seek可能かによって微妙に動作が変わるから注意な。
- 801 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:38:38 ]
- >>795
std.openrjと同じくらいは役に立つんじゃね?
- 802 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:47:09 ]
- >>790
これは・・・・・ もしかしてまだ作りかけなのかな・・・・
- 803 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:56:33 ]
- 壮絶な勘違
- 804 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 01:00:49 ]
- 単に.NETみたいにしたいだけなんじゃ…
|

|