トップページ⇒tech
989コメント254KB

D言語 Part22

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/06/22(月) 01:38:41
プログラミング言語 D (D Programming Language) について語るスレッドです。
過去スレ、関連スレは >>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)
0342デフォルトの名無しさん2009/07/26(日) 02:06:20
>>341
うーん
そういう人は何があっても新しいものに移行しない希ガスるので放っておくしか
0343デフォルトの名無しさん2009/07/26(日) 02:07:20
struct shared_ptr{} 作ってください
0344デフォルトの名無しさん2009/07/26(日) 02:07:38
実際たいしたコード書いてない奴ほどGCに言及する傾向
0345デフォルトの名無しさん2009/07/26(日) 05:12:58
httpdやsshdのライブラリってある?
0346デフォルトの名無しさん2009/07/26(日) 17:24:18
60FPSで回すとGCの挙動が気になるのは当たり前
スレッド毎にコレクトするならいいんだけどなぁ
スレッドローカル仕様になったし、そうなることに期待
0347デフォルトの名無しさん2009/07/26(日) 19:13:05
ああ,TLSになったら依存関係の木構造が小規模になるから
スレッドごとにコレクトしやすくなるのか
0348デフォルトの名無しさん2009/07/27(月) 03:16:20
>>346
どのトピックか忘れたけどSeanが「スレッド毎にGCを動作させるようにする」みたいなこと言ってた気がする
0349デフォルトの名無しさん2009/07/27(月) 04:50:07
コンカレントGCってのに憧れてるんですけどD言語にそういう機能とか予定とかありませんか?
0350デフォルトの名無しさん2009/07/27(月) 05:04:21
Cの文字列をchar*型で渡されたとします。
これをchar[]型にコピーする最も簡単な方法は何ですか?
0351デフォルトの名無しさん2009/07/27(月) 05:05:40
>>348
それ、ロックレスなアルゴリズムと相性悪そうだな。

>>349
むしろPauseless GCが欲しい。ページフォルトをトラップすればいけるはず?
0352デフォルトの名無しさん2009/07/27(月) 05:35:15
>>350
import std.conv
to!string(cstring).dup
0353デフォルトの名無しさん2009/07/27(月) 05:38:46
>>352
ありがとう。
0354デフォルトの名無しさん2009/07/27(月) 06:14:19
クラスって常に参照型で扱われますよね。
参照の先がnewによって生成された物じゃない場合ってどうなってるんですか?
参照カウント方式で寿命が管理されているわけではない?
0355デフォルトの名無しさん2009/07/27(月) 06:39:20
>>354
mallocとかつかってメモリを割り当てて.__ctor()とか使ってコンストラクタを読んでクラスを作った場合、
GCにGC.addRange()でそのことを伝えておけばGCに回収されないで済む。
解放するときは.__dtor()とかfree()とか使って自力で解放する。
ただし、デストラクタでそれをやろうとすると危険かもしれない。
0356デフォルトの名無しさん2009/07/27(月) 07:46:07
>>355
なるほど。
一応GC使わない書き方もできるわけですね。
でも、さすがに手間がかかりすぎるなぁ。
0357デフォルトの名無しさん2009/07/27(月) 18:28:20
D言語ってかなり関数型プログラミングに向いてるよな
クロージャあるしクロージャリテラルあるしモジュールもあるし多態関数もあるしGCもあるし
でもリソースの管理はできないんだよな
0358デフォルトの名無しさん2009/07/27(月) 19:53:36
しかしグローバル変数のデフォルトTLS化ってうれしいのかな。知らなきゃ絶対はまるよね。

逆に、楽にTLS化する予約語を用意した方がいいんじゃないかと思う。
0359デフォルトの名無しさん2009/07/27(月) 19:54:58
>>357
>リソース管理
RAIIとかいう話じゃなくて?
0360デフォルトの名無しさん2009/07/27(月) 20:41:50
>>358
__thread
0361デフォルトの名無しさん2009/07/27(月) 21:49:05
友達がD言語って騒いでいたんだけど
D言語ってLinuxで動くわけ?
0362デフォルトの名無しさん2009/07/27(月) 21:54:22
>>361
それが自分で調べられない人には敷居の高い言語だと思う
0363デフォルトの名無しさん2009/07/27(月) 21:57:29
>>362
別に勉強しようと思っているわけじゃないんだけどな
0364デフォルトの名無しさん2009/07/27(月) 21:59:11
調べると真っ先に出てくる情報に触れる前にこんなスレに来た事が興味深い
0365デフォルトの名無しさん2009/07/27(月) 22:22:16
文字列のインデックスから日本語文字を得るにはどうしたらいいの?
string j = "あいうえお";
writeln(j[0]); // 'あ' がほしい
0366デフォルトの名無しさん2009/07/27(月) 22:28:43
wchar配列に変換すればできるんじゃないかな
変換関数はPhobosのどっかにあったな
0367デフォルトの名無しさん2009/07/27(月) 22:30:05
>>365
writeln(std.utf.toUTF32(j)[0]);
0368デフォルトの名無しさん2009/07/27(月) 22:32:07
char じゃ無理なのね。ありがと。
0369デフォルトの名無しさん2009/07/27(月) 22:38:19
j[0..3]で出来るけど筋が悪すぎるよな
0370デフォルトの名無しさん2009/07/27(月) 22:52:57
to!(wstring)じゃだめなの?
0371デフォルトの名無しさん2009/07/27(月) 23:16:02
>>370
いける。toはできる子だからなんでもおまかせ。
0372デフォルトの名無しさん2009/07/27(月) 23:21:22
浮動小数点数を小数点以下n桁までを文字列にしたいと思っています。
doFormatでやれそうなんですが、「出力は一文字ずつdelegateへ」っていうのがめんどくさいです。
もっと簡単な方法はないですか?
0373デフォルトの名無しさん2009/07/27(月) 23:49:49
ちょっと前に出てたchar*との変化にはビビった
toだけでどれほど邪悪な変換が出来る事やら
0374デフォルトの名無しさん2009/07/27(月) 23:52:51
>>372
所望の関数はなぜかstd.stringにある
format("%0.3lf", f);
0375デフォルトの名無しさん2009/07/28(火) 00:05:27
√2の小数点以下100桁を求めるとしたら?
0376デフォルトの名無しさん2009/07/28(火) 01:10:44
>>374
thx
0377デフォルトの名無しさん2009/07/28(火) 01:29:05
>>373
ポインタを使うということは、邪悪な変換とは何か知っているということさ。覚悟して使ってくれたまえよ。
何?なぜそんな邪悪を許すかって?それがeclectic languageというものさ。HAHAHA
0378デフォルトの名無しさん2009/07/28(火) 01:39:50
一瞬electricに見えた
0379デフォルトの名無しさん2009/07/28(火) 01:54:34
16進数文字列をlongに変換したいんですがPhobosだけでできますか?
std.convには無いようです
0380デフォルトの名無しさん2009/07/28(火) 03:56:32
そんくらい自分でつくれ
5分いらん
0381デフォルトの名無しさん2009/07/28(火) 03:58:48
>>379
sscanf とか?
0382デフォルトの名無しさん2009/07/28(火) 08:09:44
>>379
strtoll
0383デフォルトの名無しさん2009/07/28(火) 09:49:33
>>381-382
やっぱりCの関数使うのが良さそうですね
ありがとうございました
0384デフォルトの名無しさん2009/07/28(火) 15:50:10
昆布<オレにだって……できないことぐらい…ある…
0385デフォルトの名無しさん2009/07/28(火) 15:56:13
ttp://www.dsource.org/projects/dcollections
更新だってさ
D2にも対応して欲しいね
0386デフォルトの名無しさん2009/07/28(火) 16:12:42
>>379 前にここで教えてもらったので

long 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
>>384
昆布w

たしかにtoで対応してくれるとうれしいけども
こうなったらsscanfの機能も取り込んでしまえば…
to!("%x")(str);
0388デフォルトの名無しさん2009/07/28(火) 18:38:04
toは型の変換用じゃないのw
0389デフォルトの名無しさん2009/07/28(火) 18:39:24
だしformatでいいでしょ
0390デフォルトの名無しさん2009/07/28(火) 20:08:36
それはprintf系だが
0391デフォルトの名無しさん2009/07/28(火) 20:17:50
readfどこいったんだよ
0392デフォルトの名無しさん2009/07/28(火) 20:34:39
きっとDの機能をフルに使った変態関数を製作中
0393デフォルトの名無しさん2009/07/28(火) 20:51:17
2.030辺りでformattedReadなるものが追加されたはず…
と思ってドキュメントを見ても無い
なんだ気のせいか
0394デフォルトの名無しさん2009/07/28(火) 22:20:40
tangoの該当機能がPhobosに取り込まれれば全て解決…
0395デフォルトの名無しさん2009/07/29(水) 01:56:55
>>390
それってどれだ
0396デフォルトの名無しさん2009/07/29(水) 02:08:46
それにつけても
0397デフォルトの名無しさん2009/07/29(水) 03:14:47
かっぱえびせん
0398デフォルトの名無しさん2009/07/29(水) 12:00:28
おやつはカールだろ
0399デフォルトの名無しさん2009/07/29(水) 21:18:50
>>398
マジレス厳禁
0400デフォルトの名無しさん2009/07/30(木) 00:01:47
ちょwwwwwwwwwwwおやつはカールだろwwwwwwwwwwwwwwwwwwwwwwwww
0401デフォルトの名無しさん2009/07/30(木) 00:57:23
最近おっとっとにはまってる
0402デフォルトの名無しさん2009/07/30(木) 01:00:16
ジャンク舌な俺はハバネロ派
0403デフォルトの名無しさん2009/07/30(木) 07:03:58
地味に柿ピーが好き。
0404デフォルトの名無しさん2009/07/30(木) 09:25:21
>>400
なんだよ!!!
0405デフォルトの名無しさん2009/07/30(木) 10:46:55
std.InBufferは、いつになったら実装されるの?
存在しない物と思っておくべき?
0406デフォルトの名無しさん2009/07/30(木) 18:27:13
>>405
あなたが作ってポストすればおkって言語ですから。
04074052009/07/30(木) 21:21:39
しょぼいものしか作れそうにありませんごめんなさい
0408デフォルトの名無しさん2009/07/31(金) 00:22:03
http://tinyurl.com/kjerra
D言語に関するアンケートの実施です。
あなたの興味のあるトピックについて、もしよろしければご回答ください
0409デフォルトの名無しさん2009/07/31(金) 00:47:23
class C {
const void f() {
auto that = this;
writeln(typeid(typeof(this))); // C
writeln(typeid(typeof(that))); // const(C)
}
}

これ違うの気持ち悪くない?
0410デフォルトの名無しさん2009/07/31(金) 01:24:24
const関数内なのにthisがconstじゃないのか
気持ち悪いね
0411デフォルトの名無しさん2009/07/31(金) 01:28:55
>>410
thisがconstじゃないのではなくて、typeof(this)がthisの型に関係なく常にCになる。
0412デフォルトの名無しさん2009/07/31(金) 02:26:37
ちなみにsharedとかimmutable関数内でもそうなるし、classじゃなくてstructとかunionもそうなるっぽいな
0413デフォルトの名無しさん2009/07/31(金) 03:49:11
はやくstd.encodingをrangeベースに置き換えてほしい
0414デフォルトの名無しさん2009/07/31(金) 04:22:43
eclipse+descentでパッケージの中にパッケージを作るにはどうやればいいですか?
0415デフォルトの名無しさん2009/07/31(金) 04:26:36
普通にfoo.barとかいう名前のパッケージを作ればいいだけ。
0416デフォルトの名無しさん2009/07/31(金) 08:23:29
>>415
なるほど。
でも、階層にできないと、規模が大きく(モジュールが多く)なってきた時に整理の面で不便なことないんですかね?
0417デフォルトの名無しさん2009/07/31(金) 11:46:26
>>416
.dをフォルダに入れたらフォルダがパッケージになるけどそういうことじゃない?
0418デフォルトの名無しさん2009/07/31(金) 13:02:38
できるよ。phobosのソースディレクトリ見ればわかるよ。
0419デフォルトの名無しさん2009/07/31(金) 15:22:08
>>416
ドット含むモジュール名にしたら普通に階層化されないか?
0420デフォルトの名無しさん2009/07/31(金) 16:44:49
D言語ってもう
int dbl(int i) { return i*2; }
に対して
int n=10;
assert(n.dbl() == 20);
って実装された?
0421デフォルトの名無しさん2009/07/31(金) 17:38:50
まだ
0422デフォルトの名無しさん2009/08/01(土) 02:10:50
>>417-419
さっきやった時はプロジェクト直下のところと、パッケージの中と2箇所に新規パッケージができてしまったんですが、
今もう一度やったらちゃんとパッケージの中だけにできました。
さっきのはなんだったんだろう・・・。
0423デフォルトの名無しさん2009/08/01(土) 02:11:57
あぁ、あったな、そんなバグ…
0424デフォルトの名無しさん2009/08/02(日) 20:14:34
D3.0マダー?
0425デフォルトの名無しさん2009/08/02(日) 20:33:53
D3.0では複雑すぎる機能は削ぎ落としてポインタみたいなのは禁止して
プラットフォーム依存を無くすために仮想マシンを用意してだな…
0426デフォルトの名無しさん2009/08/02(日) 20:37:41
なにそのJava
0427デフォルトの名無しさん2009/08/02(日) 20:46:52
immutableオブジェクトのコンストラクタに渡ってきたmutableなthisを、
コンパイラのなんのお咎めもなく外に持ち出せるって話だけど、
これはスタック変数へのポインタを関数外に持ち出せてしまう問題と同じなわけだし、
やっぱり仕方ないんじゃないかなあ。

scope変数に対する静的解析を実装すれば解決できるんだろうけど。
0428デフォルトの名無しさん2009/08/02(日) 22:13:48
>>427
じゃあ仕方なくないのかね
0429デフォルトの名無しさん2009/08/02(日) 22:58:19
>>427のって>>409のおはなし?
typeof(this)ってのがそのクラス固有の関数を呼ぶために特別扱いされてるとかそういう関係で
型がおかしくなってるっていうバグかと思ってたんだけど、違うの?
0430デフォルトの名無しさん2009/08/02(日) 23:15:22
>>429
いあ、それとは関係ない。
誰かがどこかでつぶやいてた話。
0431デフォルトの名無しさん2009/08/03(月) 00:03:32
>>430
そっか。・・・こういうこと?↓
--------
class C{
int a;
this(ref C c){
a = 10;
c = this;
}
}
void main(){
C x;
auto c = new immutable(C)(x);
writeln(c.a);
x.a = 100;
writeln(c.a);
}
--------
・・・これはキモイね。
0432デフォルトの名無しさん2009/08/03(月) 11:38:46
module hoge.hoge;

import std.algorithm;
import hoge.fuga;

void hoge() {...}

これをビルドすると、
c:\省略\hoge.d(6): Error: function hoge.hoge.hoge conflicts with import hoge.hoge.hoge at c:\省略\hoge.d(4)
というエラーが出ます。
import hoge.fuga;をコメントアウトすれば、このエラーは出なくなります。
どうもhogeパッケージに入っているモジュールをimportするとエラーが発生するようです。
hogeパッケージhogeモジュールと、同名なのがだめなんでしょうか?
0433デフォルトの名無しさん2009/08/03(月) 12:01:28
エラーを文字通りに取れば
hoge.hoge.hoge関数と
hoge.hoge.hogeモジュールが競合するようだが
関数があるのは自己申告で確定だから、
hoge.hoge.hogeというディレクトリがあればその競合が原因だな
0434デフォルトの名無しさん2009/08/03(月) 12:25:26
>>433
うーん、プロジェクトのフォルダの中にhogeフォルダ、そのhogeフォルダの中にフォルダはないです。
04354322009/08/04(火) 05:55:52
改名importにしたらエラーは消えました。
モジュールhoge.hogeの中でhoge.fugaをimportするとhoge.hoge.hoge.fugaになって、
hoge.hoge.hogeの部分がパッケージ.パッケージ.パッケージなのかパッケージ.パッケージ.関数なのか判別できないっていう事なのかなぁ。
うーん、改名importにしないといけないぐらいなら、パッケージとモジュールに同じ名前をつけるのやめた方がいいか・・・。
0436デフォルトの名無しさん2009/08/04(火) 21:53:26
* Iterators Must Go! - http://boostcon.blip.tv/
* "D"iving into the D Programming Language - http://www.informit.com/articles/printerfriendly.aspx?p=1381876
0437デフォルトの名無しさん2009/08/05(水) 04:33:07
>>436
Rangeの作り方が最初よく分からなかったのだが、
たとえば配列をRange化する場合、
.nextは[1..$]というスライス(の参照)を返すって事でいいんだよね?

一応listやdequeくらいは実習代わりにrangeで作ったサンプルが作れるかも?
0438デフォルトの名無しさん2009/08/05(水) 06:26:13
list(T)はできた。
codepadにでも貼ろうかと思ったがcodepad側の対応バージョンが古いのであきらめる。

罠:
ドキュメントには .empty .next .retreat .head .toe が列挙されているが、
実際には .empty .popFront .popBack .front .back。
0439デフォルトの名無しさん2009/08/05(水) 06:46:32
思ったこと
st.iteratorとRangeの関係は?frontという名前が競合するんだが。
iteratorなしでlistに挿入って出来るの?
とか
0440デフォルトの名無しさん2009/08/05(水) 07:26:50
endを固定(empty)にして、イテレータのbeginとendをまとめたようなもの
0441デフォルトの名無しさん2009/08/05(水) 13:51:44
InBuffer作ってみました。
OutBufferをちょっといじった程度の物なので、これでいいならとっくに標準に入ってる気はしますが・・・。
何か指摘があればお願いします。

class InBuffer
{
ubyte data[];
uint offset;

invariant() { assert(offset <= data.length); }
this(in ubyte[] _data) { data = _data; }
void read(ref ubyte[] bytes) { bytes[] = data[offset..offset + bytes.length]; offset += bytes.length; }
void read(ref wchar[] chars) { read(cast(ubyte[]) chars); }
void read(ref dchar[] chars) { read(cast(ubyte[]) chars); }
void read(ref ubyte b) { b = data[offset]; offset += ubyte.sizeof; }
void read(ref byte b) { read(cast(ubyte)b); }
void read(ref char c) { read(cast(ubyte)c); }
void read(ref dchar c) { read(cast(uint)c); }
void read(ref ushort w) { w = *cast(ushort *)&data[offset]; offset += ushort.sizeof; }
void read(ref short s) { read(cast(ushort)s); }
void read(ref wchar c) { c = *cast(wchar *)&data[offset]; offset += wchar.sizeof; }
void read(ref uint w) { w = *cast(uint *)&data[offset]; offset += uint.sizeof; }
void read(ref int i) { read(cast(uint)i); }
void read(ref ulong l) { l = *cast(ulong *)&data[offset]; offset += ulong.sizeof; }
void read(ref long l) { read(cast(ulong)l); }
void read(ref float f) { f = *cast(float *)&data[offset]; offset += float.sizeof; }
void read(ref double f) { f = *cast(double *)&data[offset]; offset += double.sizeof; }
void read(ref real f) { f = *cast(real *)&data[offset] = f; offset += real.sizeof; }
void read(ref char[] s) { read(cast(ubyte[])s); }
}
■ このスレッドは過去ログ倉庫に格納されています