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

D言語 Part22

レス数が950を超えています。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)
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
左辺値から右辺値を推論って最近話題だよね
0902デフォルトの名無しさん2009/09/10(木) 07:35:41
>>889
parse!int("0xff")に統合して欲しいところだが
N進数文字列から数値への変換関数とどちらがいいか・・・?
toは数値からN進数文字列への変換関数としても使えるようだ
0903デフォルトの名無しさん2009/09/10(木) 13:49:03
baseを指定しなかった場合はプレフィックスから自動判別、
baseを指定した場合はプレフィックスでエラー

がいいと思う。
0904デフォルトの名無しさん2009/09/11(金) 17:15:45
(´・ω・`)D言語ってOpenGLを使えますのん?ん?ん?
0905デフォルトの名無しさん2009/09/11(金) 18:16:59
どうして使えないと思ったのか
0906デフォルトの名無しさん2009/09/11(金) 19:03:49
DxLibなら使えるよ!!
0907デフォルトの名無しさん2009/09/11(金) 19:28:02
glfwなんか、公式でバインダ付属だったな。
もっとも、そのままじゃD2で動かんが。
0908デフォルトの名無しさん2009/09/11(金) 19:42:15
つttp://shinh.skr.jp/d/porting.html
openglの奴は修正なしでD2でも動いたよ
0909デフォルトの名無しさん2009/09/11(金) 19:49:00
D言語の画像処理はDxLibが必須だよ!!
0910デフォルトの名無しさん2009/09/11(金) 20:06:20
ならば今すぐ*nixどもすべてにDirectXを与えてみせろ!
0911デフォルトの名無しさん2009/09/11(金) 20:22:35
Dで実行ファイルがあるディレクトリを簡単に取得する方法教えてください
0912デフォルトの名無しさん2009/09/11(金) 20:25:26
>>911
void main(string[] args) {
 string dir = std.path.dirname(args[0]);
}

これmain以外の所から取れるんだろうか?
0913デフォルトの名無しさん2009/09/11(金) 21:03:12
>>912
Windowsではmainのargを初期化するのにGetCommandLineWを使っているから
argv[0]は完全修飾のファイルパスになるけど、
PosixではCランタイムに依存しているので必ずしもディレクトリ部がついているとは限らないし
そこにファイル名が入ってすらないかもしれない。

正確を期すならばGetModuleFileNameを使ったり、Linuxなら/proc/self/exeのリンク先を見たりするのがいいと思う。
OSXやFreeBSDはしらない。
0914デフォルトの名無しさん2009/09/11(金) 22:53:19
dsource.orgのWindows API Bindingsの
WSAAsyncSelect(SOCKET, HWND, u_int, long); は
WSAAsyncSelect(SOCKET, HWND, u_int, int); じゃないかと思うんだが、どうだろう。
0915デフォルトの名無しさん2009/09/11(金) 23:14:14
0x_
って文法上は認められてるみたいだけどこれいくつになるの
0916デフォルトの名無しさん2009/09/12(土) 00:10:20
>>915
整数リテラルの説明のBNF?表記だけみればそうかもだけど
>整数の途中に文字 '_' を入れることができます。 この文字は単に無視されます。
て説明されてて、dmdはちゃんとしたエラーだしてるから、
文法上許してない、でいいんじゃね?
0917デフォルトの名無しさん2009/09/12(土) 00:39:40
eclipse+descentを使っているのですが、
複数のソースをビルドする時、手動でコンパイル引数を入力するしかないのでしょうか?
ctrl+クリックでソースを複数選択した状態でビルドしても、1つのソースしかビルドされていないみたいです。
0918デフォルトの名無しさん2009/09/12(土) 01:20:07
>>916
0_
はどうかな
文法上は10進数じゃなくて8進数になるはずだけど
0x_がエラーならこれもエラーなのかな
でも0_がエラーで1_はOKってのもなんか変だよな

あと _._ は浮動小数点数になるのかな
_1._2は浮動小数点数1.2なのか_1オブジェクトの_2メンバなのか

よく読むとこの辺の文法ツッコみ所満載だな
0919デフォルトの名無しさん2009/09/12(土) 01:30:31
>>918
ヒント: 字句解析と意味解析は別
0920デフォルトの名無しさん2009/09/12(土) 01:33:59
>>918
そのりくつはおかしい
http://www.kmonos.net/alang/d/2.0/lex.html
ここを読めばわかる
0_ は _ が無視されてただの 0 なので、整数リテラルの、Decimal
_._や_1._2は、 _ から始まるため、 Identifier
0921デフォルトの名無しさん2009/09/12(土) 01:44:20
>>920
いやいや、そこの文法に忠実に従うとそうなるっていう話なんだけど
Decimalは「0」一文字か、NonZeroDigitから始まる必要があるから
0_ はDecimalではない
一方「_」はOctalDigitなので0_はOctalに適合する
したがって0_ はOctal

一方、DecimalFloatは「DecimalDigits . DecimalDigits」で、
「_」はDecimalDigitなので _._や _1._2 はDecimalFloatに適合する
もっとも _ や _1 がIdentifierに適合するのは確かだけど、
字句解析はmaximal munchルールだから先読みしてやはり _1._2 はDecimalFloatに適合する(>>919の指摘通りですね)
スペース入れて 「_1 . _2」ならIdentifier2つとドットになるんだろうけど
0922デフォルトの名無しさん2009/09/12(土) 01:55:12
そんな感じの記述の齟齬は他にもなんかあった気がするな
0923デフォルトの名無しさん2009/09/12(土) 02:00:44
ひどいのだと
._e+_f
がFloatLiteralに適合してしまう
0924デフォルトの名無しさん2009/09/12(土) 03:36:01
Dの仕様のBNFはかなり適当だな。
実装を変えたのにドキュメントはそのままの箇所も結構あるし。
09259202009/09/12(土) 03:54:05
>>921
確かにそのとおりだね。
報告よろしく
0926デフォルトの名無しさん2009/09/13(日) 13:40:19
結局、足りてない説明って
・リテラル先頭に'_'はおけない(Identifierになるから)
・DecimalDigits,HexDigits,OctalDigits,BinaryDigits は
 '_'以外の該当文字が必要('_'のみで構成されるのは不可)
って感じ?
(BNFでない説明も読めば、あまり勘違いしそうにないような
気もするけど)
0927デフォルトの名無しさん2009/09/13(日) 14:14:22
._0 とかどうしようもなくないか?
モジュールのスコープ解決演算子 '.' を使ってモジュール全体のスコープから_0というIdentifierを探すのか、
0.0 という意味の double型の浮動小数点数リテラルなのか、
仕様を全部読んでもどっちが正しいのかわからないような。
0928デフォルトの名無しさん2009/09/13(日) 16:07:42
.0って書けてもさほど嬉しくないから._0はglobal identiferでいいだろ
0929デフォルトの名無しさん2009/09/13(日) 18:10:01
.1 は数字であって欲しいけど
._1 は数字であって欲しくないなあ
0930デフォルトの名無しさん2009/09/13(日) 18:35:26
スコープ解決された_1というIdentifierは表現できないってこと?
0931デフォルトの名無しさん2009/09/13(日) 18:54:48
>>930
あ?
0932デフォルトの名無しさん2009/09/13(日) 21:38:15
結論:ドキュメント直してください
0933デフォルトの名無しさん2009/09/13(日) 22:03:00
ちょっと待って何か思い出した

ttp://www.digitalmars.com/d/2.0/function.html
main() Functionの例古すぎじゃね?
0934デフォルトの名無しさん2009/09/14(月) 19:00:21
Dのソースファイル配布するときってコンパイルしたDMDのバージョンも一緒に載せないと意味ないよね
0935デフォルトの名無しさん2009/09/14(月) 20:55:28
疑似Dのコードで配布して、使う人が自分のコンパイラに合わせてチューンすればいいよ
0936デフォルトの名無しさん2009/09/14(月) 20:57:17
>>935のほうがDっぽいな。
0937デフォルトの名無しさん2009/09/14(月) 21:01:11
疑似コードからバージョン別のDのコードにコンバートする言語作れば解決だな
0938デフォルトの名無しさん2009/09/14(月) 21:04:33
まず、Pseudo-D言語の策定からだな。
0939デフォルトの名無しさん2009/09/14(月) 21:56:14
コンパイラのバージョン、標準ライブラリのバージョンごとに書かれたparse関数があって
mixin(parse!(import("mymodule.pd")));
とかしてやるわけか。
0940デフォルトの名無しさん2009/09/14(月) 22:07:33
とりあえずD2をD1に変換してください
0941デフォルトの名無しさん2009/09/14(月) 22:19:18
そしてPseudo-Dの仕様が一向に固まらなくて疑似Pseudo-Dのコードで配布しようという所に落ち着く
0942デフォルトの名無しさん2009/09/14(月) 22:28:06
Pseudo-Pseudo-Dの誕生です。しかし、Pseudo-Pseudo-Dの仕様が固まらず、Pseudo-Pseudo-Pseudo-D以下略
0943デフォルトの名無しさん2009/09/14(月) 22:56:55
Stack Overflow
0944デフォルトの名無しさん2009/09/14(月) 23:54:10
doxygenってD言語(DMD2.031)に対応してますか?
version1.6.1を使ってみたところ上手くhtmlを吐いてくれない。。
0945デフォルトの名無しさん2009/09/15(火) 00:18:30
>>944
-Dすれば?
ソースが複雑だとDMDですら落ちるけど。
0946デフォルトの名無しさん2009/09/15(火) 01:01:36
>>945
レスthx
オプション知らなかった、試してみます。
0947デフォルトの名無しさん2009/09/15(火) 04:38:29
既存のライブラリをあるフォルダAに入れて使いたいと思ったとき、
いちいち module や import などで A. って付けないといけないですか?

だとしたらメンドクサイ・・・。
0948デフォルトの名無しさん2009/09/15(火) 05:57:57
>>947
-IA
0949デフォルトの名無しさん2009/09/15(火) 07:11:59
いあいあ
0950デフォルトの名無しさん2009/09/15(火) 07:22:51
くとぅるふふたぐん
0951デフォルトの名無しさん2009/09/15(火) 09:49:30
950越えたから保守
俺ケータイなので
誰か次スレ立てておk
0952デフォルトの名無しさん2009/09/15(火) 13:20:29
>>948

なるほど、どうもありがとう!!
0953デフォルトの名無しさん2009/09/16(水) 03:39:32
Dのデストラクタは予想以上に呼ばれないね
消したら?
0954デフォルトの名無しさん2009/09/16(水) 03:53:00
そりゃガーベジコレクタが動くまでは呼ばれないから
C++のデストラクタのようなものを期待してれば裏切られる。

Dのクラスオブジェクトのデストラクタは、
Javaや.NETでいうファイナライザに相当するもの。
レス数が950を超えています。1000を超えると書き込みができなくなります。