トップページ⇒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)
0482デフォルトの名無しさん2009/08/07(金) 18:35:57
public関連は暗黙friendでちょっと確認面倒だからな・・・
0483デフォルトの名無しさん2009/08/07(金) 18:47:51
>>481
ごめん
こういうことなので使えなくなるは言い過ぎたかも

Q. なぜ __add__ や __div__ といった名前を opAdd, opDiv の代わりに使わなかったのですか?
A. __ を使った予約語は、処理系特有の言語拡張を表すべきで、 言語の基本的な部分に使うものではないと考えています。
0484デフォルトの名無しさん2009/08/07(金) 19:13:50
python涙目
0485デフォルトの名無しさん2009/08/07(金) 20:01:44
>>483
うーむ。
しかし処理系に依存しない方法があるならそっちの方がいいですよね。
あれ?phobos自体が処理系に依存?w
0486デフォルトの名無しさん2009/08/07(金) 20:36:09
やべぇQtD最高だわ
コンパイルできるだけじゃなくリンクまでできる
しかも動く
感動して涙出てきた
0487デフォルトの名無しさん2009/08/07(金) 21:10:06
>>486
・・・・・
0488デフォルトの名無しさん2009/08/07(金) 23:31:54
>>486
C++使ったら失禁しちゃうだろ……。
0489デフォルトの名無しさん2009/08/08(土) 00:05:13
via ML
int x = 2^^3;//8
0490デフォルトの名無しさん2009/08/08(土) 00:20:55
どちらかというと
*^ pow
/^ log
として欲しいな。
max/minは昔のgccの拡張っぽく >? と <? にしてほしい。
abs演算子(単項)は何がいいだろ。
0491デフォルトの名無しさん2009/08/08(土) 06:52:04
|> n <|
0492デフォルトの名無しさん2009/08/08(土) 07:43:33
あまり記号に頼るのは勘弁。
たまーにしか使わないようなものはどうせ覚えられないんだから、
検索しやすい名前にしておかないとダメだ。
0493デフォルトの名無しさん2009/08/08(土) 10:05:33
void foo(in int[] aaa, in int[] bbb)
{
Tuple!(const(int[]), const(int[])) tup(aaa[], bbb[]);
...
}

Error: aaa is used as a type
Error: bbb is used as a type
どうすればいいのでしょうか?
0494デフォルトの名無しさん2009/08/08(土) 16:00:17
そのスライスいるの?
0495デフォルトの名無しさん2009/08/08(土) 16:45:11
>>494
Tuple!(const(int[]), const(int[])) tup(aaa, bbb);
にすると
Error: aaa is used as a type
Error: cannot have parameter of type void
Error: bbb is used as a type
Error: cannot have parameter of type void
になります。
0496デフォルトの名無しさん2009/08/08(土) 20:01:42
下のプログラムの実行結果で&thisと&testの値が変わるのは正しい動き?
(DMD v1.030を使用)

class Test
{
public void print()
{
printf("(this, &this):(%p, %p)\n", this, &this);
}
}

void main()
{
Test test = new Test;

printf("(test, &test):(%p, %p)\n", test, &test);
test.print();

}
04974932009/08/08(土) 20:02:21
tuple(返り値で作ったTupleを返すやつ)を使って、配列を含むタプルは作れました。
でも、constが含まれるとエラー(tupleのソース見ても明らかにconstは無理)。
const配列を含むタプルはどうやって作ればいいんだろう・・・。
0498デフォルトの名無しさん2009/08/08(土) 20:54:56
>>496

class Test {
public void print() { writef("(this, &this):(%p, %p)\n", this, &this); }
void isSelf(Test a, Test b) {
writefln("this:a %b this:b %b a:b %b", this is a, this is b, a is b);
writefln("&this: %p &a: %p &b: %p\n", &this, &a, &b);
}
}

void main()
{
Test test = new Test, test2 = new Test;

writef("(test, &test):(%p, %p)\n", test, &test);
test.print();
test.isSelf(test, test2);

writef("(test2, &test2):(%p, %p)\n", test2, &test2);
test2.print();
test2.isSelf(test, test2);
}
04994962009/08/08(土) 23:44:01
>>498
なるほど
&つけるとヒープ上の実体のアドレスが得られると勘違いしてました。
参照がCのポインタそのものなんですね。
0500デフォルトの名無しさん2009/08/09(日) 02:59:58
intがsize_tに暗黙に変換されるのって抑制できませんか?
0501デフォルトの名無しさん2009/08/09(日) 08:07:12
minmaxを記号でやる言語があるのかもしれんが
頻出処理ではないのに貴重な記号を使うのはもったいないのと
複数要素、およびコンテナ、イテレータのことを考えると記号でやる処理にしては複雑すぎるのと
本来数学でさえ記号を使わないのでいらないと思う

absの記号は|n|以外だとむしろわかりにくいのでこれでないならいらないかな
0502デフォルトの名無しさん2009/08/09(日) 08:56:02
>>500
uintのaliasなのかと思ったら何これ?
alias typeof(int.sizeof) size_t;

typedef uint size_t;
にしたらいいのか?
0503デフォルトの名無しさん2009/08/09(日) 09:05:51
>>502
sizeofプロパティの型をsize_tとするって意味じゃね。
uint決め打ちじゃなくて。
0504デフォルトの名無しさん2009/08/09(日) 11:17:28
32bit版と64bit版を書き分けるのマンドクセってことだろう
0505デフォルトの名無しさん2009/08/09(日) 11:33:23
>>503-504
なるほど環境で変わるってことね
0506デフォルトの名無しさん2009/08/09(日) 12:07:50
クラスのメンバである配列について、コンストラクタでnewされ、その後長さは変わらないが、中身は変えるような場合、
うまくconstをつける方法はありますでしょうか
0507デフォルトの名無しさん2009/08/09(日) 13:05:44
std.typecons.Rebindable
ただし>>210
0508デフォルトの名無しさん2009/08/09(日) 13:21:40
書き方が悪くて申し訳ありません。
const オブジェクトへの書き換え可能な参照ではなく、
書き換え可能な配列へのconst参照を作るにはどうしたら良いのかなと……
推移的constで中身も書き換え不可能にならないようにするには、と。
0509デフォルトの名無しさん2009/08/09(日) 13:28:01
Rebindableの配列を作る
配列自体をやり取りしようとすると一瞬にして破綻するけど
0510デフォルトの名無しさん2009/08/10(月) 10:30:37
言語仕様やPhobosについて、公式サイトのドキュメントだけじゃ説明不足に感じる事があります。
詳細までキッチリ書いてある仕様書のような物ってないんですかね?
0511デフォルトの名無しさん2009/08/10(月) 11:18:59
DMDおよびPhobosのソースコード
0512デフォルトの名無しさん2009/08/10(月) 13:11:09
>>511
Phobosのソースはよくみますが、言語仕様を理解しきれてなくて分からない時があります。
コンパイラのソースも付いていたのは気づきませんでした。
読むの大変そうだ・・・
0513デフォルトの名無しさん2009/08/10(月) 13:34:51
DMDは実装の一つであって言語仕様そのものではないんじゃないの?
それともDMDの挙動がD言語の仕様に決められてるの?
0514デフォルトの名無しさん2009/08/10(月) 14:02:49
D2早くstableになれよ
0515デフォルトの名無しさん2009/08/10(月) 14:08:26
コンパイラのソース嫁はさすがにスパルタすぎじゃね
05165112009/08/10(月) 14:28:13
>>512,515
コンパイラの方は冗談のつもりでした・・・
私は、実装がどうであれドキュメント化されなければD言語の仕様としては「未定義」であると思っています。
ですので、説明不足に感じるところがあるのであれば、ウォルターたんに直接
「〜〜だからドキュメント化してくれ!」
ってお願いしに行くのが一番いいのではないかと思います。
05175122009/08/10(月) 16:03:53
コンパイラのソースは興味がないことはないですが、さすがに読む気にはなれませんでした。
ドキュメントが不足してたり、ぐぐっても出てくる物が少ないところがD言語はつらいです。
言語の仕様はいいんだけどなぁ。
0518デフォルトの名無しさん2009/08/10(月) 16:44:31
仕様が先に決まる言語なんてつまんない物が多いし、
Dは現状で特に説明不足と感じることもないなあ。
まあ自分で処理系を作ろうと思ったら大変なのかも、程度。
0519デフォルトの名無しさん2009/08/10(月) 16:59:05
ぶっちゃけドキュメントで明記していようが
平気で破壊的更新をするウォルたんなんだから、
気にせず適当に使うのがいいとおもう
0520デフォルトの名無しさん2009/08/10(月) 17:00:49
いきなりコンパイル通らなくなったらChangeLog見に行くくらいでいいと思う
0521デフォルトの名無しさん2009/08/10(月) 17:49:04
しばらく見ないうちに全然変わってるのが常だから
仕様なんていちいちチェックしないで適当に書いた方がいい

D言語の仕様は決まってない&書いてない&そのうち変わるの三拍子
0522デフォルトの名無しさん2009/08/10(月) 18:23:37
ドキュメントにも将来的には〜予定です。とか普通に書いてあるしな。
05235122009/08/10(月) 19:51:54
たしかに仕様がどんどん変わっていく身軽さはD言語のいいところだと思うので、仕方ないところなんですね。
0524デフォルトの名無しさん2009/08/10(月) 20:33:04
・標準ライブラリを使った8行なら大丈夫だろうと思っていたら仕様変更によるエラー20件に襲われた
・リリースから1日の時点でプログラマが頭から血を流して倒れていた
・足元がぐにゃりとしたのでドキュメントをめくってみると仕様が未定義だった
・tangoとGUIライブラリを突っ込んで倒れた、というかビルドする前にバグとかを修正する
・constがcastに襲撃され、constも「immutableも」全員編集された
・リリースから翌日までの10時間の間に破壊的変更に襲われた
・Dプログラマの全員がレイプ経験者。しかもD1が安定しているという都市伝説から「初心者ほど危ない」
・「そんな危険なわけがない」といってコーディングしたプログラマが5分後アクセス違反まみれで戻ってきた
・「何も書かなければエラーになるわけがない」と-safeをつけてコンパイルしたコードがphobosのエラーを食らって戻ってきた
・templateから半径200行はエラーにあう確率が150%。dmdのバグに襲われてdsssのバグに襲われる確率が50%の意味
・dmdにおける更新による修正は1月平均120件、うち約20件が破壊的変更
0525デフォルトの名無しさん2009/08/10(月) 20:49:41
>>524
最後の
それだけの変更はどうせ長続きしないからむしろ歓迎w
0526デフォルトの名無しさん2009/08/10(月) 22:22:52
うーん・・・constを要素としたTuple(std.typeconsの方)を作ろうとするとエラーが発生する。
C:\dmd\windows\bin\..\..\src\phobos\std\typecons.d(352): Error: can only initialize const member _field_field_0 inside constructor

Tupleのコンストラクタ↓
this(U...)(U values) if (U.length == Types.length)
{
foreach (i, Unused; Types)
{
field[i] = values[i];
}
}

拾ってきたサンプルコード↓
void print_all(T...)(T xs)
{
foreach(x; xs)
writeln( x, " : ", typeid(typeof(x)) );
}

print_allにconstを渡してもエラーが出ないのに、Tupleのコンストラクタでエラーが出る意味がわからないです。
どういうことなのでしょう?
0527デフォルトの名無しさん2009/08/10(月) 22:34:04
配列の中に値を代入しようとしてるからかな

class A {
 const(int[]) aaa;
 this() {
  aaa.length = 1;
  aaa[0] = 1; // これは通らない
  aaa = [1]; // これは通る
 }
}
0528デフォルトの名無しさん2009/08/11(火) 05:58:49
>>527
うーん、fieldがconstになる理由が、ソース見てもわからないです。
constを要素にできないのは、Tupleの仕様なんですかね?
0529デフォルトの名無しさん2009/08/11(火) 13:52:00
「本物の」プロパティが来るらしいぞ
http://www.reddit.com/r/programming/comments/99aea/reddit_what_programming_language_do_you/c0bwdq1#
0530デフォルトの名無しさん2009/08/11(火) 15:26:00
最近のMLはDIP含めプロパティに関して活発だったからなぁ
どうなるのか楽しみ
0531デフォルトの名無しさん2009/08/11(火) 15:56:01
本物のプロパティってC#みたいになるの?
今までの疑似プロパティも継続して使えるのかどうかが気になる
0532デフォルトの名無しさん2009/08/11(火) 16:23:15
D言語の慣習としては今までのプロパティはなかった事にして、破壊的変更。
D言語ユーザー阿鼻叫喚に期待
0533デフォルトの名無しさん2009/08/11(火) 16:46:43
すべてはウォルタータンの御心次第。
0534デフォルトの名無しさん2009/08/11(火) 16:47:14
T2ってなに?
0535デフォルトの名無しさん2009/08/11(火) 16:57:13
今までのプロパティ好きだったけどな
問題があったのかな
0536デフォルトの名無しさん2009/08/11(火) 17:20:23
>>534
ターミネーター2。
じゃなくて、話の流れからして、D2用Tangoのことでしょうね。
0537デフォルトの名無しさん2009/08/11(火) 17:34:41
>>532
行頭で並んでると全角と半角の違いが気になる
0538デフォルトの名無しさん2009/08/11(火) 21:14:33
今までのだと+=とかできなかったから?
0539デフォルトの名無しさん2009/08/11(火) 22:50:50
今までのを完全になくしたら、ただの短縮記法的な括弧なしの関数呼び出しとかが
できないようになるじゃん。
D言語ゴルファー涙目だな。
0540デフォルトの名無しさん2009/08/11(火) 23:16:22
>>535
俺も好きだった。まあ>>538の問題は気になってたけど。
うれしさ半分さびしさ半分って感じだなあ。
0541デフォルトの名無しさん2009/08/11(火) 23:26:50
ただの>>420ってことはないのかしら
0542デフォルトの名無しさん2009/08/12(水) 10:10:13
x64をはやくおながいします・・・
0543デフォルトの名無しさん2009/08/12(水) 11:22:30
if (hoges[0].func(fuga.member)) // これはOK
{}
auto result = count!("a.func(b.member)")(hoges, fuga); // ここでエラー

Error: static assert "Bad binary function q{a.func(b.member)}. You need to use a valid D expression using symbols a of type const(Hoge) and b of type Fuga."
述語にメンバ関数は使えないのでしょうか?
何か方法はないですか?
0544デフォルトの名無しさん2009/08/12(水) 17:20:51
enforceあるおかげでthrowいらなすぎる・・・
0545デフォルトの名無しさん2009/08/12(水) 17:27:25
std.contractsがいつの間にかパワーアップしてるな
0546デフォルトの名無しさん2009/08/12(水) 17:45:05
>>543
auto result = count!("(Hoge x, Fuga y){return a.func(b.member);}(a,b)")(hoges, fuga);
これもやってみたがdmdがクラッシュした

import std.algorithm;

class Hoge{bool func(int){return true;}}
class Fuga{int member(){return 0;}}

void main(){
Hoge[] hoges = [new Hoge];
Fuga fuga = new Fuga;

if (hoges[0].func(fuga.member)) {}// OK

{// NG
//auto result = count!("(Hoge x, Fuga y){return x.func(y.member);}(a,b)")(hoges, fuga);
}{// OK
bool f(Hoge a, Fuga b) {return a.func(b.member);}
auto result = count!(f)(hoges, fuga);
}{// OK
auto result = count!((Hoge a, Fuga b){return a.func(b.member);})(hoges, fuga);
}
}
05475462009/08/12(水) 17:46:02
最初のはこれの間違い
auto result = count!("(Hoge x, Fuga y){return x.func(y.member);}(a,b)")(hoges, fuga);
0548デフォルトの名無しさん2009/08/12(水) 19:12:01
>>546
thx
文字列で式渡す方式は何か制限かあるという事でしょうか(あるいはバグ?)。
関数を渡すか、関数ポインタを渡す事にします。
0549デフォルトの名無しさん2009/08/12(水) 19:38:02
なんというか、バグかそうでないのか判断の難しい問題だな。
ただ、Phobosのソースコードを読むと、開発者は
auto result = count!("a.func(b.member)")(hoges, fuga);
というコードが通るように書いているつもりのような気がする。(std.functional.binaryFunImplのあたり)
0550デフォルトの名無しさん2009/08/12(水) 20:38:00
列挙体に存在しないはずの値が列挙体値にキャストできちゃうの何とかならないのかな
0551デフォルトの名無しさん2009/08/12(水) 20:42:38
暗黙キャストでできちゃうなら問題だけど・・・
明示的にキャストしといてそんな
0552デフォルトの名無しさん2009/08/12(水) 20:56:31
そういやDってcast時例外とか存在しないんだな
0553デフォルトの名無しさん2009/08/12(水) 21:59:57
castって例外出るもんか?
0554デフォルトの名無しさん2009/08/13(木) 00:09:11
C++だと参照をdynamic_castで間違ったダウンキャストすると例外投げる
0555デフォルトの名無しさん2009/08/13(木) 00:56:08
Javaもclassのcast失敗で投げるな

Dのenumともなれば一覧取る機能とか名前取る機能とか当たり前のようにある…
そんな風に考えていた時期が、俺にもありました
0556デフォルトの名無しさん2009/08/13(木) 02:26:35
>>555
その程度コンパイルタイムリフレクションで余裕です
0557デフォルトの名無しさん2009/08/13(木) 02:30:36
>>548,549
文字列mixinは、あくまでmixinする箇所にそのコードが書いてあるように振る舞うから、
デリゲートのようにローカル変数を使ったり、mixinしているモジュールでimportしていないモジュールの型を使ったりすることはできない。
0558デフォルトの名無しさん2009/08/13(木) 04:46:46
pureな標準ライブラリ関数がpure修飾されてないからまともな関数が作れない
というかin節でassert(hoge, std.conv.text(hoge));が通らないのが困る
0559デフォルトの名無しさん2009/08/13(木) 08:29:07
>>549
バグでないとするなら、どういった事情でこの仕様になったのか疑問な気もします。
>>557
a.funcもb.memberもテンプレートで渡したhogesとfugaのメンバーなので使えないとおかしい気がします。


binaryFunImplの中で出てくるElementType1、ElementType2はどこで宣言されているんでしょう?
0560デフォルトの名無しさん2009/08/13(木) 08:52:57
>>559
関数の仕様じゃなくてmixinの仕様と言ってるのでは
0561デフォルトの名無しさん2009/08/13(木) 10:04:49
>>560
mixinの仕様というのは
> 文字列mixinは、あくまでmixinする箇所にそのコードが書いてあるように振る舞うから、
ということですよね?

void f(T)(T t) {
t.func();
}
これは当然OKだから、t.func();がmixinであっても同じ事になるのではないか(むしろならないと不便)と思いました。
0562デフォルトの名無しさん2009/08/13(木) 11:59:35
>>561
template mixinとtemplateがごっちゃになってない?

下記のコードをdmd a bでコンパイルするとき
fがa.dにあれば動くけど
b.dにあったらbではimport std.stdio;してないのでwritelnがないため動かない

// a.d
import std.stdio;//ここでimportしても無意味
import b;
void main() {
 f!(`writeln("hoge");`)();
}
// b.d
void f(string s)(){
 mixin(s);
}

同様にaで定義された型をb.funcに与えることもできない
0563デフォルトの名無しさん2009/08/13(木) 12:48:04
>>562
その例は>>543の問題とは別物になってるような・・・

// a.d
import b;
struct Hoge { void func() {} }
void main() {
 Hoge hoge;
 f!("a.func()")(hoge);
}
// b.d
void f(string s, T)(T a){
 a.func();// もちろんOK
 mixin(s);// ならこれもOKのはず?
}

std.algorithmのcountもソース見るとこの挙動を期待して書いているように思う。
0564デフォルトの名無しさん2009/08/13(木) 13:00:03
>>653
それf!("a.func();")(hoge);に直したら動くけど
0565デフォルトの名無しさん2009/08/13(木) 13:16:29
>>653
ははっ、ドジっ娘め
0566デフォルトの名無しさん2009/08/13(木) 13:19:37
>>564
ああ、ごめん。ミスった。

auto result = count!("a.func(b.member)")(hoges, fuga);が通らないのは
std.functional.binaryFunのバグじゃないかな。
0567デフォルトの名無しさん2009/08/13(木) 22:13:34
>>543,546
http://www.digitalmars.com/d/archives/digitalmars/D/bugs/Issue_3217_New_std.functional.binaryFunImpl_doesn_t_support_UDT_with_string_functions_therefore_18373.html
これか
0568デフォルトの名無しさん2009/08/13(木) 23:23:20
std.path.joinがWindowsバージョンだと第三引数以降が無視されちゃってるの、
いつになったら直るのだろうか
0569デフォルトの名無しさん2009/08/14(金) 08:31:01
君が直せばすぐにでも。ってか、たぶん気づいてないと思う。

0570デフォルトの名無しさん2009/08/14(金) 11:10:25
前にもそんな話出てたな
パッチ送ったらしいけど
直ってないところを見ると
うちらが直しても無駄みたいだな
0571デフォルトの名無しさん2009/08/14(金) 11:14:35
spam mail
0572デフォルトの名無しさん2009/08/14(金) 12:55:13
std.functionalのbinaryFunとunaryFunって
testAsExpressionの部分が変じゃね?
binaryFunの方をunaryFunに揃えたらなんとかなる気がする
0573デフォルトの名無しさん2009/08/14(金) 15:58:46
>>572
The patch in brief:
enum testAsExpression = "{ ElementType1 "
~parm1Name~"; ElementType2 "
~parm2Name~"; return ("~fun~");}()";
って>>567に書いてある。
0574デフォルトの名無しさん2009/08/14(金) 18:34:02
>>571
私の英語力は100点満点中5.3点です
0575デフォルトの名無しさん2009/08/14(金) 19:32:20
>>570
俺がbugzillaにphobos関連のミスを報告しといたら、andreiが担当責任者を自ら引き受けてたけど
0576デフォルトの名無しさん2009/08/14(金) 20:13:11
コードは国際共通語!
0577デフォルトの名無しさん2009/08/14(金) 22:11:47
D言語のライブラリってだいたいCやC++のラッパが多いの?
0578デフォルトの名無しさん2009/08/14(金) 22:14:16
!
0579デフォルトの名無しさん2009/08/15(土) 17:50:21
関数の単体テストってどうやれば実行されますか?
1つのモジュールに関数とunittest書いて、コンパイル引数に-unittest指定して、
そのモジュール1つだけをコンパイルしたんですが、どうも単体テストが実行されてないようです(明らかにエラーなassert書いても何もなし)。
0580デフォルトの名無しさん2009/08/15(土) 18:45:32
単体テストが行われるのは実行時だよ

前から思ってたんだけどなんで実行時なんだろ?
0581デフォルトの名無しさん2009/08/15(土) 19:10:32
>>580
え、そうだったんですか・・・。
コンパイル時に実行してくれると便利なのに。
■ このスレッドは過去ログ倉庫に格納されています