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

D言語 Part22

レス数が900を超えています。1000を超えると表示できなくなるよ。
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)
0802デフォルトの名無しさん2009/08/28(金) 16:57:46
>>800
ttp://shinh.skr.jp/d/
bit→boolで一応通ったけど。
0803デフォルトの名無しさん2009/08/28(金) 18:07:05
>>802
おお、通った。ありがとう!
0804デフォルトの名無しさん2009/08/28(金) 20:23:14
SDL1.3まだー
SDLにIMサポートさえ入ればGUIライブラリを捨てられる
08057962009/08/28(金) 23:27:39
>>797 >>798
やっぱバグですよね。すっきりした。

>> 801
そうです。

1947: Tag startTag = new Tag(tag_.name);
1948: startTag.attr = tag_.attr; // <- 追加

とりあえずこれで回避しました。ありがとう!
0806デフォルトの名無しさん2009/08/29(土) 10:11:32
http://www.blip.tv/file/2516083/
0807デフォルトの名無しさん2009/08/29(土) 19:38:40
動的配列のバッファ作ってCのライブラリに渡すのって.ptrで大丈夫?
こんな感じで問題ないんだろうか

DWORD[] buffer = new DWORD[size*3];
LibFunc(buffer.ptr);
0808デフォルトの名無しさん2009/08/29(土) 19:42:27
GCに回収されたらヤバそうだけど
そこ気をつけたら大丈夫じゃね?
0809デフォルトの名無しさん2009/08/29(土) 20:25:28
>>806
AndreiかわいいよAndrei
0810デフォルトの名無しさん2009/08/29(土) 22:13:05
DLLを作りたいんですが、コンパイラ引数は何を渡せばいいですか?
0811デフォルトの名無しさん2009/08/29(土) 22:18:57
>>810
-ofXXXX.dll
だけでいいんじゃなかったっけ。
0812デフォルトの名無しさん2009/08/29(土) 22:27:39
>>811
thx
0813デフォルトの名無しさん2009/09/02(水) 02:56:40
D3までの音沙汰があまりなくて寂しい
0814デフォルトの名無しさん2009/09/02(水) 03:45:59
以前のスレにもちらほらあったけど実行ファイルのサイズはもう少しくらい控えめに出来ないのかな。
特に文字列mixinしたら実行時には使われるはずの無い文字列が大量にEXE(-release)の中にあるけど、
不要な関数/文字列まで非デバッグのEXEに入れる必要ってあるの?
教えてエロイ人。
0815デフォルトの名無しさん2009/09/02(水) 04:14:47
exportしないのなら不要じゃないかな
確かにtemplate/mixinを多用するとその辺の肥大化が著しい
0816デフォルトの名無しさん2009/09/02(水) 04:18:04
mixin使わないから知らないんだけど
最適化オプションじゃ消えないの?
0817デフォルトの名無しさん2009/09/02(水) 07:39:54
確かめてないけど、immutableではなくてenumにしても残るの?
0818デフォルトの名無しさん2009/09/02(水) 12:57:35
DFLなんだけど同じ-release -Oであってもdfl.exeを使った場合が一番小さい
budで-Xにdfl.libとかphobos.libとかを付けたり消したりすることによってもサイズが違うし
dmdを使ってもまたサイズが違う
なんででしょう
0819デフォルトの名無しさん2009/09/02(水) 13:02:37
謎の
pure a = 1;
nothrow b = 1;
について何かご存じの方はいませんか?
0820デフォルトの名無しさん2009/09/02(水) 18:21:41
pureとnothrowって記憶域クラスとして利用可能なんだな。
……ところで、記憶域クラスって何なの?
autoとかimmutableとかstaticとかならまだ理解できるけど、
pureとかnothrowとかになるとよくわからなくなってくる…
08217882009/09/02(水) 19:41:28
pureもnothrowも記憶域クラスの構文に載せた方が実装の都合が良かったから
とりあえずそうなってるだけじゃない?
仕様では詳しく言及してないみたいだし
0822デフォルトの名無しさん2009/09/02(水) 19:42:39
2.032もうちょっとかな
0823デフォルトの名無しさん2009/09/03(木) 07:09:50
std.date.Dateって何のためにあるんだろう
てっきりこれを使って「現在時刻から1秒後を取る」みたいなことが
できるもんだと思ってたから10分くらい悩んだ
0824デフォルトの名無しさん2009/09/03(木) 12:37:02
http://twitter.com/WalterBright
0825デフォルトの名無しさん2009/09/03(木) 16:56:38
>824
Dな人のTwitterアカウント
http://lists.puremagic.com/pipermail/digitalmars-d/2009-July/060482.html

ちなみにハッシュタグは、うぉるたんが #d_lang を使ってるけど、
いま検索すると出てくるのは日本人ばっかりw
0826デフォルトの名無しさん2009/09/03(木) 17:54:27
D 2.032 きてた
0827デフォルトの名無しさん2009/09/03(木) 18:02:41
>CTFE error messages now explain why the function could not be interpreted at compile time
キタ━━━━━━━━(゚∀゚)━━━━━━━━━!!!
0828デフォルトの名無しさん2009/09/03(木) 18:05:01
>synchronized member functions now implicitly typed as shared.
これはどういうこっちゃ?
0829デフォルトの名無しさん2009/09/03(木) 18:22:35
CTFE系うごかねぇwwww
0830デフォルトの名無しさん2009/09/03(木) 18:43:57
Nested functions can now be used in CTFE
これは動くね
0831デフォルトの名無しさん2009/09/03(木) 22:17:32
>>828
class A{
 synchronized void f(){}
}

A x = new A;
x.f(); // error
auto y = new shared(A);
y.f(); // ok
08327962009/09/03(木) 22:42:38
>2.032
なおったー!
0833デフォルトの名無しさん2009/09/04(金) 11:26:54
toで死んだwwwたすけてwww
0834デフォルトの名無しさん2009/09/04(金) 11:50:06
コードは
0835デフォルトの名無しさん2009/09/04(金) 12:28:18
version(Windows) std.path.joinのバグ直してくれたよ
次の更新か最新のtrunkで
0836デフォルトの名無しさん2009/09/04(金) 12:49:30
簡単なバグは今「直してちょ」と伝えるチャンス
特にphobos
なんかあったらissue numberください
0837デフォルトの名無しさん2009/09/04(金) 15:18:27
toで死ぬとか・・・俺には恐ろしすぎて触れない
0838デフォルトの名無しさん2009/09/04(金) 15:21:52
昆布に毒でも入ったのか?
0839デフォルトの名無しさん2009/09/04(金) 15:55:13
import std.conv;

void main() {
int number_normal = 10;
auto a = to!(string)(number_normal);

const number_const = 10;
auto b = to!(string)(number_const); // だめ

immutable number_immutable = 10;
auto c = to!(string)(number_immutable); // だめ
}

----------------------------------------

C:\dmd\dmd\src\phobos\std\conv.d(2580): Error: variable std.conv.to!(immutable(char)[],const(int)).to.u cannot modify const
C:\dmd\dmd\src\phobos\std\conv.d(8): Error: template instance std.conv.to!(immutable(char)[],const(int)) error instantiating

使い方が悪いんだろうか?
0840デフォルトの名無しさん2009/09/04(金) 17:28:54
>>839
2.031ではいけているからtoに変更があったのかな

ところでconst/immutable storage classって使い分け難しいよね
0841デフォルトの名無しさん2009/09/04(金) 22:22:24
それほどでもない。
0842デフォルトの名無しさん2009/09/04(金) 22:47:32
>>836
「ソースコードのどこそこが悪い」と書くとすぐに直してもらえるな。
phobosなら自分でデバッグできるし。

>>840
toというよりコンパイル時の評価順にに変更があるみたい
循環参照があるソースコード全滅 orz
0843デフォルトの名無しさん2009/09/04(金) 23:11:39
>>842
評価順に依存してるコードに問題があるのか?
0844デフォルトの名無しさん2009/09/05(土) 00:11:16
dsssでビルドすると破綻するくらい入り組んだ使い方してる俺の出番だな
0845デフォルトの名無しさん2009/09/05(土) 00:22:33
>>843
ごめん。std.conv.toは中身が書き換わってた
以前2.031の段階でroundToにimmutable/constなものが通らないのでstd.traits使って書き直しとけとITSにレポートしておいたのだが、
Andreiがついでにいろいろ書き直した結果こうなったっぽい
0846デフォルトの名無しさん2009/09/05(土) 00:32:14
ちなみにエラーの原因はstd.convの所定の行を含む関数見れば分かるので、
自分でデバッグしてITSにレポートするといいかと
0847デフォルトの名無しさん2009/09/05(土) 01:42:30
http://d.puremagic.com/issues/show_bug.cgi?id=3288
0848デフォルトの名無しさん2009/09/05(土) 13:45:03
次バージョン出るまで>>847で対応しまふ。�d
0849デフォルトの名無しさん2009/09/05(土) 14:11:06
仕様安定したら一緒に遊んでみようと思ってるんだが
Dは相変わらず仕様コロコロリンっぽいな
0850デフォルトの名無しさん2009/09/05(土) 14:27:29
1.0系列があるじゃない
0851デフォルトの名無しさん2009/09/05(土) 14:53:19
いや、半年くらい前に1回破壊的変更があってTangoすら使えなくなることがあったし、
ついこの前の更新でも余裕で言語仕様に追加があった。
D1系が安定というのは迷信。バージョンごと固定しなきゃダメだ。
0852デフォルトの名無しさん2009/09/05(土) 15:00:35
そしてバージョン固有のバグに引っかかってにっちもさっちも行かなくなる
0853デフォルトの名無しさん2009/09/05(土) 16:39:27
>>842
> 循環参照があるソースコード全滅
これは致命的だなぁ…D1系ですらDFL死んでるし。
0854デフォルトの名無しさん2009/09/05(土) 17:16:52
ああやっぱりDFLが死んだのはそのせいか
importしてるはずのシンボルが未定義になってる
0855デフォルトの名無しさん2009/09/05(土) 17:49:11
>>854
循環参照するクラスたちをファイルを分けずにひとつにしてしまうと動くことがある。
これ自体はもっと以前からあるバグのようなのだが、評価順が変わって顕在化するようになった模様
http://d.puremagic.com/issues/show_bug.cgi?id=3286
0856デフォルトの名無しさん2009/09/05(土) 20:06:23
Error 42: Symbol Undefined _D15TypeInfo_Struct6__vtblZ
Error 42: Symbol Undefined __d_array_bounds
リンクエラーの原因がわかりません。
どうすればいいのでしょうか?

Error 42: Symbol Undefined __d_assert_msg
Error 42: Symbol Undefined __tls_array
Error 42: Symbol Undefined _D11TypeInfo_Aa6__initZ
Error 42: Symbol Undefined __d_arrayappendT
Error 42: Symbol Undefined __adEq2
Error 42: Symbol Undefined _D3std9algorithm12__ModuleInfoZ
Error 42: Symbol Undefined _D10ModuleInfo6__vtblZ
08578562009/09/05(土) 20:07:34
すみません。エラーメッセージに割り込んで書いてしまいました。
0858デフォルトの名無しさん2009/09/05(土) 20:15:59
たぶんそれ正しいランタイムライブラリ(たぶんphobos.lib)がリンクされてないか、
今のコンパイラのバージョンのランタイムライブラリで一般のライブラリをコンパイルしてないかじゃないかな
とりあえず環境を一から構築してみるといいかも。
0859デフォルトの名無しさん2009/09/05(土) 23:52:21
>>858
あー情報後だしになって申し訳ないですが、DLLを作ろうとしていて、そこで問題があったっぽいです。
試しにDllMainを普通のmainにしたら、意味のわからないリンクエラーはなくなりました。
ありがとうございました。
0860デフォルトの名無しさん2009/09/06(日) 00:44:54
>>855
まあ多分この問題はすぐに解消されるだろ
と信じていよう
0861デフォルトの名無しさん2009/09/06(日) 00:55:09
-200年後-
0862デフォルトの名無しさん2009/09/06(日) 08:56:49
フラグたてんなw
0863デフォルトの名無しさん2009/09/07(月) 04:58:11
Dに#ifndefの代替手段って何かあったっけ?
ありそうでなかったような気がしてきたんだが…
0864デフォルトの名無しさん2009/09/07(月) 05:32:12
static if (!(HOGE)) { ... }

version (HOGE) {}
else { ... }
/(^o^)\
0865デフォルトの名無しさん2009/09/07(月) 08:48:11
#ifndefは邪道
ifにifnとかないし
ってことで納得しといて
0866デフォルトの名無しさん2009/09/07(月) 09:59:35
perlにはunlessってのがあるけどな。
0867デフォルトの名無しさん2009/09/07(月) 16:09:49
それプリプロセッサディレクティブじゃないし
0868デフォルトの名無しさん2009/09/07(月) 16:34:13
待て待て
あれは static unless が欲しいという話だ
0869デフォルトの名無しさん2009/09/07(月) 16:43:51
いやまて、perlにunlessとかあろうが、D言語にその予約語は不要だと思うぞ…
でも、 version(!HOGE) みたいなことができたら嬉しいのは、確かに思うこともある。
0870デフォルトの名無しさん2009/09/07(月) 16:59:49
別にstatic unlessが必要だ!とは俺も思ってないがな
version(Hoge){}else{
...
}
でも別に困りはしないが不格好ではある
構文もversion(!HOGE)しか思いつかないが ! の意味としっくりこないのが悔やまれる
0871デフォルトの名無しさん2009/09/07(月) 20:02:52
import std.stdio;

template FC() {
 void fieldCount() {writeln(this.tupleof.length);}
}

void main() {
 class Test1 { mixin FC; int a, b, c; }
 class Test2 { int a, b, c; mixin FC; }
 class Test3 { int a; mixin FC; int b, c; }
 (new Test1).fieldCount;
 (new Test2).fieldCount;
 (new Test3).fieldCount;
}

出力結果
0
3
1

なん…だと…?
0872デフォルトの名無しさん2009/09/07(月) 20:58:20
直接書けば大丈夫だけど、テンプレートmixinしたときには
その場所までに定義された分だけ見た値が返ってくるのか。
関数名をthis.tupleof.lengthに依存するようにしたら、同じクラス中で何度もmixinできるな。

コンパイル時のクラス定義時にはそのへんのプロパティは参照できず、
このfieldCountのような場合はちゃんとまともな値を返す、ってのが正しい動作かな?
0873デフォルトの名無しさん2009/09/08(火) 01:11:39
void f(const string s){}
ってsの型どうなんの?
0874デフォルトの名無しさん2009/09/08(火) 01:30:38
>>873
const(string) == const(immutable(char)[])
0875デフォルトの名無しさん2009/09/08(火) 20:03:58
import std.stdio;

template W(T, T U) { string W = U.stringof; }

enum En { A }

void main() {
 writeln(W!(int, 123)); // "U"と出力
 writeln(W!(string, "str")); // "U"と出力
 writeln(W!(En, En.A)); // "En"と出力
}

この3番目が"En"になるのは何でなんだぜ?
0876デフォルトの名無しさん2009/09/08(火) 21:07:40
なにそれきもい
0877デフォルトの名無しさん2009/09/09(水) 00:48:39
>>875
テンプレイト以前にそもそも、En.A.stringof が En.A になるはずなのに
En になっちゃってるね。バグだと思う。報告よろ。
0878デフォルトの名無しさん2009/09/09(水) 07:30:10
よし、英語勉強してくる
0879デフォルトの名無しさん2009/09/09(水) 13:06:32
import core.thread;
class C { double d; }
void main() {
  while (1) {
    scope t = new C; // クラスインスタンスならスタックに割り当てられて
    //scope t = new double; // プリミティブ型がスタックに割り当てられないのは納得が行かん
    Thread.sleep(10000);
  }
}
0880デフォルトの名無しさん2009/09/09(水) 14:18:32
ふつうに構築しろよww
0881デフォルトの名無しさん2009/09/09(水) 15:10:04
>>879
仕様によれば、scope変数の初期化にnew式を使う場合は、
クラスに限らずスタックに割り当てることになってるからバグだな。
報告しといてちょ
0882デフォルトの名無しさん2009/09/09(水) 15:30:19
>>879
ほう
そんなのあったのか
0883デフォルトの名無しさん2009/09/09(水) 16:44:53
>>879
よくしらべたなぁ・・・
0884デフォルトの名無しさん2009/09/09(水) 20:21:51
連想配列リテラルってなんで性的に使えないんだろ…
0885デフォルトの名無しさん2009/09/09(水) 21:29:55
16進数の文字列を整数に変換する関数ありますか?
0886デフォルトの名無しさん2009/09/09(水) 21:51:36
C++のboostのようにinclude(import)するだけで使えるライブラリを作りたいと思っています。
ライブラリ用のプロジェクトを作ってそこにソースを置いて、sc.iniのDFLAGSにパスを通したのですが、コンパイルはできてもリンクエラーが出てしまいます。
どうやればいいのでしょうか?
0887デフォルトの名無しさん2009/09/09(水) 21:57:45
>>885
なぜかないと思う
0888デフォルトの名無しさん2009/09/09(水) 22:00:37
>>885
そんなもんparse!int("0xffff")とかで…
できないね。変態度が足りん

>>886
importはincludeと違ってそのまんまコピーしてくるわけじゃないからなあ
dmd a.d library.d
みたいにいちいち一緒にコンパイルするか、自動的に依存するファイルを探してくれるbudみたいなツールを使うか、
ライブラリを作ってDFLAGSでリンクするように設定するか

となるとimportするだけで使えるライブラリって無理か
0889デフォルトの名無しさん2009/09/09(水) 22:02:03
>>885
ttp://d.hatena.ne.jp/haru-s/20060921/1158843229
をさらにいじってこうしてる
long hexToDecimal(char c) pure
{
 return hexToDecimal([c]);
}
long hexToDecimal(in char[] str) pure
{
 long sum;
 foreach(char c; str)
  sum = sum*16 + ((c|0x20)-'0')%('W'-'0');
 return sum;
}
0890デフォルトの名無しさん2009/09/09(水) 22:06:23
>>886
#includeするだけで使えるライブラリ?
これの出番かw
mixin(import(filename.d"));
0891デフォルトの名無しさん2009/09/09(水) 22:14:27
>>890
見るからに邪悪すぎるwww
0892デフォルトの名無しさん2009/09/09(水) 22:23:33
>>886
ありとあらゆる関数をテンプレートにすればいいよ.
0893デフォルトの名無しさん2009/09/09(水) 22:27:04
とりあえず簡単なテンプレート関数だけのモジュールならimportだけで使えた。

なんかリンクする必要があるなら、ちゃっかりライブラリ側でpragma(lib,"foo.lib");とかやっちゃえばいい気がする。
0894デフォルトの名無しさん2009/09/09(水) 22:47:02
T func(T : string)()
{
  return "Hello,world!";
}
T func(T : int)()
{
  return -1;
}

void main()
{
  string str = func();
  writeln(str);//Hello,world!
}

これが動いたらやりたいことが色々できるんだけど無理かなぁ
0895デフォルトの名無しさん2009/09/09(水) 22:57:02
auto t = func();
とかの時だけ特別にエラーでいいからやってほしいよな
0896デフォルトの名無しさん2009/09/09(水) 23:03:40
あー、ついこの前欲しいと思ってたやつだ
autoを例外にすればやってやれないことはないと思うんだけどな
0897デフォルトの名無しさん2009/09/09(水) 23:17:22
レスthx

>>888
C++のようにはいかないんですね。
>>890
それはちょっとw
>>892-893
なるほど。テンプレートだけならいけるんですね。
0898デフォルトの名無しさん2009/09/09(水) 23:53:57
自作したstaticライブラリにリンクしたら
Error: no object files to link
というエラーが出たんですが、これはどういう意味なのでしょうか?
0899デフォルトの名無しさん2009/09/10(木) 00:15:45
>>896
例外指向プログラミングときいて!
0900デフォルトの名無しさん2009/09/10(木) 00:30:18
>>899 そうだったのか
0901デフォルトの名無しさん2009/09/10(木) 02:07:19
>>894
左辺値から右辺値を推論って最近話題だよね
レス数が900を超えています。1000を超えると表示できなくなるよ。