D言語 Part22

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語 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)
2デフォルトの名無しさん:2009/06/22(月) 01:40:49
過去スレ、関連スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=D%8C%BE%8C%EA&sf=2&all=on&view=table&shw=5000

その他関連スレ
バイナリをゲロる言語の魅力って何?
http://pc11.2ch.net/test/read.cgi/tech/1160869311/

Eclipse統合M27【Java/C/PHP/Ruby/Python/Perl】
http://pc12.2ch.net/test/read.cgi/tech/1238338503/

eclipseってそんなに良いか?【エクリプス】
http://pc11.2ch.net/test/read.cgi/tech/1099300344/

統合開発環境Eclipseプラグイン開発QA
http://pc11.2ch.net/test/read.cgi/tech/1081517094/

"Code of the Nerds" Digital Mars C/C++
http://pc11.2ch.net/test/read.cgi/tech/1044210976/
3デフォルトの名無しさん:2009/06/22(月) 01:42:33
>>1-2 テンプレ変更点
- "C/C++に疲れた人のD言語"のURL更新
- 関連スレ更新
4デフォルトの名無しさん:2009/06/22(月) 02:20:08
一乙
980越えたから落ちたか。
5デフォルトの名無しさん:2009/06/22(月) 04:11:24
Dython -- 仕様のかたまらない、ただひとつのインプリメンテーション
6デフォルトの名無しさん:2009/06/22(月) 04:22:44
>>1
7デフォルトの名無しさん:2009/06/22(月) 22:16:49
>>1

うぉるたんかわいいようぉるたん
8デフォルトの名無しさん:2009/06/22(月) 22:22:09
9デフォルトの名無しさん:2009/06/22(月) 22:28:36
>>8
半ばテンプレ化。
10デフォルトの名無しさん:2009/06/23(火) 02:08:32
D言語の標準ライブラリって充実していますか?
C++の標準、boost並に充実しているなら乗り換えようかと思っているんですが。
11デフォルトの名無しさん:2009/06/23(火) 02:24:55
わかっててきいてるだろw
10月ぐらいまでにはなんとかなる予定
12デフォルトの名無しさん:2009/06/23(火) 02:31:04
>>11
すみませんガチで知りませんでした。
もう少ししたら良い環境ですね。
どうもありがとうございました。
13デフォルトの名無しさん:2009/06/23(火) 02:55:23
本出る頃にはSTLレベルまではいってるだろうな。たぶん。
14デフォルトの名無しさん:2009/06/23(火) 07:57:13
だといいなあ
15デフォルトの名無しさん:2009/06/23(火) 08:02:06
標準が2つもあるという意味では充実してるw
16デフォルトの名無しさん:2009/06/23(火) 12:08:07
STLやBoost並に充実してたとしてもGUIライブラリは・・・
17デフォルトの名無しさん:2009/06/23(火) 22:24:29
最近バージョンアップしないね
18デフォルトの名無しさん:2009/06/23(火) 22:42:55
月のものが遅れてますね><
19デフォルトの名無しさん:2009/06/23(火) 23:25:45
何かが生まれるという認識でよろしいでしょうか
20デフォルトの名無しさん:2009/06/23(火) 23:45:48
TLSと同種のメモリ周りの修正じゃないの
何かどこかで、こっちはまでできてないけど、みたいな記事を読んだぞ
21デフォルトの名無しさん:2009/06/24(水) 18:55:01
うぉるたんはscope変数が書き換え可能なのをいい加減直すべき
22デフォルトの名無しさん:2009/06/25(木) 00:07:16
getMembersはいつになったら…
23デフォルトの名無しさん:2009/06/25(木) 22:19:59
allMembersじゃだめなの?
…というやりとりを以前にもここでしたような
24デフォルトの名無しさん:2009/06/25(木) 22:31:43
コンパイルタイムリフレクションとラインタイムリフレクションは全く違うものだろう
25デフォルトの名無しさん:2009/06/26(金) 16:18:29
関数1つレベルでコミットしたいんだが
bugzillaに送ってもなかなか反映してくれないなあ
26デフォルトの名無しさん:2009/06/26(金) 22:45:27
パッチはっつけたら?
27デフォルトの名無しさん:2009/06/26(金) 22:51:48
ほとんど反応ない
28デフォルトの名無しさん:2009/06/27(土) 10:39:36
D2.0使ってるんだけど、

myObject[key] = value;

ってやった時に

myObject.opIndexAssign(value, key) よりも
myObject.opIndex(key).opAssign(value) が優先されるのはなんなの?
29デフォルトの名無しさん:2009/06/27(土) 15:45:46
いつの間にか-safeつけるとコンパイルできない
一つ前のdmd使ってもコンパイルできない
俺は死んだ
30デフォルトの名無しさん:2009/06/27(土) 17:57:48
何度でも蘇るさ!
31デフォルトの名無しさん:2009/06/27(土) 18:40:50
ユニットテストなんて入ってるが、ソースの直ぐ下にそのまま書ける形式は、
テストに失敗してもその場でさっと修正しちゃえて良くない気がするな・・・。
番犬みたいのはある程度独立していないと懐柔されやすいというか。
32デフォルトの名無しさん:2009/06/27(土) 20:00:59
しばらく考えたけど
テスト自体を修正しちゃえるからよくないって言ってる?
33デフォルトの名無しさん:2009/06/27(土) 20:41:44
ユニットテストっていうか実験用コードっていう感じなんだよね。
まぁ、D的には仕様を守るための硬いテストみたいなものは、
そもそも邪悪なものなのかもしれんが・・・。
34デフォルトの名無しさん:2009/06/27(土) 20:54:32
それは、真面目にその場にテストをみっちり書くとソースの可読性が著しく落ちるからだろうから、
mixinなりincludeなりでコードを分離するのがいいんじゃね?
35デフォルトの名無しさん:2009/06/27(土) 22:53:32
なるほど。分離するならversionみたいにunittestも何か指定できたら
便利かなぁと思ったけど、version(MY_TEST)でいいか・・・。
36デフォルトの名無しさん:2009/06/28(日) 00:39:56
>>35てかそれって-unittestじゃね?
37デフォルトの名無しさん:2009/06/28(日) 01:36:49
だよね
38デフォルトの名無しさん:2009/06/28(日) 02:07:28
version(unittest) {}
39デフォルトの名無しさん:2009/06/28(日) 10:21:38
>>36
35の1行目は-unittest=STRICT / unittest (STRICT) { }みたいなことが
したいってことでちょっと違うかな。
40デフォルトの名無しさん:2009/06/28(日) 11:00:00
>>39
「Dならそれくらい出来るだろwww」という気分で試して絶望しそうなイメージ
41デフォルトの名無しさん:2009/06/28(日) 11:38:45
debugでいいやん
42デフォルトの名無しさん:2009/06/28(日) 14:09:21
>>39
それやる意味って何かあるの?単体テストは全て通らなければ意味がない気がするのだけど…
それよりは、実行ファイルを作らない限りunittestが実行できないって方が問題のような気がする
43デフォルトの名無しさん:2009/06/28(日) 14:33:26
最初はコンパイルする時にやってくれるものと思ってた俺
44デフォルトの名無しさん:2009/06/28(日) 14:54:57
>>42
さすがに全部通るか通らないかしかないとちょっと息苦しい
普段は時間がかかるテストはスキップするとかできてもいいんじゃないか
45デフォルトの名無しさん:2009/06/28(日) 21:38:17
>>39
それってunittest内でversion分岐させた方が分かり易くないか?
46デフォルトの名無しさん:2009/06/28(日) 22:24:31
http://www.hyuki.com/yukiwiki/wiki.cgi?TddAntiPatterns
ユニットテストアンチパターン
47デフォルトの名無しさん:2009/06/28(日) 23:20:25
>>42-43
rdmd -unittest hoge.d → エントリポイントを自動で追加 → 実行。
っていうふうにできてたらなあ。
48デフォルトの名無しさん:2009/06/29(月) 00:17:40
>>47

version(unittest) void main() { }
49デフォルトの名無しさん:2009/06/29(月) 01:25:33
>>48
でも、それだとファイルが複数になった時(どこにmain()書いたか?とか)ややこしくならない?
50デフォルトの名無しさん:2009/06/29(月) 04:23:39
むしろユニットテストしか実行しないexe作るオプションください
51デフォルトの名無しさん:2009/06/29(月) 06:46:45
assert(typeid(void function(int)) == typeid(void function(long)));

おいィ?
52デフォルトの名無しさん:2009/06/29(月) 07:00:25
は?
53デフォルトの名無しさん:2009/06/29(月) 11:55:49
ttp://shoo.s20.xrea.com/shoo/programing/chirno_quality/0002.html
ここの講座見てDFL使おうとしたら、コンパイルエラー。
dfl\internal\com.d(218): Error: no property 'seek' for type 'tango.io.model.IConduit.IConduit.Seek'
dfl\internal\com.d(218): Error: no property 'Anchor' for type 'tango.io.model.IConduit.IConduit.Seek'
dfl\internal\com.d(218): Error: no property 'Begin' for type 'int'
dfl\internal\com.d(218): Error: function expected before (), not 1 of type int
〜〜〜以下省略〜〜〜
入れたのは
 tango-0.99.8-bin-win32-dmd.1.041
 dsss-0.78-x86-windows
 dmc.zipのlibの中身
 DFL 0.9.8 zip archive

import\dfl\internal\dlib.d の464行目を
alias tango.io.model.IConduit.IConduit.Seek DSeekStream;
から
alias tango.io.model.IConduit.IOStream DSeekStream;
に書き換えたら、なんとかコンパイル通ったよ。

D言語初心者にハードルたけーよ、DFL。(;´Д`)
54デフォルトの名無しさん:2009/06/29(月) 12:43:25
その記事も陳腐化してるのか…
たぶんDFL 0.9.8がtango 0.99.8に対応してないんだな。
http://wiki.dprogramming.com/Dfl/Snapshots
ここの、スナップショット使ってみたら?tango 0.99.8より後だからもしかしたらできるかもよ
55デフォルトの名無しさん:2009/06/29(月) 13:55:18
試したけど、同じだった。Snapshotsのページに、
Note: Tango is not yet supported in this snapshot, please use the release version and be sure to use the compatible version of DMD.
と書いてあるし、まだみたい。
56デフォルトの名無しさん:2009/06/29(月) 16:25:51
>D言語初心者にハードルたけーよ、DFL。(;´Д`)
tango使っておいて初心者はないw
phobosならいけね?
57デフォルトの名無しさん:2009/06/29(月) 20:10:00
この前2.030環境に入れたけど色々トラブル出た気がする
D1ならイけるんじゃね?
58デフォルトの名無しさん:2009/06/29(月) 20:17:50
dmd 1.043/dmd 2.030
---
int a = 5;
assert (a.init == 0); // success
assert (a.init == 5); // fail


なん…だと…?
59デフォルトの名無しさん:2009/06/29(月) 20:33:54
mac osxで開発してる人いる?
60デフォルトの名無しさん:2009/06/29(月) 20:46:29
ここにいますよ
61デフォルトの名無しさん:2009/06/29(月) 21:48:28
DFLつかうならTango 0.99.7とDFL0.98の組み合わせにしておけばシアワセ
62デフォルトの名無しさん:2009/06/29(月) 22:02:53
>>56
逆。右も左もわからないから普通のライブラリのノリで入れちゃうんだよ
まさか標準ライブラリを置き換えてしかも互換性がないものとは思わない
63デフォルトの名無しさん:2009/06/29(月) 22:45:23
>>58
結構昔にそういう仕様になったよ
それのせいで昔のソースをビルドした時大変だった
64デフォルトの名無しさん:2009/06/29(月) 22:47:57
>>51
関数の型比較は引数の型だけで判断されるんじゃね?

TypeInfo_Function にも TypeInfo_Delegate にも
引数の情報を格納する場所はないし
65デフォルトの名無しさん:2009/06/29(月) 22:48:15
>>63
マジですか
和訳はともかく本家のドキュメント直ってないってなんなの
66デフォルトの名無しさん:2009/06/29(月) 23:37:43
うぉるたんはTangoの事どう思ってんの?
67デフォルトの名無しさん:2009/06/29(月) 23:50:15
>>66
TangoとPhobosは仲良くなれるように努力している。
将来的にはTangoとPhobosの両方のいいところを選択的に使えるようにする。
TangoはライセンスがPhobosと違うので気軽に取り込めなくて残念。
…てかんじのコメントだったと思うよ。
68デフォルトの名無しさん:2009/06/30(火) 00:54:57
69デフォルトの名無しさん:2009/06/30(火) 13:59:20
>>68
俺はD言語の何も理解していなかったようだ
って気分になる
70デフォルトの名無しさん:2009/06/30(火) 16:45:08
>>65

ChangeLogとかドキュメントで読んだ気がする……んだけど、どこにも書いてないな……
俺はどこで知ったんだろう……
71デフォルトの名無しさん:2009/06/30(火) 17:22:09
> Version D 2.001 Jun 27, 2007
> * The .init property for a variable is now based on its type, not its initializer.
72デフォルトの名無しさん:2009/06/30(火) 17:22:40
2年前だぞw
73デフォルトの名無しさん:2009/06/30(火) 19:45:47
>>71
この書き方だと今はそうなってるけど元に戻すつもりがあるってことなんだろうか
どっちにしろもう戻らないだろうけど
74デフォルトの名無しさん:2009/06/30(火) 20:28:35
>>73
"〜 is now 〜"は昔と違って今は〜だってニュアンスじゃなかったっけ?
75デフォルトの名無しさん:2009/06/30(火) 22:15:44
>>68
>ではDの場合はどうでしょう? もう聞いたことがあるかもしれません - 名前のダジャレがやり過ぎな言語。
>他の言語の専用ニュースグループでときどき話題になり、オフトピックな話題に厳しい人達が怒って止めさせるまで鬱陶しい。
>友人に熱狂的なファンがいる。
>あるいは単に、暇潰しに「この広いインターネットには、Dという名前の言語を作った馬鹿がいるに違いない」
>と検索してみた結果、「ああ、やっぱりいた!」
噴いたwwwww
76デフォルトの名無しさん:2009/07/01(水) 00:10:00
>>68
ところどころわかりにくいんだけど面白えw
アレキサンドレスクD好きすぎる。訳の人gjです。
77デフォルトの名無しさん:2009/07/01(水) 16:19:47
>>74 そうだよ
78デフォルトの名無しさん:2009/07/01(水) 17:05:37
>>68
これはおもしろい
79デフォルトの名無しさん:2009/07/01(水) 18:42:08
>>68 読んだら、D2へ移行したくなってきた。
80デフォルトの名無しさん:2009/07/02(木) 17:24:20
>>65
bugzillaに報告するといいよ
81デフォルトの名無しさん:2009/07/03(金) 05:53:57
alias Variant dynamic;
82デフォルトの名無しさん:2009/07/03(金) 13:46:49
ところでメソッドからdelegateを取ったときにref返値の情報が消えちゃって左辺にできないんだけどどうすればいいの?
83デフォルトの名無しさん:2009/07/03(金) 14:07:12
ほんとだな。

int x;
class C {
static ref int f() { return x; }
ref int g() { return x; }
}

void main() {
(&C.f)() = 0; // ok
(&(new C).g)() = 0; // error
}
84デフォルトの名無しさん:2009/07/03(金) 14:55:24
return書くの秋田
85デフォルトの名無しさん:2009/07/03(金) 15:39:53
C#のアロー記法みたいなのほしいよなあ。
86デフォルトの名無しさん:2009/07/03(金) 15:54:18
int delegate(int) dg = x \ x * 2; // == (int x){return x*2;}
int k = dg(1);
assert(k == 2);
こうなる予定だったよね?
87デフォルトの名無しさん:2009/07/03(金) 16:01:00
>>83 うまく英語で説明できないから誰か報告してみてちょー
88デフォルトの名無しさん:2009/07/03(金) 16:22:26
>>86
それなんかきもいな。
バックスラッシュはλの代わりだから前に書きたい。

> auto square = \x => x * 2;
>
> auto i = square(2); // typeof(i) == int
> auto d = square(2.5); // typeof(d) == double


強い静的型付き言語だけど、ソースコード上に型を書かなくていいような言語が使いたい。
89デフォルトの名無しさん:2009/07/03(金) 16:28:49
円マークがすごく悲しい構文です
90デフォルトの名無しさん:2009/07/03(金) 16:31:17
>>88
OCaml
型推論で80%の型名を書かなくていいネイティブ吐ける関数型言語
91デフォルトの名無しさん:2009/07/03(金) 16:37:04
Dは全然知らないのですが
アセンブラレベルでの呼び出し規約は
デフォルトで何を使ってるんですか?
ちょっと興味があったもので
92デフォルトの名無しさん:2009/07/03(金) 16:49:30
>>88
本質的じゃないが、それsquareじゃないだろ
93デフォルトの名無しさん:2009/07/03(金) 16:51:13
94デフォルトの名無しさん:2009/07/03(金) 16:56:47
デリゲートのジェネリック化はできてほしいねえ
95デフォルトの名無しさん:2009/07/03(金) 17:02:29
>>93
ありがとう
完全に独自なのか

型情報をマングリングしたり
関数側でスタックを処理するのに
可変引数がサポートされたりしてて面白い
96デフォルトの名無しさん:2009/07/04(土) 13:49:54
class A {
 const(A) a;

}
97デフォルトの名無しさん:2009/07/04(土) 13:51:41
うわ途中投稿したorz

class A {
 const(B) b;
 void setB(in B b) {
  this.b = b; // 駄目
 }
}
constな型とconstな変数が区別されてないのってなんでだろ?
このsetAみたいな事やろうとして八方塞りになった
9897:2009/07/04(土) 13:52:28
○setB
×setA

慌てすぎで死んだ
99デフォルトの名無しさん:2009/07/04(土) 14:13:25
Rebindable
100デフォルトの名無しさん:2009/07/04(土) 14:20:15
>>97
クラス型が参照型(要するにポインタ)であることを考えれば、別に何もおかしいことではないと思う。

struct S { }
class A {
 const(S*) b;
 void setB(const S* b) {
  this.b = b; // 駄目
 }
}

これに対する解決法は>>99だけど、言語のほうで何とかしてほしいのはたしか。

それと、これはまだ実装されてないけど、inはscopeを含むので、
in引数の内容をスコープ外にコピーすることはできない。
101デフォルトの名無しさん:2009/07/04(土) 14:38:06
>>97
最近同じポイントではまりました。

>>99 >>100
AとRebindable!(A)はisによる同一性比較が出来ないのが欠点。
なんでDはC++みたいに参照と値を分離しなかったのか…
102デフォルトの名無しさん:2009/07/04(土) 14:48:59
>>99-100
あーなるほど、なるほどなぁ
とりあえずは解決しそうです。ありがとうございました。

解決はするけど、確かにもうちょっとスマートになってほしいな
103デフォルトの名無しさん:2009/07/04(土) 20:32:31
Rebindableって参照がnullかどうか調べられないのか
104デフォルトの名無しさん:2009/07/04(土) 21:02:48
>>103

import std.typecons;
class A{}
void main()
{
Rebindable!(const(A)) a = new A();
// if( !a ){
// if( a is null ){
if( a.opDot is null ){
}
}
Rebindableそのものはstructなので!やis nullで直接調べられない
opDotでconst(A)を取り出さないとダメ
105デフォルトの名無しさん:2009/07/04(土) 21:28:57
>>104
そうか、opDotを直接呼べばいいのか
getがprivateだどうすんべとか言って悩んでたthx
106デフォルトの名無しさん:2009/07/05(日) 00:53:57
const関係の話は俺の貧弱な脳には意味不
107デフォルトの名無しさん:2009/07/05(日) 01:15:20
ウォルたんも混乱してる悪寒
108デフォルトの名無しさん:2009/07/05(日) 03:09:28
>>104 そんなんあったんだな
109デフォルトの名無しさん:2009/07/05(日) 08:03:21
ポインタでさしてたものがガベコレでずれるとか。
110デフォルトの名無しさん:2009/07/05(日) 10:47:44
Dで実装されたパーサジェネレータってある?
111デフォルトの名無しさん:2009/07/05(日) 13:13:44
112デフォルトの名無しさん:2009/07/05(日) 15:41:31
export template
113デフォルトの名無しさん:2009/07/05(日) 15:41:57
>>111
ありがとう。でも、最新版のD2でコンパイル通るものはなかった
114デフォルトの名無しさん:2009/07/05(日) 19:57:03
D2に対応してるライブラリは少ないよ
規模が小さいものに手を入れるといいかと
115デフォルトの名無しさん:2009/07/05(日) 22:29:11
Tangoのおかげで未だD1にしがみついているのが多いんだよなー
116デフォルトの名無しさん:2009/07/05(日) 22:50:49
DWT放置プレイいつ終わるの?
117デフォルトの名無しさん:2009/07/05(日) 23:54:23
118デフォルトの名無しさん:2009/07/06(月) 00:11:31
さっさとD2.0の仕様が固定されないとTangoも2.0に対応しないだろうよ…
branches/experimental/D2.0は何カ月も前からコンパイルできなかったと思うし
119デフォルトの名無しさん:2009/07/06(月) 14:21:27
120デフォルトの名無しさん:2009/07/06(月) 15:42:12
case '1': .. case '9':

 ___
/ || ̄ ̄|| ∧_∧
|.....||__|| (     )  どうしてこうなった・・・
| ̄ ̄\三⊂/ ̄ ̄ ̄/
|    | ( ./     /
 ___
/ || ̄ ̄|| ∧_∧
|.....||__|| ( ^ω^ )  どうしてこうなった!?
| ̄ ̄\三⊂/ ̄ ̄ ̄/
|    | ( ./     /

 ___ ♪ ∧__,∧.∩
/ || ̄ ̄|| r( ^ω^ )ノ  どうしてこうなった!
|.....||__|| └‐、   レ´`ヽ   どうしてこうなった!
| ̄ ̄\三  / ̄ ̄ ̄/ノ´` ♪
|    | ( ./     /

 ___        ♪  ∩∧__,∧
/ || ̄ ̄||         _ ヽ( ^ω^ )7  どうしてこうなった!
|.....||__||         /`ヽJ   ,‐┘   どうしてこうなった! 
| ̄ ̄\三  / ̄ ̄ ̄/  ´`ヽ、_  ノ    
|    | ( ./     /      `) ) ♪
121デフォルトの名無しさん:2009/07/06(月) 16:10:31
だからa..bをRangeExpressionとしろとあれほど(ry
んで後ろを含む..=とか、前後の上下をはっきりさせた.<や.<=や.>や.>=を導入すれば良かっただろうに
122デフォルトの名無しさん:2009/07/06(月) 18:48:48
enum!!
123デフォルトの名無しさん:2009/07/06(月) 19:19:46
えーと。
D 2.031
・ルートを\dmdから\dmd2に
・with文でローカルのシンボルと重複すると隠すのでエラー
・final switch(expr)
・case 1: .. case 5:
・暗黙の整数変換で符号ビットが落ちる変換はエラー
・return exp;がないのは警告じゃなくてエラー
・dmdの吐くエラーはstderrに出すように
・フロントエンド高速化のパッチ
・std.algorithm : swapの高速化、あといくつか追加
・std.array : 関数追加
・std.conv : enum値を表示/解析するコードを追加
・std.ctype : isupperとtolowerをpureに
・std.date : benchmarkの返値をuint[]からulong[]に
・std.demangle : switchとcaseの新文法に対応して変更
・std.random : randomSample追加
・std.string : find系をdeprecatedに。starstWith、endsWithを削除
・std.traits : isSomeChar と isPointer追加
・std.typetuple : indexOfをindexOfTypeに。前の名前はaliasで残してdeprecated
・std.utf : エラーメッセージ改善
124デフォルトの名無しさん:2009/07/06(月) 19:33:14
>>123
final switchは「全条件について書く」、defaultなし、CaseRangeなし、enumを受ける場合enum全条件のcase強制、か。

以前に「gotoの行き先のラベルのアドレスが欲しい」という話があったが、
final switchだとほぼ同等のことができるな。defaultがないからほぼO(1)のルーチンに最適化可能のはず。
125デフォルトの名無しさん:2009/07/06(月) 19:56:04
case 1 .. 9:

ではいけない理由がわからないんだけど誰か教えて
126デフォルトの名無しさん:2009/07/06(月) 20:22:45
>>125 それでいいよなあ
何とかしてよドラえもん
127デフォルトの名無しさん:2009/07/06(月) 21:52:19
>>125
case 1 .. 9:
だとスライスの連想から、1<=x<9のような感じがするが、
case 1: .. case 9:
だと、いかにも9を含みそうな感じがする。

という説明がNGでなされている。
128デフォルトの名無しさん:2009/07/06(月) 21:59:01
ちなみにこの構文はandreiの発案。まじきもい
129デフォルトの名無しさん:2009/07/06(月) 22:06:36
ぶっちゃけ、case 1..9: でも、case 1: .. case 9: でも、どうせ使わないからどうでもいいとか言ってみる。
130デフォルトの名無しさん:2009/07/06(月) 22:23:56
>(fainal switchの)The case expressions cannot evaluate to a run time initialized value.
と言うことは、普通の switch 文なら case j: とか…

…できるじゃあないかッ!いつからこんなことが?
131デフォルトの名無しさん:2009/07/06(月) 22:31:32
andreiか
andreiじゃあしょうがないな
132デフォルトの名無しさん:2009/07/06(月) 22:33:08
昨年の4月から
133デフォルトの名無しさん:2009/07/06(月) 22:42:54
>>130
結構前から出来たと想うけど
134デフォルトの名無しさん:2009/07/06(月) 22:44:55
>>124
ラベルのアドレスならcaseの中から直接次のcaseへジャンプするように
書けるから同等ではないかと。それでもO(1) switchはかなりうれしいけど。
135デフォルトの名無しさん:2009/07/06(月) 22:48:06
switch-case-break自体がキモいのをどうにかしてほしかった
fallthroughなんかgoto caseがあればいいじゃないか…
136デフォルトの名無しさん:2009/07/06(月) 23:28:40
>>127
1<=x<=9のような感じを出したいならcase 1..=9:とすりゃいいのに
137デフォルトの名無しさん:2009/07/06(月) 23:33:46
>>135
C言語だとfall throughは結構使われる…が、確かにD言語だとcaseに複数指定可能でgoto caseがあるから無くした方が良い気もするな。
まぁC言語使いが混乱しないようにfall through禁止の上でbreak必須にするという所が現実的な気がする。
138デフォルトの名無しさん:2009/07/06(月) 23:37:08
ngでもugly ugly言われててワロタw
139デフォルトの名無しさん:2009/07/06(月) 23:52:29
もうswitch-caseを捨ててselect-caseを新設しようぜ
fall throughなしでbreakなしにするんだ
select(n){
case 0, 1, 2:
case 3 .. 5: // 3,4
case 5 ... 7: // 5,6,7
default:
140デフォルトの名無しさん:2009/07/06(月) 23:58:58
>>139
case is構文の新設ですね、分かります。
141デフォルトの名無しさん:2009/07/07(火) 00:06:56
>>140 どゆこと?
142デフォルトの名無しさん:2009/07/07(火) 00:18:31
143デフォルトの名無しさん:2009/07/07(火) 02:00:53
>>142 VBはselect-caseなのか
144デフォルトの名無しさん:2009/07/07(火) 03:10:33
case-whenでもcondでもなんでもいい
145デフォルトの名無しさん:2009/07/07(火) 09:50:47
>>139
それでいいよ
146デフォルトの名無しさん:2009/07/07(火) 10:58:26
a..bでbを含まなくてa...bでbを含むってのはどこの言語がもとだっけ?
147デフォルトの名無しさん:2009/07/07(火) 11:01:12
rubyは逆で..で含む、...で含まないだからかなり分かりづらい
148デフォルトの名無しさん:2009/07/07(火) 11:46:31
今から..の意味を変えるのとどっちがわかりにくいかって話だな
149デフォルトの名無しさん:2009/07/07(火) 11:59:12
>>136のがいいんじゃね?
150デフォルトの名無しさん:2009/07/07(火) 12:00:44
...の方がより遠くを指しているように見えるから
a...bでbを含むでいいんじゃね?
別の言語と異なってもいいだろ別に
151デフォルトの名無しさん:2009/07/07(火) 12:03:55
CaseRangeに賛成意見述べてるのって、アンドレイとウォルたんだけなんだけど。
152デフォルトの名無しさん:2009/07/07(火) 12:12:07
>>151 テラカワイソスwww
しかし引かぬ媚びぬ
153デフォルトの名無しさん:2009/07/07(火) 12:20:27
アンドレイ「おまえらはこの構文の美しさがわからんのか。少なくとも俺はuglyとはおもわねえ!」
その他「いや、俺は汚いと思うね」

ウォルター「スライスの..は末尾を含んで、CaseRangeの..は末尾を含まないから、混乱を避けるために全く別の構文にする必要がある」
その他「だから別の演算子導入すればいいって言ってるだろ!」

こういう応酬が延々と繰り広げられてるんだが…
154デフォルトの名無しさん:2009/07/07(火) 12:53:32
さすがにコレは嫌すぎるなあ…w
なので英語圏の皆さんには頑張っていただきたい
155デフォルトの名無しさん:2009/07/07(火) 15:25:36
case '0':
..
case '9':
と複数行にすれば案外いけるかもしれん
156デフォルトの名無しさん:2009/07/07(火) 16:13:55
>>155
お前天才だろ…それならいけるわ。
157デフォルトの名無しさん:2009/07/07(火) 16:24:18
それよりそろそろ見慣れてきた俺ガイル
158デフォルトの名無しさん:2009/07/07(火) 16:42:24
一行に単独で..が現れたときは上下の行で異なっているところを変化させながら反復するマクロにしようぜ!

f!(0);
..
f!(9);

mixin("int a;");
..
mixin("int z;");
159デフォルトの名無しさん:2009/07/07(火) 16:43:37
かっけええええwwwwwwwwww
160デフォルトの名無しさん:2009/07/07(火) 16:45:39
>>158
それなら、mixinとか使わなくて、

int a;
..
int z;

でいいだろ…
161デフォルトの名無しさん:2009/07/07(火) 17:07:17
for文いらねー
writeln(1);
..
writeln(100000);
162デフォルトの名無しさん:2009/07/07(火) 17:09:01
writeln(i+0);
..
writeln(i+100000);
163デフォルトの名無しさん:2009/07/07(火) 17:35:16
goto caseなんかあったのか
164デフォルトの名無しさん:2009/07/08(水) 14:36:38
DMD2系+Eclipse+Descentで使おうと思っています。

googleで調べながら一通りインストールしてサンプルをビルドしようとしたら
「'DMDの起動'に問題が発生しました。Variable references empty selection: ${project_loc}」
というエラーが出てしまいます。

作業ディレクトリーが${project_loc}
引数が${resource_loc} -g
という設定にしているんですが、どうもここがまずそうです。
どういう設定にすればいいのでしょうか?
165デフォルトの名無しさん:2009/07/08(水) 15:23:47
エディター部分にフォーカスが無いとか?
166デフォルトの名無しさん:2009/07/08(水) 17:24:00
>>165
レスthx
プロジェクト・エクスプローラーでtest.dを選択した状態でビルドしたらうまくいきました。

ついでといってはなんですが、
ビルドしたサンプルは
ttp://www.kmonos.net/alang/d/2.0/wc.html
なんですけど、74行目でコンパイルエラーが発生してしまいます(Error: buf[0] isn't mutable)。
サンプルが間違っているんですかね?
167デフォルトの名無しさん:2009/07/08(水) 17:33:57
wcのサンプルってだいぶ古くないか・・・?
更新のたびにいちいち修正されてるのか?それならすごいけど・・・
168デフォルトの名無しさん:2009/07/08(水) 17:56:55
>>167
samplesディレクトリのは更新されてない。たぶんコンパイルとおらんだろう。
ドキュメントに書いてあるのは修正されてる。
169デフォルトの名無しさん:2009/07/08(水) 20:49:35
それはともかく>>166のは
サンプルがD2なのにstringの中身を変更してるだけかな?
170デフォルトの名無しさん:2009/07/08(水) 21:16:59
そこ直したらコンパイルは出来た
bufにstringはない罠
171デフォルトの名無しさん:2009/07/08(水) 21:39:46
>>167-170
thx
古い仕様のコードなんですね。
172デフォルトの名無しさん:2009/07/08(水) 22:46:30
サンプルは一度刷新されたはずだが、何年前だったかな。って世界。
173デフォルトの名無しさん:2009/07/08(水) 23:07:55
お薦めのIDEってなんですか?
174デフォルトの名無しさん:2009/07/09(木) 12:05:31
is(typeof(...)) ってのに新しいキーワード割り当てて欲しいなあ
175デフォルトの名無しさん:2009/07/09(木) 12:42:33
いやーそのままでいいんじゃ
176デフォルトの名無しさん:2009/07/09(木) 16:12:34
is_typo
177デフォルトの名無しさん:2009/07/09(木) 18:48:38
>>173 >>1の好きなの
178デフォルトの名無しさん:2009/07/10(金) 00:09:45
一瞬Code::Blocks使おうとしてみたけどキーワード登録が面倒になってやめた
サクラたんかわいいよサクラたん
179デフォルトの名無しさん:2009/07/10(金) 03:30:29
前スレみる限りエディタ+makeが主流という悲しい現実。
180デフォルトの名無しさん:2009/07/10(金) 03:35:23
DWTで誰か作ってくれるっていう話があったような
181デフォルトの名無しさん:2009/07/10(金) 08:17:22
omake便利っすよ
D.om書かないとダメだけど
182デフォルトの名無しさん:2009/07/10(金) 08:52:31
>>181
D向きだね
うpもなしに(ry
183デフォルトの名無しさん:2009/07/10(金) 23:00:08
>>180
むしろDWTって今誰か開発続けてるの?
184デフォルトの名無しさん:2009/07/11(土) 00:19:12
Poseidonは、DWT使ってるよね。
185デフォルトの名無しさん:2009/07/12(日) 21:33:52
むしろPoseidonって今誰か開発続けてるの?
186デフォルトの名無しさん:2009/07/12(日) 23:16:12
187デフォルトの名無しさん:2009/07/13(月) 02:43:48
皆さんの使ってる統合環境って>>1のどれですか?
188デフォルトの名無しさん:2009/07/13(月) 02:50:50
emacs
189デフォルトの名無しさん:2009/07/13(月) 12:08:51
秀丸+ビルド用秀丸マクロ(やねうらおさんのがベース)+bud
190デフォルトの名無しさん:2009/07/13(月) 12:47:23
ポセイドン使ってみたんですがビルドしようとしたら
コンパイラ見つからないと出るのですが

プロジェクト生成時にパスは設定してます
191デフォルトの名無しさん:2009/07/13(月) 12:53:05
標準にシリアライズを支援する物はないですか?
C++のboost::serializationみたいなやつ。
192デフォルトの名無しさん:2009/07/13(月) 13:29:31
そういう便利な物はない。
193デフォルトの名無しさん:2009/07/13(月) 13:31:50
>>192
ないですか。どうもです。
194デフォルトの名無しさん:2009/07/13(月) 13:34:56
秀丸
195デフォルトの名無しさん:2009/07/13(月) 20:12:11
シリアライズ面倒だから全部XMLにしたわ
196デフォルトの名無しさん:2009/07/13(月) 20:37:21
ポセイドンで書いてコマンドでコンパイル・・
>>190と同じくコンパイルができない。
秀丸のファイルタイプ別の設定ファイル探すか書いてみるか
197デフォルトの名無しさん:2009/07/13(月) 22:07:44
phobosにシリアライズみたいなのなかったっけ?
198デフォルトの名無しさん:2009/07/13(月) 23:39:19
Ver1.030から1.046にかけてdmdディレクトリの構成変わってるのなんでですか?
199デフォルトの名無しさん:2009/07/13(月) 23:40:16
OSごとにバイナリとか分けたかった時期か?
200デフォルトの名無しさん:2009/07/14(火) 00:07:14
>>198
macとかfreebsdとかサポートするため。
201デフォルトの名無しさん:2009/07/14(火) 01:30:41
>>197
std.outbufferだな
202デフォルトの名無しさん:2009/07/14(火) 01:40:49
>>201 std.outbufferは割と便利

テキスト形式で書き出すならstd.file.slurp()が読み込みに使えそう
シリアライズってバイナリ限定だっけ?
203デフォルトの名無しさん:2009/07/14(火) 07:18:36
Dって依存関係吐いてくれるオプションないの?gcc -MMみたいな
204デフォルトの名無しさん:2009/07/14(火) 07:26:38
-v
205デフォルトの名無しさん:2009/07/14(火) 07:44:16
うおおありがとう
206デフォルトの名無しさん:2009/07/14(火) 16:44:45
64ビットの実装はいつ出るのかねぇ?
待ちきれなくてgdcに2.031移植しようとしたが挫折したorz
207デフォルトの名無しさん:2009/07/14(火) 18:05:45
シリアライズはstd.outbufferがあるのに、デシリアライズはなんで何もないんですか?
208デフォルトの名無しさん:2009/07/14(火) 18:17:51
昔はstd.inbufferがあった気がするんだけど思い違い?
209デフォルトの名無しさん:2009/07/14(火) 19:03:37
>>208
>>1の本家には載ってないです。
googleで検索したら
ttp://f17.aaa.livedoor.jp/~labamba/?std.outbuffer
> バイト順(エンディアン)を指定する場合は、OutBuffer? の派生クラスを使ってください。逆のbyteの配列からデータに復元するには InBuffer? を使います。
と出てきたものの、これ以外に書かれていないです。
一体どういうことなのでしょう・・・。
210デフォルトの名無しさん:2009/07/14(火) 20:54:19
import std.typecons;

interface It {}

class A {
 Rebindable!(const(It)) ireb; // ItがObjectじゃないためNG
 Rebindable!(const(A)) reb;
 const const(A) get() {
  return reb.opDot; // RebindableのopDotがconstじゃないためNG
 }
 Rebindable!(const(A))[string] assoc;
 void put(const(A) a) {
  // opAssignが呼ばれてしまい実行時エラー
  assoc["test"] = a;
 }
}

('A`) ウボァー
211デフォルトの名無しさん:2009/07/14(火) 21:27:38
最近のDはだらしねえな
212デフォルトの名無しさん:2009/07/14(火) 21:28:35
昔からphobosはこんな感じだよ
213デフォルトの名無しさん:2009/07/14(火) 22:04:06
Rebindableにgetなる無意味なaliasがあるんだけど
たぶんこれpublicにしたかったんだな
214デフォルトの名無しさん:2009/07/15(水) 00:46:08
std.outbufferとstd.inbufferを足してstd.serializeってのを作ったらどうだ
215デフォルトの名無しさん:2009/07/15(水) 07:45:33
2になった途端1時代のソースがことごとくコンパイルできない

この互換のなさ酷すぎ。。。
216デフォルトの名無しさん:2009/07/15(水) 08:06:23
それは、
> C#になったとたんC時代のソースがことごとくコンパイルできない
>
> この互換のなさ酷すぎ。。。
といっているようなもの。
217デフォルトの名無しさん:2009/07/15(水) 08:37:35
コンパイル通らないと喜んじゃうMばかりのスレ。
っていうか互換性重視して切り捨てられない部分が出てくるよりよっぽどいいよ。
218デフォルトの名無しさん:2009/07/15(水) 08:37:46
別の言語かよ
219デフォルトの名無しさん:2009/07/15(水) 13:03:05
>>218 流石にあの例はちょっと
>>217 C++とは別の方向性を持った言語の行く末を見守るスレでもあります
220デフォルトの名無しさん:2009/07/15(水) 14:57:38
インターネット上のファイルをダウンロードするにはどうすればいいですか?
221デフォルトの名無しさん:2009/07/15(水) 15:02:34
まずTCP接続をします
222デフォルトの名無しさん:2009/07/15(水) 15:21:09
そして生のHTTPでやりとりします
223デフォルトの名無しさん:2009/07/15(水) 15:49:12
>>221-222
std.socketを使うことになるんですかね?
難しそうですね。

Cで書いて、それを呼び出す方が楽かなぁ。
224デフォルトの名無しさん:2009/07/15(水) 15:54:25
Cで書くならDで書いても一緒だろ…
225デフォルトの名無しさん:2009/07/15(水) 16:05:12
>>224
Cでいうところのwininet.hがDにはなくないですか?
226デフォルトの名無しさん:2009/07/15(水) 17:19:45
CのヘッダファイルをDに変換するんですよ…
227デフォルトの名無しさん:2009/07/15(水) 17:29:58
D1でTangoのtango.net.http.HttpGetつかったら?
2行でできるよ
228デフォルトの名無しさん:2009/07/15(水) 17:31:14
>>226
wininet.hだけでも3900行もあるし、Cで必要な部分だけラッパを書いた方が楽かなぁと。
229デフォルトの名無しさん:2009/07/15(水) 17:32:55
>>227
なるほど。D1のTangoにはあるんですね。
230デフォルトの名無しさん:2009/07/15(水) 17:33:12
待てばPhobosにもHTTP関連は入るはず
231デフォルトの名無しさん:2009/07/15(水) 17:33:14
たいていのWin32APIのヘッダはすでに変換された物があるから、それを拾ってくればいいよ。
232デフォルトの名無しさん:2009/07/15(水) 17:41:27
>>230
今後に期待ですね。
>>231
ぐぐり方が悪いのか見つからないです。
233デフォルトの名無しさん:2009/07/15(水) 21:59:24
234デフォルトの名無しさん:2009/07/15(水) 23:32:58
>>233
おお、まさに求めていたものが・・・。
ありがとうございました。
235デフォルトの名無しさん:2009/07/16(木) 01:39:23
>>230 それがいつになるのかが問題だろw
236デフォルトの名無しさん:2009/07/16(木) 21:32:54
なんかネタねえの?
237デフォルトの名無しさん:2009/07/16(木) 22:38:17
dmdじゃなくGCD使うメリットって何かあるんですか?
238デフォルトの名無しさん:2009/07/16(木) 22:43:45
>>237
動作するプラットフォームの多さ?
239デフォルトの名無しさん:2009/07/16(木) 23:17:03
最新版で1年前に書いたコードがコンパイルできるとか?
240デフォルトの名無しさん:2009/07/16(木) 23:30:56
C++のvectorのreserve(1000)は、Dの動的配列に置き換えると、
auto len = arr.length;
arr.length = 1000;
arr.length = len;
これでおk?
241デフォルトの名無しさん:2009/07/16(木) 23:37:33
dmd使ったことないんで知らないけど、
cのライブラリを積極的に使うならgdcのほうが楽だと信じてる。
gccで吐いたバイナリそのまま使えるし。
242デフォルトの名無しさん:2009/07/16(木) 23:38:11
想定通りに動くとして、元のlengthが1000より小さい保証がないな
それ、本家に書いたらstd.arrayにテンプレートとして組み込んでくれるんじゃないか。
配列の疑似プロパティでarr.reserve(1000)で通るようになるかと。
243デフォルトの名無しさん:2009/07/16(木) 23:42:39
こんな感じか

void reserve(T)(T[] a, size_t reserve_len)
in {
  assert(a.length<len);
}
body {
  auto len = arr.length;
  arr.length = reserve_len;
  arr.length = len;
}
244デフォルトの名無しさん:2009/07/16(木) 23:46:49
assertで止まられても・・・
245デフォルトの名無しさん:2009/07/16(木) 23:48:25
>>242
たしかにチェックしないとだめだった。
英語できないのでどなたかお願いしますorz
246デフォルトの名無しさん:2009/07/17(金) 00:10:36
Dでは配列のopCatは常にコピーを作るから、配列をreserveすることに何も意味がない
大きい配列を割り当てて、それのスライスを使えばいいだけ
247デフォルトの名無しさん:2009/07/17(金) 00:19:23
>237
gdbでデバッグできる
248デフォルトの名無しさん:2009/07/17(金) 00:25:20
>>246
大きい配列のサイズを1000として、それのスライスのサイズが1000を超えた時、
配列が2つアロケートされたままになるのが気持ち悪くない?
ガベコレがある言語では気にする意味なし?
249デフォルトの名無しさん:2009/07/17(金) 00:39:26
vectorみたいなものを作ったけど、vector!(int)とか書くのが不便で
自分でも全然使ってない。ユーザー定義リテラルキボンヌ
250デフォルトの名無しさん:2009/07/17(金) 00:50:29
ユーザー定義リテラルはやめといたほうが
251デフォルトの名無しさん:2009/07/17(金) 00:51:35
ユーザー定義リテラルはコンパイルが遅くなる原因だからな
252デフォルトの名無しさん:2009/07/17(金) 01:00:29
vector!intで通らない?
253デフォルトの名無しさん:2009/07/17(金) 01:27:36
std::vector<int>と変わらないだろ
autoもあるんだし
254デフォルトの名無しさん:2009/07/17(金) 02:29:09
vectorは組み込み配列で概ね代替可能だから、あとはdequeとlistとsetがほしい…
DTLってThe Case For Dをみてると最大限Dを活かすための、ぼくのかんがえたさいきょうのコンテナライブラリを構想してる段階な感じなのかな?
255デフォルトの名無しさん:2009/07/17(金) 02:43:12
Dって速い?
256デフォルトの名無しさん:2009/07/17(金) 03:01:03
速いよ、ビルドが
実行速度はC++よりちょい遅いくらい
257デフォルトの名無しさん:2009/07/17(金) 03:18:04
関数の引数につけるin,out,refってクラスにつけても意味ないですか?
あとconstはC++の感覚で、つけられるところは全てつけていくべきですかね?
258デフォルトの名無しさん:2009/07/17(金) 03:28:10
>>257
クラス型でもinをつければconstと同じ意味があるし、outやrefは参照変数になる。
constやimmutableは積極的につけるべき。
259デフォルトの名無しさん:2009/07/17(金) 03:34:08
in, out, refは意味論としてそうあるべき引数にそう付ければいい
ほとんどinになるけど。
推移的constなのでモリモリとconstを書く必要はないが、逆にそれが嫌という例もある
むしろpure, nothrowの方が重要
260デフォルトの名無しさん:2009/07/17(金) 04:16:39
>>258-259
レスthx
C++でconst参照で受け取ってた部分は、Dではinにすればいいんですね。
pureとnothrowも意識してみます。
261デフォルトの名無しさん:2009/07/17(金) 04:39:43
const参照はconst ref
262デフォルトの名無しさん:2009/07/17(金) 05:23:52
Rangeを表す構造体やクラスに対する foreach
ってあるけどさ、これってそのうちpopFrontとかfrontってのに書き変わるのかな?
現状Phobosの中のRangeのそれと食い違ってて混乱の元になる気がするのだけど。
263デフォルトの名無しさん:2009/07/17(金) 05:24:58
>>262
それはドキュメントが更新されてないだけ。
実装はfront/popFront/emptyになってる。
264デフォルトの名無しさん:2009/07/17(金) 05:44:38
>>263そうだったのか。thx
265デフォルトの名無しさん:2009/07/17(金) 11:56:16
>>261
Dのクラスは常に参照だからinでconst参照と思ったんですが、違いがあるんですか?
構造体の場合に違うのかな。
C++から移行したものにはガベコレが難しい。
266デフォルトの名無しさん:2009/07/17(金) 13:12:27
inだと参照の値渡し。refだと参照の参照渡しになる。
参照型の参照と参照渡しの参照は若干意味が違う。
267デフォルトの名無しさん:2009/07/17(金) 15:48:48
>>266
なるほど、const refとすると推移的constによって、クラスの非constメンバにアクセスできなくなるって事ですね。
でも、in MyClassで全て間に合う気がしてしまいます。
const ref MyClassとする事によって役に立つケースはどんなものがありますか?
268デフォルトの名無しさん:2009/07/17(金) 17:09:23
Dの標準ライブラリにほかのプロセスを起動したりパイプで繋いで入出力するものありますか?
269デフォルトの名無しさん:2009/07/17(金) 18:19:21
>>267
ref引数にはlvalueの参照を渡すわけだから、変数を書き換えられるようになるわけですよ
270デフォルトの名無しさん:2009/07/18(土) 19:37:43
いつの間にcore.sync.*が追加された…?
でもまだドキュメント化されてない…?
271デフォルトの名無しさん:2009/07/18(土) 20:09:38
そう簡単にドキュメント化されるものか
ドキュメントはあるのにどこにもリンクが無いstd.perfさんの立場も考えろよ
272デフォルトの名無しさん:2009/07/18(土) 20:14:31
std.perfはstd.date.benchmarkのせいで要らない子扱いになってた気が
273デフォルトの名無しさん:2009/07/18(土) 20:31:29
benchmarkは流れの中にある一部の処理を測りたい時とかに不便な気が
というかなんでstd.dateの中にあんの?
274デフォルトの名無しさん:2009/07/18(土) 20:40:56
>>271
正直スマンかった…
まぁ、core.sync.*はTangoのそれと同じみたいだからそれ見ればいい話か…
275デフォルトの名無しさん:2009/07/18(土) 21:29:46
tangoとの統合の一環なのな
276デフォルトの名無しさん:2009/07/19(日) 00:44:44
でstd.inbufferどこいったのよ・・・
277デフォルトの名無しさん:2009/07/19(日) 02:06:40
>>276
俺も気になってた。
1.0系、2.0系どっちの更新履歴にも名前すら出てこない。
278デフォルトの名無しさん:2009/07/19(日) 03:44:48
>>277
古いのを何個か落として確認してみたけど、なかったよ。
OutBufferのドキュメントにInBufferの名前があるだけ。
279デフォルトの名無しさん:2009/07/19(日) 11:30:32
不変条件があるとrefメンバ関数使えない?
class A{
int a;
invariant(){}
ref int fn(){
return a;
}
}
280デフォルトの名無しさん:2009/07/19(日) 11:35:28
バグ
281デフォルトの名無しさん:2009/07/19(日) 13:22:35
invariant()の中でメソッド呼び出すと無限再帰になるの何とかしてほしい
282デフォルトの名無しさん:2009/07/19(日) 13:51:13
参照カウンタ方式のクラスが欲しい
システムプログラミング言語だったら、プログラマの意図したときに解放させたいと思うときがあるはず
283デフォルトの名無しさん:2009/07/19(日) 14:40:32
構造体のctor/dtor/postblit使えば簡単にかける
284デフォルトの名無しさん:2009/07/19(日) 15:34:48
書けることは書けるんだが、
sharedRef!(A) a = sharedRef!(A)(new A);
とかやんないといけないからメンドイのです
285デフォルトの名無しさん:2009/07/19(日) 15:38:22
auto a = sref(new A);
とかまでならできるんじゃないか?ヘルプ関数使えば。
286デフォルトの名無しさん:2009/07/19(日) 15:54:42
Dに慣れてautoから離れられない体になってしまいました
287デフォルトの名無しさん:2009/07/19(日) 16:09:19
近代C系文法はみんな備えるようになってないか?autoは。
288デフォルトの名無しさん:2009/07/19(日) 16:24:29
aliasで短縮するだけでもだいぶ違う。
289デフォルトの名無しさん:2009/07/19(日) 18:19:46
>>282-284
標準に欲しいものは作ってnews groupに投稿したらいいんだよ
290デフォルトの名無しさん:2009/07/19(日) 18:23:22
っていうかscopeをクラスメンバで使わせてほしい
291デフォルトの名無しさん:2009/07/22(水) 15:09:03
なんでref変数ないの?
嫌がらせ?
292デフォルトの名無しさん:2009/07/22(水) 15:45:11
焦らしプレイです
293デフォルトの名無しさん:2009/07/22(水) 19:29:05
FiberいつのまにPhobosにきたの!!!!!!??!?
294デフォルトの名無しさん:2009/07/22(水) 21:03:54
>>293 去年にはもうあったよ
295デフォルトの名無しさん:2009/07/23(木) 00:03:57
>>293
嬉しいよねー。パフォーマンスどうなんだろう。
296デフォルトの名無しさん:2009/07/23(木) 00:13:16
わからない…Fiberのよさがわからない…
だれかFiberの旨味を教えてくれ…
297デフォルトの名無しさん:2009/07/23(木) 00:17:42
弾幕作るときにあると楽
298デフォルトの名無しさん:2009/07/23(木) 00:37:02
状態遷移が楽に書けるんだよね。遷移のトリガのチェックにループ使えるし。
オブジェクトに状態の変数持たせなくてもローカル変数で済むし。
Stateパターンいちいち使うのもめんどいからなあ。
299デフォルトの名無しさん:2009/07/23(木) 01:51:11
ゲーム作るときにちょっと便利かも
300デフォルトの名無しさん:2009/07/23(木) 02:25:42
使ったことないけど、yieldのときに値を返したり受けたりできないのは不便な気がする。
301デフォルトの名無しさん:2009/07/23(木) 02:46:43
リファレンスカウンタ方式のGCみたいなもんだ
302デフォルトの名無しさん:2009/07/23(木) 07:43:42
Dで書かれた代表的なアプリケーションは

303デフォルトの名無しさん:2009/07/23(木) 09:00:28
>>302
ABAさんのゲーム
poeny
芝が生えるゲーム
304デフォルトの名無しさん:2009/07/23(木) 09:19:46
2ch viewer
305デフォルトの名無しさん:2009/07/23(木) 19:24:56
Poseidon
306デフォルトの名無しさん:2009/07/23(木) 20:28:19
>>304
あるの?
307デフォルトの名無しさん:2009/07/23(木) 20:57:57
final switch使って-wつけてコンパイルしたらめっちゃ怒られて死んだ
308デフォルトの名無しさん:2009/07/24(金) 00:01:49
range caseどうなったん?
309デフォルトの名無しさん:2009/07/24(金) 16:54:34
>>302
後は研究や仕事のデータ処理に使ってる人がいるくらいで
公開されたアプリケーションはあんまりないよね
310デフォルトの名無しさん:2009/07/24(金) 18:55:08
自分しか使わないツール作るのはすごい楽。
311デフォルトの名無しさん:2009/07/24(金) 20:11:26
>>309
現状言語自体が不安定すぎだしコンパイラの検証・バグ取りも済んでいないので、
放棄不可でメンテナンスが必要なものには使えないというのが実情かな。
言語自体の素性は良いので自分専用のツールを作るにはもってこいだが。
312デフォルトの名無しさん:2009/07/24(金) 20:21:11
便利なCとして使うには癖が強すぎるからじゃないかな
313デフォルトの名無しさん:2009/07/24(金) 20:31:35
Scalaみたいな言語の登場を考えるに、言語開発速度が遅すぎて時代遅れの感。
今後はJVMかLLVMの上で動く言語を考えるべきじゃなかろうか。
314デフォルトの名無しさん:2009/07/24(金) 20:36:10
いやこれはsystems programming languageなので
315デフォルトの名無しさん:2009/07/24(金) 20:40:39
システム言語として生きるなら、GC周りは決着すべきことが多いかなという気がするがなあ。
現状は、最新世代レベルの記述力を持ってバイナリをゲロる言語という感じだが。
316デフォルトの名無しさん:2009/07/24(金) 20:55:07
GCを取り除いたバージョンのDも触ってみたいね
317デフォルトの名無しさん:2009/07/24(金) 21:03:08
DWTでアプリ作ってるんだけどDWT諸共死にそうで恐い
318デフォルトの名無しさん:2009/07/24(金) 21:09:57
Dで書かれた(書こうとしている)OSってあったっけ?
MonaOS?
319デフォルトの名無しさん:2009/07/24(金) 21:12:30
今はないかと
320デフォルトの名無しさん:2009/07/24(金) 21:34:31
OSにGCが採用されたら実行可能ファイルのファイルプロパティに
GCアルゴリズムが選択出来るようになってるんだろうか。
321デフォルトの名無しさん:2009/07/24(金) 21:47:46
公式的にはQtDがおすすめのような雰囲気を感じる
322デフォルトの名無しさん:2009/07/24(金) 21:50:44
ユーザー増やすのに重要なのは言語じゃなくてライブラリだからなぁ。
極端な話ライブラリさえあればH○Pみたいな言語仕様でもアプリを書いてもらえるのに、
言語だけどんどん改訂していくものだからいつまで経っても良いサイクルに入らない。
323デフォルトの名無しさん:2009/07/24(金) 22:27:13
324デフォルトの名無しさん:2009/07/25(土) 01:48:56
>>320
選択できるようにする必要あるの
325デフォルトの名無しさん:2009/07/25(土) 01:51:51
JVMはスループット重視か最悪値最小化重視かを選択できる。
ビルド時にオプション指定できる程度で十分だろうけど。
326デフォルトの名無しさん:2009/07/25(土) 02:38:02
>>322
いや、少なくともDに関しては
「仕様が固まってないから」という理由が大きい。
だって、せっかく作ったものでも、
ちょっとバージョンが変わるだけでコンパイルさえ通らなくなるようじゃ
怖くて大規模なものには手を出せない。

バージョンアップを楽しめる一部の人を除いて。
327デフォルトの名無しさん:2009/07/25(土) 02:57:11
eclipse3.5にdescent入れようとしたらエラーが出ました。
3.4には入ったんですが、3.5には対応してないってことなんですかね?
328デフォルトの名無しさん:2009/07/25(土) 05:08:34
そんなことはない
329327:2009/07/25(土) 06:49:54
all in oneを入れなおしたら入りました。
330デフォルトの名無しさん:2009/07/25(土) 11:18:12
http://pc12.2ch.net/test/read.cgi/tech/1245092251/302

これについて解説お願いします。
331デフォルトの名無しさん:2009/07/25(土) 12:25:03
>>330
向こうのレスにある
> テンプレートとプリプロセッサの黒魔術で無理矢理DSLを作ってどうにかする
だよ。

auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
};

0x風の書き方にするとauto result = linq<"from ... n">というような式で、
linq = テンプレート関数か何かを指すシンボル。
! = テンプレートの明示的インスタンス化。テンプレートパラメタ(cppで言う<>の中身)を続けて書くと括弧が省略できる。
q{ .. } Dで有効なトークンのみを記述することが出来る文字列リテラル(これがテンプレートパラメタ)

linqの中身をコンパイル時または実行時パーサにすると、そういう構文が書けるというお話。
しばらく前にお遊びで作られた黒魔術の一つ。
実用に供すことも可能だが、やった人は知らん。
332デフォルトの名無しさん:2009/07/25(土) 12:29:39
っつか0xスレでもDはGCが邪魔という話になってたのか
向こうを久方ぶりに見たが、まったく同じ内容のレスがあるとは
333デフォルトの名無しさん:2009/07/25(土) 12:34:52
>>330
面白そうだから書いてみた(適当だけど)。ASTマクロが実装されてからが本番だな。

//Public Domain
string[] lexLinq(string code){
  string[] r = [""];
  foreach(c; code){
    if(c == ' ' || c == '\r' || c == '\n' || c == '\t'){
      if(r[r.length-1] != "") r ~= "";
      continue;
    }
    r[r.length-1] ~= c;
  }
  return r;
}
334デフォルトの名無しさん:2009/07/25(土) 12:36:05
string translateLinq(string code){
  string aggregate, variable, condition, item, cur;
  foreach(i, a; lexLinq(code)){
    if (a == "from" || a == "in" || a == "where" || a == "select"){
      cur = a;
      continue;
    }
    if (cur == "from"  ) variable  ~= " " ~ a;
    if (cur == "in"    ) aggregate ~= " " ~ a; // 複数の時はstd.rangeに落とすべき
    if (cur == "where" ) condition ~= " " ~ a;
    if (cur == "select") item      ~= " " ~ a;
  }

  return "
    alias typeof({
      mixin(\"foreach(index, "~variable~"; "~aggregate~")return "~item~";\");
      assert(0);
    }())[] ResultType; // イテレータかレンジで返すべき
    ResultType r;
    foreach(index, "~variable~"; "~aggregate~"){
      if ("~condition~") r ~= "~item~";
    }
  ";
}
335デフォルトの名無しさん:2009/07/25(土) 12:37:33
auto linq(string code, T)(T numbers){ // ASTマクロが実装されたら関数の引数は無くせる。
  mixin(translateLinq(code));
  return r;
}

import std.stdio;
void main(){
  auto numbers = [1,2,3,4][];
  auto result = linq!q{
    from n in numbers
    where n % 2 == 0
    select n
  }(numbers);
  writefln(result);
}
336デフォルトの名無しさん:2009/07/26(日) 01:16:14
>>332
客層同じだしな
337デフォルトの名無しさん:2009/07/26(日) 01:32:53
違いはGCと文法と実装のしやすさとコンパイル速度ってかんじか?
GCない方がいいってのはなんでだ?GCあったってリソースの管理くらいできるのに。
338デフォルトの名無しさん:2009/07/26(日) 01:40:22
2ch内ではD言語をゲーム目的くらいにしか使わないからじゃね?
339デフォルトの名無しさん:2009/07/26(日) 01:42:45
GC使っていい環境なら素直にJavaやC#使ってるよ
そうじゃないからこそ敢えてC++使ってることが多い
340デフォルトの名無しさん:2009/07/26(日) 02:00:21
なるほど、環境によっては確かにGC使えない環境もあるかも。
ところで、GC使えなくてC++使える環境ってたとえば何があるかな?
マイコンとかだとC++すら使えなかったりしないか?
341デフォルトの名無しさん:2009/07/26(日) 02:01:53
バイナリが200KBも大きくなるのが我慢ならないとか
342デフォルトの名無しさん:2009/07/26(日) 02:06:20
>>341
うーん
そういう人は何があっても新しいものに移行しない希ガスるので放っておくしか
343デフォルトの名無しさん:2009/07/26(日) 02:07:20
struct shared_ptr{} 作ってください
344デフォルトの名無しさん:2009/07/26(日) 02:07:38
実際たいしたコード書いてない奴ほどGCに言及する傾向
345デフォルトの名無しさん:2009/07/26(日) 05:12:58
httpdやsshdのライブラリってある?
346デフォルトの名無しさん:2009/07/26(日) 17:24:18
60FPSで回すとGCの挙動が気になるのは当たり前
スレッド毎にコレクトするならいいんだけどなぁ
スレッドローカル仕様になったし、そうなることに期待
347デフォルトの名無しさん:2009/07/26(日) 19:13:05
ああ,TLSになったら依存関係の木構造が小規模になるから
スレッドごとにコレクトしやすくなるのか
348デフォルトの名無しさん:2009/07/27(月) 03:16:20
>>346
どのトピックか忘れたけどSeanが「スレッド毎にGCを動作させるようにする」みたいなこと言ってた気がする
349デフォルトの名無しさん:2009/07/27(月) 04:50:07
コンカレントGCってのに憧れてるんですけどD言語にそういう機能とか予定とかありませんか?
350デフォルトの名無しさん:2009/07/27(月) 05:04:21
Cの文字列をchar*型で渡されたとします。
これをchar[]型にコピーする最も簡単な方法は何ですか?
351デフォルトの名無しさん:2009/07/27(月) 05:05:40
>>348
それ、ロックレスなアルゴリズムと相性悪そうだな。

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

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

たしかにtoで対応してくれるとうれしいけども
こうなったらsscanfの機能も取り込んでしまえば…
to!("%x")(str);
388デフォルトの名無しさん:2009/07/28(火) 18:38:04
toは型の変換用じゃないのw
389デフォルトの名無しさん:2009/07/28(火) 18:39:24
だしformatでいいでしょ
390デフォルトの名無しさん:2009/07/28(火) 20:08:36
それはprintf系だが
391デフォルトの名無しさん:2009/07/28(火) 20:17:50
readfどこいったんだよ
392デフォルトの名無しさん:2009/07/28(火) 20:34:39
きっとDの機能をフルに使った変態関数を製作中
393デフォルトの名無しさん:2009/07/28(火) 20:51:17
2.030辺りでformattedReadなるものが追加されたはず…
と思ってドキュメントを見ても無い
なんだ気のせいか
394デフォルトの名無しさん:2009/07/28(火) 22:20:40
tangoの該当機能がPhobosに取り込まれれば全て解決…
395デフォルトの名無しさん:2009/07/29(水) 01:56:55
>>390
それってどれだ
396デフォルトの名無しさん:2009/07/29(水) 02:08:46
それにつけても
397デフォルトの名無しさん:2009/07/29(水) 03:14:47
かっぱえびせん
398デフォルトの名無しさん:2009/07/29(水) 12:00:28
おやつはカールだろ
399デフォルトの名無しさん:2009/07/29(水) 21:18:50
>>398
マジレス厳禁
400デフォルトの名無しさん:2009/07/30(木) 00:01:47
ちょwwwwwwwwwwwおやつはカールだろwwwwwwwwwwwwwwwwwwwwwwwww
401デフォルトの名無しさん:2009/07/30(木) 00:57:23
最近おっとっとにはまってる
402デフォルトの名無しさん:2009/07/30(木) 01:00:16
ジャンク舌な俺はハバネロ派
403デフォルトの名無しさん:2009/07/30(木) 07:03:58
地味に柿ピーが好き。
404デフォルトの名無しさん:2009/07/30(木) 09:25:21
>>400
なんだよ!!!
405デフォルトの名無しさん:2009/07/30(木) 10:46:55
std.InBufferは、いつになったら実装されるの?
存在しない物と思っておくべき?
406デフォルトの名無しさん:2009/07/30(木) 18:27:13
>>405
あなたが作ってポストすればおkって言語ですから。
407405:2009/07/30(木) 21:21:39
しょぼいものしか作れそうにありませんごめんなさい
408デフォルトの名無しさん:2009/07/31(金) 00:22:03
http://tinyurl.com/kjerra
D言語に関するアンケートの実施です。
あなたの興味のあるトピックについて、もしよろしければご回答ください
409デフォルトの名無しさん: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)
}
}

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

scope変数に対する静的解析を実装すれば解決できるんだろうけど。
428デフォルトの名無しさん:2009/08/02(日) 22:13:48
>>427
じゃあ仕方なくないのかね
429デフォルトの名無しさん:2009/08/02(日) 22:58:19
>>427のって>>409のおはなし?
typeof(this)ってのがそのクラス固有の関数を呼ぶために特別扱いされてるとかそういう関係で
型がおかしくなってるっていうバグかと思ってたんだけど、違うの?
430デフォルトの名無しさん:2009/08/02(日) 23:15:22
>>429
いあ、それとは関係ない。
誰かがどこかでつぶやいてた話。
431デフォルトの名無しさん: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);
}
--------
・・・これはキモイね。
432デフォルトの名無しさん: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モジュールと、同名なのがだめなんでしょうか?
433デフォルトの名無しさん:2009/08/03(月) 12:01:28
エラーを文字通りに取れば
hoge.hoge.hoge関数と
hoge.hoge.hogeモジュールが競合するようだが
関数があるのは自己申告で確定だから、
hoge.hoge.hogeというディレクトリがあればその競合が原因だな
434デフォルトの名無しさん:2009/08/03(月) 12:25:26
>>433
うーん、プロジェクトのフォルダの中にhogeフォルダ、そのhogeフォルダの中にフォルダはないです。
435432:2009/08/04(火) 05:55:52
改名importにしたらエラーは消えました。
モジュールhoge.hogeの中でhoge.fugaをimportするとhoge.hoge.hoge.fugaになって、
hoge.hoge.hogeの部分がパッケージ.パッケージ.パッケージなのかパッケージ.パッケージ.関数なのか判別できないっていう事なのかなぁ。
うーん、改名importにしないといけないぐらいなら、パッケージとモジュールに同じ名前をつけるのやめた方がいいか・・・。
436デフォルトの名無しさん: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
437デフォルトの名無しさん:2009/08/05(水) 04:33:07
>>436
Rangeの作り方が最初よく分からなかったのだが、
たとえば配列をRange化する場合、
.nextは[1..$]というスライス(の参照)を返すって事でいいんだよね?

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

罠:
ドキュメントには .empty .next .retreat .head .toe が列挙されているが、
実際には .empty .popFront .popBack .front .back。
439デフォルトの名無しさん:2009/08/05(水) 06:46:32
思ったこと
st.iteratorとRangeの関係は?frontという名前が競合するんだが。
iteratorなしでlistに挿入って出来るの?
とか
440デフォルトの名無しさん:2009/08/05(水) 07:26:50
endを固定(empty)にして、イテレータのbeginとendをまとめたようなもの
441デフォルトの名無しさん: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); }
}
442デフォルトの名無しさん:2009/08/05(水) 17:05:36
>>437
popFront は range を返すのではなくて、 range 自体を変更する。
443デフォルトの名無しさん:2009/08/05(水) 17:08:41
>>439
あるRangeの前や後ろに要素を挿入する操作を定義すればいい。
444デフォルトの名無しさん:2009/08/05(水) 19:59:26
>>441
castして代入してるけどアラインメントが揃ってないとクラッシュしちゃう
処理系もあるので、memcpyあたりでコピーするようにしたほうがいいかも
445デフォルトの名無しさん:2009/08/05(水) 20:20:30
gccが、decimal128をサポートするみたい。
DPDが良いのか悪いのかは別にして、D言語にあれほど
10進演算器入れてくれって言ったのに・・・・

さよなら、D言語。
446デフォルトの名無しさん:2009/08/05(水) 21:10:16
そんなもんライブラリのサポートで十分だろうが……
447デフォルトの名無しさん:2009/08/05(水) 22:16:13
>>446
それを言い出すのなら、CやC++で充分って事で。
448デフォルトの名無しさん:2009/08/05(水) 22:24:46
あれほど言ったのにというが、ちゃんとWalterに伝えたのかな?
449デフォルトの名無しさん:2009/08/05(水) 22:48:32
decimalより__m128を先にして欲しい
450デフォルトの名無しさん:2009/08/05(水) 23:11:13
>>449
それはabs()で行けるやん。
451デフォルトの名無しさん:2009/08/05(水) 23:20:09
D言語でDirectXを使ったゲームって作れますん?
452デフォルトの名無しさん:2009/08/05(水) 23:25:05
>>450
abs?

>>451
つくれます。
453デフォルトの名無しさん:2009/08/05(水) 23:35:45
qtd試そうとしたらQtCore4.dllが腐ってて死んだ
454デフォルトの名無しさん:2009/08/05(水) 23:39:48
IEEE 754のdecimalXXに対応してるプロセッサってあるの?
455デフォルトの名無しさん:2009/08/06(木) 00:17:42
>>444
なるほど、アラインメントの事は忘れていました。

OutBufferのwrite関数はアラインメントを調節してないように見えるんですけど、
alignSize関数を使ってライブラリ利用者自身が調節してくださいっていう事ですかね。
456デフォルトの名無しさん:2009/08/06(木) 01:28:21
>>442
popFrontの挙動って配列スライス(=参照)そっくりなんすよ。
Dでlistを実装するとheadとtoeへのポインタを持つ構造体になるが、
配列の場合は配列長と先頭アドレスのポインタを持つ構造体として表現できる。
スライスは実体を動かさずに配列長と先頭アドレスだけ動かした構造体を作るもので、
listのpopFrontもheadへのポインタを動かしただけの構造体を作る実装になる。
真のメモリ回収はGC任せにするようにする。
そうでないとforeach Rangeに突っ込めないので、そういう使い方を想定しているのかと。
なのでlistにも配列と同じように、dupとidup、内容のコピー(STLのassignみたいな)が必要になるはず。


>>443
というモデルでのスライスのpushFront/Backがあれば挿入できるな。確かに。

……と思っていたが、foreach Rangeのために、popFrontした後のheadの前方要素ポインタのnull代入をしないようにしたんだが、
popFrontしたのに永遠にGCに回収されないモデルだということに気づいた。どうすんだこれ。
457デフォルトの名無しさん:2009/08/06(木) 01:57:52
あー早く言語仕様固まらないかなー
458デフォルトの名無しさん:2009/08/06(木) 02:19:00
このエターナり具合はゲーム制作板に通ずるものがある。
459デフォルトの名無しさん:2009/08/06(木) 02:52:04
RangeとIteratorあたりの方針とか実装テクニックをandreiに記事にして欲しい
例の本に載っているのかな
460デフォルトの名無しさん:2009/08/06(木) 03:59:26
>>456
リストは一つのオブジェクトで,rangeはその上の範囲を指すビューだと考えれば、
リストの一部が参照されている限り、リスト全体が破壊されることはないのは普通じゃないかな。

// ビューに関する操作
empty // 空かどうか
front. back // 現在のビューの先頭、末尾の参照
popFront(), popBack() // ビューを縮める *ビューを破壊

// リストの実体に関する操作
dup() // 現在のビューの範囲だけを取り出して新しいリストを作る(そして,その全体を表すビューを返す)
insertBefore(T), insertAfter(T) // 現在のビューの前後に要素を追加する *実体を破壊
eraseFront(), eraseBack() // 現在のビューの先頭、末尾の要素を削除する *実体を破壊

たぶんプリミティブなオペレーションで必要になるのはこの辺りだと思う。
461デフォルトの名無しさん:2009/08/06(木) 04:24:35
>>460
そんな感じかね。
Range実装の一番単純な例として、
書いたものを晒してレビューして欲しいんだが、
D言語研究とかにページ作って見てもらってもいいかな?
462デフォルトの名無しさん:2009/08/06(木) 06:17:16
OutBufferってなんでmemcpyを使わず、アラインメント調節とcastして代入なんだろう?
対になるInBufferが作りにくいなぁ・・・。
463デフォルトの名無しさん:2009/08/06(木) 10:28:28
>>461
http://dusers.dip.jp/modules/forum/index.php?topic_id=28#post_id100
Dequeのならここにある

>>462
すでにOutBuffer使われなくなってたりして。MemoryStream+EndianStream使えば何とかなりそうだし…
464デフォルトの名無しさん:2009/08/06(木) 11:55:15
>>463
std.streamにそんな物があったとは知らなかったです。
OutBuffer必要ないですねぇ。
465デフォルトの名無しさん:2009/08/06(木) 19:16:20
キャスト演算子無くしてジェネリック関数にしよう
cast!int(hoge);
466デフォルトの名無しさん:2009/08/06(木) 19:28:08
>>465
テンプレート関数は仮想関数になれないから駄目。
467デフォルトの名無しさん:2009/08/06(木) 22:36:10
やっとQtD動いた
・Qt 4.5の2009.3版は避けて2009.2を使う
・Qtのインストール先は"C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0"でないと駄目
・QtCore4.dllがねぇぞゴルァと言われたらbuild_dir/generator/にQtCore4.dllとQtXml4.dllをコピー

fedoraにインストールした時はあんなに素直だったのに…
468デフォルトの名無しさん:2009/08/07(金) 03:25:15
コンストラクタをconst就職したらどうなるの?
469デフォルトの名無しさん:2009/08/07(金) 12:48:45
コンパイルできなくなる
470デフォルトの名無しさん:2009/08/07(金) 13:37:58
> .tupleof プロパティは、 隠しフィールドおよび基底クラスのフィールドを除く、 全てのフィールドからなるタプルを返します。

隠しフィールドって何ですか?privateとは違うんですか?
ぐぐっても答えが出てこないです。
471デフォルトの名無しさん:2009/08/07(金) 14:03:55
>470
クラスの仕組みを実装するために、処理系がこっそりクラスに追加してるフィールドのこと。
だからソース中には出てこない。
472デフォルトの名無しさん:2009/08/07(金) 14:07:12
>>471
thx
473デフォルトの名無しさん:2009/08/07(金) 15:35:49
ある型が静的配列であるか判定するにはisStaticArray。
では、動的配列であるか判定するにはどうすればいいですか?
474デフォルトの名無しさん:2009/08/07(金) 16:15:40
isDynamicArray
475デフォルトの名無しさん:2009/08/07(金) 16:40:15
怒濤の更新こないかなー
最近trunk覗いてないな
476デフォルトの名無しさん:2009/08/07(金) 16:42:00
>>474
__traitsの方ばかり見てて、それに気がづかなかった・・・
__traitsとpobosのstd.traitsって同じような物が結構ありますけど、どこが違うんでしょうか?
477デフォルトの名無しさん:2009/08/07(金) 16:45:33
import std.stdio;
void main(){return write;}
なあこいつをどうおもう?
478デフォルトの名無しさん:2009/08/07(金) 16:50:55
>>476
__で始まるシンボルはそのうち使えなくなってもおかしくないのでは
479デフォルトの名無しさん:2009/08/07(金) 16:52:31
ちなみにこうするとdmdが死ぬ
import std.stdio;
auto main(){return write;}
480デフォルトの名無しさん:2009/08/07(金) 17:18:07
private
{
enum real hoge = 1.001L;
alias hoge fuga;
}
これのfugaがpublicになるのはバグでいいんだよな?

ほかにもtemplate mixinしたのがpublicだったり…
public関連のバグはvoteでも高い値出してるんだからさっさと潰してくれたらいいのに…
481デフォルトの名無しさん:2009/08/07(金) 17:43:39
>>478
そうだったんですか。
phobosの方を使った方がいいんですね。
482デフォルトの名無しさん:2009/08/07(金) 18:35:57
public関連は暗黙friendでちょっと確認面倒だからな・・・
483デフォルトの名無しさん:2009/08/07(金) 18:47:51
>>481
ごめん
こういうことなので使えなくなるは言い過ぎたかも

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

}
497493:2009/08/08(土) 20:02:21
tuple(返り値で作ったTupleを返すやつ)を使って、配列を含むタプルは作れました。
でも、constが含まれるとエラー(tupleのソース見ても明らかにconstは無理)。
const配列を含むタプルはどうやって作ればいいんだろう・・・。
498デフォルトの名無しさん: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);
}
499496:2009/08/08(土) 23:44:01
>>498
なるほど
&つけるとヒープ上の実体のアドレスが得られると勘違いしてました。
参照がCのポインタそのものなんですね。
500デフォルトの名無しさん:2009/08/09(日) 02:59:58
intがsize_tに暗黙に変換されるのって抑制できませんか?
501デフォルトの名無しさん:2009/08/09(日) 08:07:12
minmaxを記号でやる言語があるのかもしれんが
頻出処理ではないのに貴重な記号を使うのはもったいないのと
複数要素、およびコンテナ、イテレータのことを考えると記号でやる処理にしては複雑すぎるのと
本来数学でさえ記号を使わないのでいらないと思う

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

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

D言語の仕様は決まってない&書いてない&そのうち変わるの三拍子
522デフォルトの名無しさん:2009/08/10(月) 18:23:37
ドキュメントにも将来的には〜予定です。とか普通に書いてあるしな。
523512:2009/08/10(月) 19:51:54
たしかに仕様がどんどん変わっていく身軽さはD言語のいいところだと思うので、仕方ないところなんですね。
524デフォルトの名無しさん: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件が破壊的変更
525デフォルトの名無しさん:2009/08/10(月) 20:49:41
>>524
最後の
それだけの変更はどうせ長続きしないからむしろ歓迎w
526デフォルトの名無しさん: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のコンストラクタでエラーが出る意味がわからないです。
どういうことなのでしょう?
527デフォルトの名無しさん:2009/08/10(月) 22:34:04
配列の中に値を代入しようとしてるからかな

class A {
 const(int[]) aaa;
 this() {
  aaa.length = 1;
  aaa[0] = 1; // これは通らない
  aaa = [1]; // これは通る
 }
}
528デフォルトの名無しさん:2009/08/11(火) 05:58:49
>>527
うーん、fieldがconstになる理由が、ソース見てもわからないです。
constを要素にできないのは、Tupleの仕様なんですかね?
529デフォルトの名無しさん:2009/08/11(火) 13:52:00
530デフォルトの名無しさん:2009/08/11(火) 15:26:00
最近のMLはDIP含めプロパティに関して活発だったからなぁ
どうなるのか楽しみ
531デフォルトの名無しさん:2009/08/11(火) 15:56:01
本物のプロパティってC#みたいになるの?
今までの疑似プロパティも継続して使えるのかどうかが気になる
532デフォルトの名無しさん:2009/08/11(火) 16:23:15
D言語の慣習としては今までのプロパティはなかった事にして、破壊的変更。
D言語ユーザー阿鼻叫喚に期待
533デフォルトの名無しさん:2009/08/11(火) 16:46:43
すべてはウォルタータンの御心次第。
534デフォルトの名無しさん:2009/08/11(火) 16:47:14
T2ってなに?
535デフォルトの名無しさん:2009/08/11(火) 16:57:13
今までのプロパティ好きだったけどな
問題があったのかな
536デフォルトの名無しさん:2009/08/11(火) 17:20:23
>>534
ターミネーター2。
じゃなくて、話の流れからして、D2用Tangoのことでしょうね。
537デフォルトの名無しさん:2009/08/11(火) 17:34:41
>>532
行頭で並んでると全角と半角の違いが気になる
538デフォルトの名無しさん:2009/08/11(火) 21:14:33
今までのだと+=とかできなかったから?
539デフォルトの名無しさん:2009/08/11(火) 22:50:50
今までのを完全になくしたら、ただの短縮記法的な括弧なしの関数呼び出しとかが
できないようになるじゃん。
D言語ゴルファー涙目だな。
540デフォルトの名無しさん:2009/08/11(火) 23:16:22
>>535
俺も好きだった。まあ>>538の問題は気になってたけど。
うれしさ半分さびしさ半分って感じだなあ。
541デフォルトの名無しさん:2009/08/11(火) 23:26:50
ただの>>420ってことはないのかしら
542デフォルトの名無しさん:2009/08/12(水) 10:10:13
x64をはやくおながいします・・・
543デフォルトの名無しさん: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."
述語にメンバ関数は使えないのでしょうか?
何か方法はないですか?
544デフォルトの名無しさん:2009/08/12(水) 17:20:51
enforceあるおかげでthrowいらなすぎる・・・
545デフォルトの名無しさん:2009/08/12(水) 17:27:25
std.contractsがいつの間にかパワーアップしてるな
546デフォルトの名無しさん: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);
}
}
547546:2009/08/12(水) 17:46:02
最初のはこれの間違い
auto result = count!("(Hoge x, Fuga y){return x.func(y.member);}(a,b)")(hoges, fuga);
548デフォルトの名無しさん:2009/08/12(水) 19:12:01
>>546
thx
文字列で式渡す方式は何か制限かあるという事でしょうか(あるいはバグ?)。
関数を渡すか、関数ポインタを渡す事にします。
549デフォルトの名無しさん:2009/08/12(水) 19:38:02
なんというか、バグかそうでないのか判断の難しい問題だな。
ただ、Phobosのソースコードを読むと、開発者は
auto result = count!("a.func(b.member)")(hoges, fuga);
というコードが通るように書いているつもりのような気がする。(std.functional.binaryFunImplのあたり)
550デフォルトの名無しさん:2009/08/12(水) 20:38:00
列挙体に存在しないはずの値が列挙体値にキャストできちゃうの何とかならないのかな
551デフォルトの名無しさん:2009/08/12(水) 20:42:38
暗黙キャストでできちゃうなら問題だけど・・・
明示的にキャストしといてそんな
552デフォルトの名無しさん:2009/08/12(水) 20:56:31
そういやDってcast時例外とか存在しないんだな
553デフォルトの名無しさん:2009/08/12(水) 21:59:57
castって例外出るもんか?
554デフォルトの名無しさん:2009/08/13(木) 00:09:11
C++だと参照をdynamic_castで間違ったダウンキャストすると例外投げる
555デフォルトの名無しさん:2009/08/13(木) 00:56:08
Javaもclassのcast失敗で投げるな

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


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

void f(T)(T t) {
t.func();
}
これは当然OKだから、t.func();がmixinであっても同じ事になるのではないか(むしろならないと不便)と思いました。
562デフォルトの名無しさん: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に与えることもできない
563デフォルトの名無しさん: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もソース見るとこの挙動を期待して書いているように思う。
564デフォルトの名無しさん:2009/08/13(木) 13:00:03
>>653
それf!("a.func();")(hoge);に直したら動くけど
565デフォルトの名無しさん:2009/08/13(木) 13:16:29
>>653
ははっ、ドジっ娘め
566デフォルトの名無しさん:2009/08/13(木) 13:19:37
>>564
ああ、ごめん。ミスった。

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

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

前から思ってたんだけどなんで実行時なんだろ?
581デフォルトの名無しさん:2009/08/15(土) 19:10:32
>>580
え、そうだったんですか・・・。
コンパイル時に実行してくれると便利なのに。
582デフォルトの名無しさん:2009/08/15(土) 19:15:27
その話題は過去に何回もあったけど、公式見解とかってあるのかな
583デフォルトの名無しさん:2009/08/16(日) 12:41:58
多分たいした手間じゃないからこれでいいじゃんって思ってそう
584デフォルトの名無しさん:2009/08/16(日) 12:55:45
それよりもテストに失敗してもそのまま次のテストを実行してくれないと使い物にならない
585デフォルトの名無しさん:2009/08/16(日) 13:57:38
っ try catch
586デフォルトの名無しさん:2009/08/17(月) 00:18:31
例外でテストを書けとな?
587デフォルトの名無しさん:2009/08/17(月) 01:17:01
>585 ではないがこういうことだと思う

import std.stdio, core.exception;
void assert_test(T, string file=__FILE__, ulong line=__LINE__)(lazy T eval, lazy string msg)
{
try{
assert(eval());
}catch( AssertError e ){
writefln("%s", msg());
}
}
void main()
{
assert_test(1==0, "error!");
writefln("end");
}

出力:
error!
end

assertは結局AssertErrorを投げるので、これを食べる関数を作れば
>584 の意図は達成できる
588デフォルトの名無しさん:2009/08/17(月) 01:20:56
>587
忘れてた
catch節をこうしておけば組み込みのassertっぽくファイルと行位置も出力できる
writefln("AssertError@%s(%s): %s", file, line, msg());
589デフォルトの名無しさん:2009/08/17(月) 02:20:10
たぶんそうではなくて、
http://www.kmonos.net/alang/d/techtips/unittests.html
ここの、
unittest {
   try {
   assert(...);
   ...
   } catch (std.asserterror.AssertError ae) {
ae.print();
   }
}
これを言いたかったのではないかなと予想
590デフォルトの名無しさん:2009/08/17(月) 02:45:05
>>589 のtechtipsは気づいてなかったthx
591デフォルトの名無しさん:2009/08/17(月) 08:28:42
>>577
さあ? それでそれがどうしたと言わざるを得ない
592デフォルトの名無しさん:2009/08/17(月) 11:18:28
>579
static assert ってのがあって、これはコンパイル時に実行される。
593デフォルトの名無しさん:2009/08/17(月) 12:47:18
ErrorとExceptionは兄弟になったのか
いつの間に
594デフォルトの名無しさん:2009/08/17(月) 18:03:18
更新まーーーーだーーーーー?
595デフォルトの名無しさん:2009/08/17(月) 20:20:44
2.031がコンパイルエラーになるたびにコア吐いて堕ちる惨状を見るに、修正には時間がかかりそうだと思った
596デフォルトの名無しさん:2009/08/17(月) 21:01:07
ウォルターはドッグフードをてめーで食ってないんじゃないか?
やっぱりdmdはdmdで作るべきだろ
597デフォルトの名無しさん:2009/08/17(月) 21:53:08
そうこだわらんでも
CでよりはC++で書いて欲しいけど
598デフォルトの名無しさん:2009/08/18(火) 00:06:14
>>595
アジャイル(笑)なのでしょうがない
599デフォルトの名無しさん:2009/08/18(火) 00:09:37
new immutable(int)[n];ってどうやって使いこなすの?
次の行で詰むんだけど
600デフォルトの名無しさん:2009/08/18(火) 00:20:45
書き換え可能配列に書き込んだらidupかassumeUniqueを使う

>>591
そもそもC++はGCとの相性でくるみにくいし、
Cならくるまなくてもそのまま使えるしな

>>595
とりあえず -g -debugを入れて-Oを切ればInternal Compiler Errorでコケることは減る
かといって問題が解決するわけでもないが
601デフォルトの名無しさん:2009/08/18(火) 00:52:16
テンプレートそのものはaliasできないんすかね
602デフォルトの名無しさん:2009/08/18(火) 00:55:17
interfaceマジ意義薄れてるな
Tで受け取ればstructの擬似interfaceまでできるし
603デフォルトの名無しさん:2009/08/18(火) 00:58:54
>>602
ここはどうしても多態という場面があってそこには使える

interfaceじゃないけどstructにコンセプト的なものが欲しくなった
ユーザ側が拡張するときにこれは実装してくれという
Rangeなんかちょうどそんな感じだしな
604デフォルトの名無しさん:2009/08/18(火) 02:46:36
encodeって書かれてもなにやってんだかわかんない・・・
モジュール指定が絶対必要な関数を作る方法がほしい
605デフォルトの名無しさん:2009/08/18(火) 07:36:11
static importがあるじゃん?
606デフォルトの名無しさん:2009/08/18(火) 08:13:59
>>600
何のことかと思ったらこういうことか
int[2] a = [1,2];
immutable(int)[2] b = a.idup;
607デフォルトの名無しさん:2009/08/18(火) 08:26:24
>>602
どんなコード?
>>603
template isHoge(T) { enum isHoge = is(typeof( { ... } ); } とconcept ifでできたような気がしたがやってみたらできなかった・・・
is(typeof({})) じゃなかったっけ?
608デフォルトの名無しさん:2009/08/18(火) 11:23:36
>>607
opDotとかじゃね?
609デフォルトの名無しさん:2009/08/18(火) 21:22:52
>1のDSciTEはもう戻ってこないんだな、テンプレから外すんだろうか
610デフォルトの名無しさん:2009/08/18(火) 21:28:23
DescentってD2もいけちゃう?
611デフォルトの名無しさん:2009/08/18(火) 22:51:42
>>610
いける。
でも最新verには対応してなくて、pureやimmutableがキーワードとして認識されない。
612デフォルトの名無しさん:2009/08/19(水) 12:11:33
int[] data;
uint[] dataIndex;
sort!("data[a] > data[b]")(dataIndex);

こんな風にdataIndexをソートしたいんですが、上記のコードは通りません。
C++なら関数オブジェクトを渡す方法を考えるのですが、Dのsortはデリゲート版がないようです。
どうすればいいのでしょうか?
613デフォルトの名無しさん:2009/08/19(水) 12:29:40
614デフォルトの名無しさん:2009/08/19(水) 12:47:45
>>613
どうもです。
そこのサンプルコードをコンパイルするとStack overflowになってしまいます。
なんでだろう?
615デフォルトの名無しさん:2009/08/19(水) 13:34:55
Windowsのdmd 2.031ではうまくいった。
環境によってできるできないがあるのかもしれない。
616デフォルトの名無しさん:2009/08/19(水) 14:05:32
>>615
どうもです。
2.031入れたらコンパイルできました。
617デフォルトの名無しさん:2009/08/19(水) 17:08:26
std.algorithm.equalの引数に静的配列を渡すとエラーになるんですが仕様?
618デフォルトの名無しさん:2009/08/19(水) 17:44:17
Dの静的配列はなんか異質
619デフォルトの名無しさん:2009/08/19(水) 19:21:35
>>618
thx
静的配列と動的配列で挙動が違うのかー。分かりづらい。
620デフォルトの名無しさん:2009/08/19(水) 21:51:20
あーなんとかならないのかな。
algorithmに渡せるRangeは動的配列だけで静的配列は渡せないなんて嫌だw
621デフォルトの名無しさん:2009/08/19(水) 23:00:35
静的配列の後ろに[]を付けるだけで回避できるはず
622デフォルトの名無しさん:2009/08/19(水) 23:06:49
>>621
thx
知らないと気づかないなぁ。
623デフォルトの名無しさん:2009/08/19(水) 23:10:20
ああそうかスライス取れば動的配列として扱えるのか
624デフォルトの名無しさん:2009/08/20(木) 01:38:57
>>612
import std.algorithm;

int[] data = [ 2, 3, 1, 5, 0 ];
uint[] dataIndex = new uint[data.length];
makeIndex(data, dataIndex);

foreach(i; dataIndex) write(data[i], " ");
625デフォルトの名無しさん:2009/08/20(木) 19:01:28
>>624
すみませんmakeIndexがどういう操作(なぜdataがいるのか?)でwriteがどういう操作なのかわからないです。
626デフォルトの名無しさん:2009/08/20(木) 19:32:54
コンパイラに話しかけてるんじゃないんだから関数名にはモジュールまで付けた方が伝わりやすいとおもいます!
きっと std.algorithm.makeIndex と std.stdio.write のこと
627デフォルトの名無しさん:2009/08/20(木) 20:13:42
>>626
どうもです。
makeIndexは目的にぴったりですね。
628デフォルトの名無しさん:2009/08/20(木) 21:18:12
マケインです
629デフォルトの名無しさん:2009/08/21(金) 08:19:53
そろそろ9月です
10月にはD3だっけ
630デフォルトの名無しさん:2009/08/21(金) 13:45:51
選択importの反対のような事ってできないですかね?
std.stringをimportするとdeprecatedのstd.string.findがimportされて、
std.algorithm.findと衝突するのがめんどくさいです。
631デフォルトの名無しさん:2009/08/21(金) 14:28:27
今使えるか分からんけど、前スレでそういうmixin用テンプレートを作った人がいた。
http://pc12.2ch.net/test/read.cgi/tech/1234363551/702
702 名前:デフォルトの名無しさん:2009/05/12(火) 19:26:46
   >>697
   でけたよ
   http://codepad.org/MKHVHlFS
632デフォルトの名無しさん:2009/08/21(金) 14:39:27
import std.string;
import std.algorithm;
alias std.algorithm.find find;
ってすればいいんじゃないかな
633デフォルトの名無しさん:2009/08/21(金) 15:11:46
>>631-632
ありがとうございます。
とりあえず簡単なaliasでかぶせる方法にします。
634デフォルトの名無しさん:2009/08/21(金) 16:33:04
std.string.findがdeprecatedになって何が推奨になったの?
635デフォルトの名無しさん:2009/08/21(金) 17:58:47
indexOfとかじゃなかったかな
636デフォルトの名無しさん:2009/08/21(金) 18:01:10
indexOfですね。2.031のchangelogより:

std.string: deprecated std.string.find and std.string.find, replaced with std.string.indexOf;
deprecated std.string.rfind and std.string.irfind, replaced with std.string.lastIndexOf;
added flag CaseSensitive for indexOf and lastIndexOf;
removed startsWith and endsWith because std.algorithm defines them;
defined std.string.byDchar.
637デフォルトの名無しさん:2009/08/21(金) 18:19:08
ありがとう
よく追いかけているねえ
638デフォルトの名無しさん:2009/08/21(金) 21:44:26
concept-ifのページどこ?見当たらないんだけど><
639デフォルトの名無しさん:2009/08/21(金) 22:04:05
templateのページのテンプレート制約(Template Constraints)ってとこか?
640デフォルトの名無しさん:2009/08/21(金) 22:24:45
それです!!ありがとう!!
ChangeLog見てたらconcept-ifのバグをなんたらとか書いてあったんで
concept-ifでサイト内検索かけてみたけど見つからなかったんです><
641デフォルトの名無しさん:2009/08/21(金) 22:30:21
D1.0でファイルにsjisの文字列を出力する方法ってないでしょうか?
教えていただきたいのですが
642デフォルトの名無しさん:2009/08/21(金) 22:31:46
WindowsならWideCharToMultiByteつかって、そのほかならsetlocaleした後にwcstombsする
643デフォルトの名無しさん:2009/08/21(金) 22:58:18
std.windows.charsettoMBSzってのがある
中身は>>642
644デフォルトの名無しさん:2009/08/21(金) 23:21:25
>>642
>>643
ありがとうございました!
うまく出力できました
645デフォルトの名無しさん:2009/08/21(金) 23:24:01
一応WindowsでTangoをつかうときの方法を紹介
tango.sys.win32.CodePage.CodePage.intoがある。
引数のdstはUTF-8が日本語3バイトに対してShift_JISは2バイトなため、最低srcのバイト数+1のバッファ(最後に\0の末尾文字が入る)を用意すればいい
----- 以下サンプル ----
import tango.io.device.File;
import tango.sys.win32.CodePage;

void main()
{
    scope f = new File("test.txt", File.WriteCreate);
    scope (exit) f.close;
    // mbs
    {
        char[] src = "あいうえお";
        char[] dst = new char[src.length+1];
        dst = CodePage.into(src, dst, 932);
        f.write(dst);
    }
    // ascii
    {
        char[] src = "abcde";
        char[] dst = new char[src.length+1];
        dst = CodePage.into(src, dst, 932);
        f.write(dst);
    }
}
646デフォルトの名無しさん:2009/08/22(土) 00:49:12
コンストラクタテンプレートがないおかげで汎用のアダプタクラスが作りづらいんですが、なにかいい回避策はないもんでしょうか
647デフォルトの名無しさん:2009/08/22(土) 01:08:54
>>646
どうだろう
アダプタはどんな機能を持っているの?
648デフォルトの名無しさん:2009/08/22(土) 01:20:22
>>647
メソッドをbindしたい。
構造としてはこんな感じ。

interface I { void f(int i); }
class C : I { ... }
class Adapter(T:I, int fix) : T
{ this(A...) { super(A); }
void f() { f(fix); }
}

シンボルI, Cはすでにクラスとして使われていて、今からテンプレートにするのが難しい。
同じ目的を果たすのに別の解があればそれでも良いんだが、さてどうしたものかなと。
ちなみにC++ではだいたい目的どおりのコードが書けて、発想が縛られてるのかも。
649デフォルトの名無しさん:2009/08/22(土) 02:15:26
opCallで書いてみるとか・・・
650デフォルトの名無しさん:2009/08/22(土) 02:24:55
>>648
Adapterの更に子クラスを作ってそいつをテンプレートにする。
651デフォルトの名無しさん:2009/08/22(土) 02:57:33
>>649
どうにもうまく親クラスのコンストラクタにたどり着けなかった
親のopCallを呼ぶと親が帰ってくるという罠が……

>>650
同じくsuper.superに届かず
とりあえずあきらめてみる
652デフォルトの名無しさん:2009/08/22(土) 04:44:02
>>648
こんなかんじかな?
http://tinyurl.com/nykscv
問題は親が複数のコンストラクタを持っている場合…
is式でオーバーロードされた関数の引数のタプルってどうやって得るんだろう?
653デフォルトの名無しさん:2009/08/22(土) 13:52:10
>>648
それがエラーになるのは、コンパイラが自動生成するthis()と、
ユーザ定義のthis(T...)(T)がコンフリクトしているのが原因。
今のところテンプレートと非テンプレートはオーバーロードできないけど、
MLでウォルたんはこれをできるようにしたいと言っていたから、ちょっと待てばいいと思う。
654デフォルトの名無しさん:2009/08/22(土) 13:52:46
static opCall(A...)(A args) {
auto _this = GC.malloc(typeof(this).sizeof);
auto ci = typeof(this).classinfo;
_this[0..ci.init.length] = ci.init;
(cast(typeof(super))_this).__ctor(args);
return cast(typeof(this))_this;
}
655デフォルトの名無しさん:2009/08/22(土) 14:02:16
>>652
std.traits.ParameterTypeTupleあたりに解決法が書かれているかもしれないが、ちょっと分からず。

std.typecons.Uniqueを見てopDot + alias thisを使った委譲に切り替えようかなと思ったのだが、
肝心のUniqueが動かない?中身を見るとコンストラクタテンプレートがコメントアウトしてあってnot work YETと書いてある。
656デフォルトの名無しさん:2009/08/22(土) 14:40:30
関数の中にテンプレート書けるようにならないかなあ
657デフォルトの名無しさん:2009/08/22(土) 16:26:35
>>654
ぱっと見黒魔術にしか見えない
658デフォルトの名無しさん:2009/08/22(土) 16:28:01
>>653
マジで!!それは嬉しい
659デフォルトの名無しさん:2009/08/22(土) 19:23:55
>>657
難しくないよ。
660デフォルトの名無しさん:2009/08/22(土) 20:38:09
すみません、MSGBOXPARAMS構造体を使いたいのですが・・・
Error 42: Symbol Undefined _D5win327winuser13MSGBOXPARAMSA6__initZ
661デフォルトの名無しさん:2009/08/22(土) 20:49:19
MSGBOXPARAMS param = void;
ってすると構造体の初期化すっ飛ばせるから、とりあえずそのエラーは消えると思う。
まともにそのエラー消すなら、スタティックリンクライブラリを作ってリンクする。
662デフォルトの名無しさん:2009/08/22(土) 20:54:05
>>661
そのスタティックリンクライブラリを用意できなくて困ってます(。´・ω・)
663デフォルトの名無しさん:2009/08/22(土) 21:03:52
MSのSDKを探してみたところ、unicows.libにありました。
ですが、D言語用に変換できないのです。
664デフォルトの名無しさん:2009/08/22(土) 21:21:34
うーん、とりあえず
MSGBOXPARAMS param = void;
としたらメッセージボックスが表示されましたので、
これで行こうかなと思います。

ありがとうございました^^
665デフォルトの名無しさん:2009/08/22(土) 23:17:16
そのlibじゃなくて、Win32 bindingsのスタティックリンクライブラリ。
中にmakefileが入ってると思うので、それをgnuのmakeでコンパイルする。
666デフォルトの名無しさん:2009/08/22(土) 23:56:37
>>665
やってみましたが、LIBファイルが生成されてないようですorz
一応、make.exeを実行するとDOS窓にファイル名がずら〜と出てくるのですが。
何かmakefileを弄る必要があるのでしょうか?
667デフォルトの名無しさん:2009/08/23(日) 00:08:19
ホントだ。最新の2.0系のDMDではコンパイルできないね。
D1.0系だと行けたけど…makefileの修正が必要だね。下手したらソースコードも直さないとだめかも。
668デフォルトの名無しさん:2009/08/23(日) 01:24:57
>>666
スタティックリンクじゃなくてbudではできないの?
669デフォルトの名無しさん:2009/08/23(日) 01:28:21
budってなんですか?
670デフォルトの名無しさん:2009/08/23(日) 01:32:50
ttp://www.dsource.org/projects/build
budはimport関係にあるモジュールを勝手にimportしていってくれるビルド支援ツール
>>668 はこれじゃダメ?ってこと

> bud main -Ic:\d\dmd2\src\win32port // 例の win32 binding

//main .d
import win32.windows;
void main() {
MSGBOXPARAMS param;
with (param) {
lpszText = "test";
//...
}
MessageBoxIndirect(¶m);
}
671デフォルトの名無しさん:2009/08/23(日) 02:05:47
>>670
できました^^
警告ありですが・・・
lz32.lib
Warning 2: File Not Found lz32.lib
rpcns4.lib
Warning 2: File Not Found rpcns4.lib

これからはD言語のビルドにbudを用いたほうが良いのでしょうか。
672デフォルトの名無しさん:2009/08/23(日) 02:18:30
用途に合わせるとしか言えないんじゃないかな
何にせよbudやrebuild,あとdsss?などを使うとソースからのビルドは割と簡単になるので検討してみてください
ちなみにそのリンクエラーはお好きなものをどうぞw
1)気にしない
2)空の.dファイルから.libファイルを作ってリンクしてごまかす
bud lz32 -lib && bud main
3)正規のlibをdmd用に変換する
673デフォルトの名無しさん:2009/08/23(日) 02:20:04
356 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/17(月) 02:38:04
wktk
D言語サポートするかな


357 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 01:39:58
D言語はサポートされないっぽい。
F#言語はサポートされるらしいが。(ベータ版インストールするとDはないがF#はあった)


358 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 05:46:58
D言語なんかいらん


359 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 06:54:46
D.NETとか存在価値無さすぎ


360 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/18(火) 07:06:18
言語増やすな
日本語実装しろ
674デフォルトの名無しさん:2009/08/23(日) 02:23:08
「何が」何だよ
675デフォルトの名無しさん:2009/08/23(日) 02:53:59
伺か
676デフォルトの名無しさん:2009/08/23(日) 03:26:39
何の話かと思ったらVisual Studio 2010か
…サポートされなくて当たり前じゃね
677デフォルトの名無しさん:2009/08/23(日) 03:50:06
だよ
678デフォルトの名無しさん:2009/08/23(日) 03:57:30
Microsoft Visual D#
679デフォルトの名無しさん:2009/08/23(日) 04:00:57
そのDってM$がこれとは別に作ってるDのことじゃないの?
680デフォルトの名無しさん:2009/08/23(日) 12:06:34
Sunのアレじゃないの?

…あれ?Sunって会社あったよね?
681デフォルトの名無しさん:2009/08/23(日) 12:07:26
一応まだあるよ
じきにOracleに吸収されるけど
682デフォルトの名無しさん:2009/08/23(日) 12:59:23
まあこんな仕様が変わりまくる言語入れたら色々大変だ罠
683デフォルトの名無しさん:2009/08/23(日) 16:52:06
AddFontResourceExが使いたくて
-version=WindowsXP
としたらコンパイルは通るのですが、リンカエラーが・・・
Error 42: Symbol Undefined _AddFontResourceExA@12

DMDに標準でついてくるgdi32.libの中にあるのに何でだろう?
684デフォルトの名無しさん:2009/08/23(日) 17:54:09
const int[] hoge()
ってどうなるの?
const(int[]) hoge()なの?
int[] hoge() const;なの?
685デフォルトの名無しさん:2009/08/23(日) 17:56:23
後者
686683:2009/08/23(日) 18:05:42
gdi32.libを明示的にリンクしてやる必要があったのですね。
解決。
687デフォルトの名無しさん:2009/08/23(日) 18:28:53
nothrow pure const const(int[]) hoge();とかもう少し何とかならないものかと思う
688デフォルトの名無しさん:2009/08/23(日) 18:35:25
nothrow pure const public:
    void hoge(){}
    void fuga(){}
nothrow private:
    void piyo(){}
このとき、piyoはpureだったりconstだったりするんだろうか?
そうだったとして(というか挙動的にそうっぽいけど)、それを無効化することはできるんだろうか?
689デフォルトの名無しさん:2009/08/23(日) 19:08:20
{}で囲むしかないっぽい
690デフォルトの名無しさん:2009/08/23(日) 19:20:31
やっぱりそうか…
public, private, protected, package以外には使いにくそうだな。
インデント増やさずに使えるから>>687の解決策にどうかと思ったけど…
691デフォルトの名無しさん:2009/08/23(日) 19:29:24
クラスメソッドのpure属性って
* 仮引数が全て invariant もしくは invariant に変換可能で
* グローバルの mutable な状態を読み書きしない
だから、自動的に
pure ⊂ const(スコープ外のインスタンス変数に書かないし、読めさえしない)
pure ⊂ staic(スコープ外のインスタンス変数にアクセスしない)
だと思うのだが……

インスタンス内のimmutableなものは読み書きできるということであれば成り立たなくなるのかな?
692デフォルトの名無しさん:2009/08/23(日) 19:31:48
逆に考えるんだ
インデントしなければいいや
と考えるんだ
693デフォルトの名無しさん:2009/08/23(日) 20:01:05
例えばライブラリの間違った使い方をしてコンパイルエラーになった時、
エラーメッセージに表示されるソースがimportのimportのimportの・・・と深くなっていると、
どこでライブラリの間違った使い方をしたのか特定しづらいです。
何かうまい方法はないですか?
694デフォルトの名無しさん:2009/08/23(日) 22:44:31
関数のデフォルト引数を、関数を呼ぶ側のコンパイル時のコンテキストから決める方法はなかろうか
黒魔術でなんとかなりそうな気もするが……
695デフォルトの名無しさん:2009/08/23(日) 22:47:54
しかし、この「黒魔術」という言葉はどこ生まれなんだろう?
国産という気もするが、英語圏でwizardとかguruとか良く使うからあっちの気もする
696デフォルトの名無しさん:2009/08/23(日) 23:14:39
白魔術はないのか
697デフォルトの名無しさん:2009/08/23(日) 23:44:49
digitalmars.com での "black magic" の検索結果 約 176 件
698デフォルトの名無しさん:2009/08/24(月) 01:00:33
>>683 それだけではなんとも
699デフォルトの名無しさん:2009/08/24(月) 03:09:30
あ,なんだ答え出てたのか失礼
700デフォルトの名無しさん:2009/08/24(月) 07:56:53
>>693 そうなっているとどうしてわかりにくいの?
どこまでがモジュール名なのかわからないからとか?
ファイル名出ててわかりにくいのはなぜ?
701デフォルトの名無しさん:2009/08/24(月) 08:03:07
>>695
ふと思い出してvoodooを調べてみたら
http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%89%E3%82%A5%E3%83%BC%E6%95%99
に、ブラックマジックという単語が出てるぞ。語源かは知らんが。
702デフォルトの名無しさん:2009/08/24(月) 10:28:15
>>700
例えばstd.functional.dのbinaryFunImplでエラーが発生したとメッセージが出るとします。
でも、自分が書いたコードの中で直接binaryFunImplを使ってないし、そもそもstd.functionalをimportすらしていません。
正解はstd.algorithmの中の関数の中でbinaryFunが呼ばれてるからなんですが、
自分が書いたコードのどこが間違っているのか、特定に手間がかかります。
703デフォルトの名無しさん:2009/08/24(月) 11:28:48
ライブラリを作る段階でこんな感じにすればいいのではないかと。
import std.stdio;
void func2(T, string f=__FILE__, int l=__LINE__)(T a){writeln("func2: ", f, "(", l, "): ", a);}
void func(T, string f=__FILE__, int l=__LINE__)(T a){func2!(T,f,l)(a);}
void main(){func(10);}
704デフォルトの名無しさん:2009/08/24(月) 12:18:25
テンプレート展開の「スタックトレース」的な機能は必須だよな
705デフォルトの名無しさん:2009/08/24(月) 12:55:06
template instanciationに失敗したら呼び出し元の関数とかを全部エラー出してくれるだけでもいいやな
706デフォルトの名無しさん:2009/08/24(月) 18:21:11
しかし今月の更新は遅いな…どんな破壊的変更が待っているのか…
今からなんだかワクワクしてきた…ッ!
707デフォルトの名無しさん:2009/08/24(月) 19:11:12
string型の文字列をubyteの配列に変換したいんだが…
どうすれば?
708デフォルトの名無しさん:2009/08/24(月) 19:16:29
>>707 何のために?
709デフォルトの名無しさん:2009/08/24(月) 19:19:02
>>708
暗号化
710デフォルトの名無しさん:2009/08/24(月) 19:20:11
ならcast(ubyte[])とかでよくね?
711デフォルトの名無しさん:2009/08/24(月) 19:21:02
ふ〜む
やってみる
712デフォルトの名無しさん:2009/08/24(月) 19:22:46
immutable(ubyte)[]にしないと
713デフォルトの名無しさん:2009/08/24(月) 19:25:06
>>712
了解
714デフォルトの名無しさん:2009/08/24(月) 19:27:14
可能なら const(void)[] などを使うのもよい。
715デフォルトの名無しさん:2009/08/24(月) 21:02:37
>>703
なるほど、実行時エラーはそれでいけますね。
しかし、全ての関数にそれを仕込むのは手間がかかりそうです。
またPhobosをよく使うので、そこはどうしようもないのがつらいところ。
>>704-705
コンパイル時のエラーメッセージで困るのは、確かにテンプレート絡みですね。
今後に期待?
716デフォルトの名無しさん:2009/08/24(月) 22:05:22
いつになったら関数がタプル返せるようになるんだよおい
717デフォルトの名無しさん:2009/08/24(月) 23:11:55
あ…あしたさ…
718デフォルトの名無しさん:2009/08/24(月) 23:47:35
俺にはdmdを改造して特定の機能をなかったことにする程度の能力しかない!
719デフォルトの名無しさん:2009/08/24(月) 23:49:46
タプル返す関数があって何がうれしいの?
構造体でいいじゃんと思うのだけど…
720デフォルトの名無しさん:2009/08/24(月) 23:52:27
毎回作るのめんどいじゃんってのがタプルの起源だったきがする、
無名delegateも似たような理由だし。
721デフォルトの名無しさん:2009/08/24(月) 23:56:41
複数の戻り値を返すとか?
outな引数使えばいいと思う
722デフォルトの名無しさん:2009/08/24(月) 23:57:32
>>719
Tuple!(int, int) f(int, int) { /**/ }

f(f(2, 3))
723デフォルトの名無しさん:2009/08/24(月) 23:58:03
>>721
outは型推論ができないから糞すぎる。
724デフォルトの名無しさん:2009/08/24(月) 23:59:11
引数にタプル取る関数があって何がうれしいの?
構造体でいいじゃんと思うのだけど…
725デフォルトの名無しさん:2009/08/25(火) 00:13:30
あれ?いつからenumの型名必須になったんだっけ?
これ全部直すのめんどくせーw
726デフォルトの名無しさん:2009/08/25(火) 00:19:50
必須ではないよ。今でも無名構造体は存在する
727デフォルトの名無しさん:2009/08/25(火) 00:44:00
newで作る配列の中身を初期化しない = void的な指定の仕方が思い出せない

>>725
D2ならわりと初期のころから
引数の型が特定のenumなら、その型に当たる部分は型名省略してもいいだろうと以前から話題には上るし、
07のウォルたんの公演でもやりたいと言っていたが、流れ続けて現在に至る
728デフォルトの名無しさん:2009/08/25(火) 00:44:59
out引数は
extern(C) void hoge(int *n);

extern(C) void hoge(out int n);
と書くためにある
729デフォルトの名無しさん:2009/08/25(火) 01:20:34
DFL更新されました
dmd2.031対応
730デフォルトの名無しさん:2009/08/25(火) 10:33:28
おお!
731デフォルトの名無しさん:2009/08/25(火) 10:39:25
見当たらないんだが?
732デフォルトの名無しさん:2009/08/25(火) 11:45:47
つ trunk
733デフォルトの名無しさん:2009/08/25(火) 14:49:04
あった
734デフォルトの名無しさん:2009/08/25(火) 16:22:47
下記のソースはなぜ文字列を出力しないのだろう?
int main()
{
ubyte[] ary;

ubyte[] pico( ubyte[] sage ) { return sage = cast(ubyte[])"sage"; }
void fuga( ubyte[] sage ) { sage = pico( sage ); }

ary.length = 4;
fuga( ary );
writefln( "output: %s", cast(string)ary );

// 入力待ち
readln();

return 0;
}
/* 実行結果
* output:
*/
735デフォルトの名無しさん:2009/08/25(火) 16:24:56
動かしてないけど、たぶん inout がないからだと思う
736735:2009/08/25(火) 16:27:23
fuga関数の引数部分ね
737デフォルトの名無しさん:2009/08/25(火) 16:27:54
>>735
fuga関数にinoutを追加したら動きました!
今日一日悩んでたので感謝^^
738デフォルトの名無しさん:2009/08/25(火) 16:31:29
なんでそんなきもいことしてんの?
739デフォルトの名無しさん:2009/08/25(火) 16:37:42
>>738
いや〜、セーブデータを作るモジュールを作っていて詰まったのですよ(;^^
740デフォルトの名無しさん:2009/08/25(火) 16:51:21
andrei曰くDでは void main() {} 推奨とのこと
741デフォルトの名無しさん:2009/08/25(火) 16:53:30
すこしはconst-correctness意識すべき
742デフォルトの名無しさん:2009/08/25(火) 16:56:46
待て
inoutじゃなくてrefだ
743デフォルトの名無しさん:2009/08/25(火) 16:57:58
>> 740
そうなんですか? 知りませんでしたorz

>> 742
ぇ..
744デフォルトの名無しさん:2009/08/25(火) 17:00:33
inoutは古い仕様なのでrefにして
あと >> とレス番は離さないで
745デフォルトの名無しさん:2009/08/25(火) 17:01:28
>>744
すみません・・
焦っていたもので(;^^

resに変えておきます。
746745:2009/08/25(火) 17:02:23
また間違えた。。
refですね(;--
747デフォルトの名無しさん:2009/08/25(火) 17:05:18
関数の引数はデフォルトで in に・・・
ウォルたんなら・・・ウォルたんなら・・・やってくれる(はず)
748デフォルトの名無しさん:2009/08/25(火) 17:26:09
>>747
あほかw
そんなことしたらinじゃない普通の引数を表すキーワードが必要になるだろうが。
749デフォルトの名無しさん:2009/08/25(火) 19:00:31
普通のはなくすってことだよ
750デフォルトの名無しさん:2009/08/25(火) 19:53:43
>>749
その方がいいかも知れんね。それこそ >>734 みたいな直観的じゃないことがたまにあるし。
void hige( ubyte[] fuke ) { fuke.length = fuke.length + 64; }
こういうのとか。
751デフォルトの名無しさん:2009/08/25(火) 20:49:04
確かによく考えたら無意味だよなあ
まあswitchがそのまんま残ってるくらいだから無くならないだろうけど
752デフォルトの名無しさん:2009/08/25(火) 22:15:40
同じ関数名、同じ型の引数で返り値の型のみ違う関数って作れますか?
753デフォルトの名無しさん:2009/08/25(火) 22:26:12
出来ないはず
たとえばコンパイラが返り値の受け手がいない関数の処理をどうしたらいいか考えてみると分かりやすい
754デフォルトの名無しさん:2009/08/25(火) 22:27:40
>>752
テンプレート関数でいいなら。
T func(T)(){
static if (is(T==int)){return 0;}else{return 1.0;}
}
755デフォルトの名無しさん:2009/08/25(火) 23:24:56
interfaceだけ実行時型情報がとれないとかどうなってるんだ
少なくとも、この挙動が正しいならプロパティ名を分けないと分からん

interface I {}
class C : I {}
class D : C {}

void o(in Object obj) { writeln(obj.classinfo.name); }
void i(in I obj) { writeln(obj.classinfo.name); }
void c(in C obj) { writeln(obj.classinfo.name); }

void main() {
auto d = new D;
o(d); // classname D
i(d); // classname I
c(d); // classname D
}
756デフォルトの名無しさん:2009/08/25(火) 23:30:34
>>755 それはバグっぽいなあ
757デフォルトの名無しさん:2009/08/26(水) 00:06:40
関数の引数にしたが、とりあえずインターフェースの参照ならなんでもこうなるようだ
とりあえずリポートしておいた
758デフォルトの名無しさん:2009/08/26(水) 00:08:24
void i(in I obj) {writeln((cast(Object)obj).classinfo.name); }
たぶんIUnknownとかCOMなんかの関係があってObjectにcastできないと実行時型情報が取り出せないんじゃないかと予想
759デフォルトの名無しさん:2009/08/26(水) 00:09:46
標準ライブラリでもたまに
template Te(T) if (is (T : Object)) { ... }
とか見かける
interfaceはいらない子ですか?
760デフォルトの名無しさん:2009/08/26(水) 07:40:00
正しそうなのにどうしてダメなんでしょうか
import std.stdio;
interface I {
 void a() const;
}
class C : I {
 override void a(){} const
}
void main()
{
 void i(in I obj) {
  writeln((cast(Object)obj).classinfo.name);
  obj.a();
 }
 void c(in C obj) {
  writeln(obj.classinfo.name);
  obj.a();
 }
 i(new C);
 c(new C);
}
main.d(6): Error: function main.C.a of type void() overrides but is not covariant with main.I.a of type const void()
main.d(6): Error: function main.C.a does not override any function
761デフォルトの名無しさん:2009/08/26(水) 08:08:33
あ ごめん const の場所だね
762デフォルトの名無しさん:2009/08/26(水) 08:38:13
引数が全部inだとクラスのconst関数しか呼び出せなくて困るからダメなんだな
763デフォルトの名無しさん:2009/08/26(水) 09:01:51
void a(in C c)
{
}
764デフォルトの名無しさん:2009/08/26(水) 09:02:54
ごめミス
765デフォルトの名無しさん:2009/08/26(水) 22:34:38
inが普通の変数宣言のときもconst scopeで有効になったらタイプ数減っていいなあ
766デフォルトの名無しさん:2009/08/26(水) 22:40:21
オー、ノー!
俺が一番嫌いな言葉はsynchronizedで二番目がimmutableなんだぜー!
767デフォルトの名無しさん:2009/08/26(水) 23:38:57
ジョセフ乙
768デフォルトの名無しさん:2009/08/27(木) 01:37:27
inとか見て思ったんだけどいつかは既存の string toString() が
const string toString() に大変身するの?
769デフォルトの名無しさん:2009/08/27(木) 02:00:12
やったことがなかったがC++と同様にconst メンバと非constメンバをオーバーロードできる
また >>762 のことにより非const関数も別に必要なので
string toString(); と const string toString(); の両方になるべきだと思う
770デフォルトの名無しさん:2009/08/27(木) 02:04:32
toStringでインスタンスの中身書き換えられたり、constと非constで挙動が違うってのも困るから、
const string toString() がいいとおもう。
>>762 に関しては ref 使えばいいのでは?
771デフォルトの名無しさん:2009/08/27(木) 02:06:55
元々参照なのにいちいちref付けるのもどうかと思ったけど
書いてみたらさほど手間でもないかな?
772デフォルトの名無しさん:2009/08/27(木) 02:08:54
stack overflowになるんですけど・・・
import std.stdio;
class A {
 override string toString() {
  return "A";
 }
 override string toString() const
 {
  return "const(A)";
 }
}
void main() {
 auto a = new A;
 writeln(a.toString());
 const ca = new A;
 writeln(ca.toString());
}
773デフォルトの名無しさん:2009/08/27(木) 02:10:25
あれ?じゃなくてobject.Error: Access Violationか
なんでだ
774デフォルトの名無しさん:2009/08/27(木) 02:27:24
>>771 immutable string toString()はどうする
775デフォルトの名無しさん:2009/08/27(木) 02:28:08
間違った >>774>>770
776770:2009/08/27(木) 03:04:33
>>774
個人的には、少なくともObjectクラスのメンバ関数としてはいらないと思うなぁ
そもそもimmutableメンバ関数ってどういう時に使うと便利なものなの?
777デフォルトの名無しさん:2009/08/27(木) 04:38:19
>>776
static関数だとimmutableにしたりすることはある。なんらかのIDつけるときとか。
インスタンスでそういうケースもないことはないかなという気はする。
778デフォルトの名無しさん:2009/08/27(木) 07:18:53
>>772
コンパイルできちゃう所に痺れる
779770:2009/08/27(木) 12:09:38
>>777
一応、mutableなインスタンスでは実行できず、imutableなインスタンスなら実行可能なメンバ関数というものではあるらしい。
auto a = new A;
immutable b = cast(immutable)a;
a.immutableMemberFunction(); //NG
b.immutableMemberFunction(); //OK
つまり、immutableメンバ関数外からは絶対にメンバ変数が変更されないという保証がなされる。
ということは、関数内部でメンバに対してmutexロックなど排他制御をする必要がなくなる…という意味では価値があるかもしれない。
けど、だとしたら逆にいえば普通のメンバ関数とかconstメンバ関数内では、メンバ変数にアクセスする際には
必ず排他制御を行わなきゃいけないということになる。
だけどそれは、パフォーマンス的にあまり現実的とはいえず、普通はやらないので、
やっぱりimmutableメンバ関数の有用性には疑問が残る。
780pmlynzZPUThDtKP:2009/08/27(木) 12:19:46
<a href="http://artemis2.wackwall.com/post/postId/12925/">greek gods artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12927/">pictures of artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12929/">email artemis cosmetics mumbai</a>
<a href="http://artemis2.wackwall.com/post/postId/12930/">artemis goddess of the hunt</a>
<a href="http://artemis2.wackwall.com/post/postId/12931/">artemis and the stag</a>
<a href="http://artemis2.wackwall.com/post/postId/12934/">artemis nightshade</a>
<a href="http://artemis2.wackwall.com/post/postId/12936/">artemis dog food</a>
<a href="http://artemis2.wackwall.com/post/postId/12938/">artemis the goddess of hunt</a>
<a href="http://artemis2.wackwall.com/post/postId/12940/">remove generic artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12942/">symbol of artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12943/">artemis myth</a>
<a href="http://artemis2.wackwall.com/post/postId/12945/">artemis - greek mythology</a>
<a href="http://artemis2.wackwall.com/post/postId/12947/">artemis cat food</a>
<a href="http://artemis2.wackwall.com/post/postId/12948/">artemis orthia</a>
<a href="http://artemis2.wackwall.com/post/postId/12950/">artemis symbol</a>
<a href="http://artemis2.wackwall.com/post/postId/12952/">tragic love story artemis</a>
781デフォルトの名無しさん:2009/08/27(木) 12:40:45
castせずこうしてね
auto a = new immutable(A);
782770:2009/08/27(木) 15:32:30
>>781
import std.stdio;
import std.contracts;
class A {
    int i = 0;
    immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
}
void main() {
    auto a = new A;
    a.i = 100;
    immutable b = cast(immutable)a;
    a = null;
    b.immutableMemberFunction();
}
こういう場合があるため、それは不適当と判断しました。
783770:2009/08/27(木) 15:41:53
assumeUniqueを使おうとして import std.contracts; したはいいけど配列しか対応していない
ことに絶望したのは言うまでもない。
………なぜだ…。
784デフォルトの名無しさん:2009/08/27(木) 16:16:35
>>782
キャストしたらimmutable性を自分で保証しなければならず
なくなったり書き換えられたりしたら未定義動作なのですが
これはそのケースになりませんか?
ttp://www.kmonos.net/alang/d/2.0/const3.html
> しかし、だからといって、データを書き換えられるようになるわけではありません:
>*q = 3; // コンパイルは通るが、未定義動作

それはともかくこうするとキャストいらないですよ
import std.stdio;
import std.contracts;
class A {
 int i = 0;
 immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
 this(){}
 this(A other) {
  i = other.i;
 }
}
void main() {
 auto a = new A;
 a.i = 100;
 auto b = new immutable(A)(a);
 b.immutableMemberFunction();
}
785770:2009/08/27(木) 16:57:19
>>782
値を変更した後にimmutableにキャストし、a = null;でimmutable性を保証しているため、
その未定義動作には当てはまらないと思いますが…(assumeUniqueの仕様例と実装を見る限り)
そのコードはいいかも、と思ったけど、以下のように継承に対応することができないのでは?
import std.stdio;
class A {
    int i = 0;
    immutable void immutableMemberFunction() { writeln("A: i=", i); }
    this(){}
    this(A other) { i = other.i; }
}
class B: A {
    int j = 0;
    this(){}
    override immutable void immutableMemberFunction() { writeln("B: i=", i, ", j=", j); }
}
void main() {
    auto a = new B;
    a.i = 1; a.j = 2;
    immutable A b = cast(immutable)a;
    immutable A c = new immutable(A)(a);
    a = null;
    b.immutableMemberFunction();
    c.immutableMemberFunction();
}
786デフォルトの名無しさん:2009/08/27(木) 17:12:20
>値を変更した後にimmutableにキャストし、a = null;でimmutable性を保証しているため、
あーなるほど確かに
下のコードはぱっと見ではわからないので後で見ます
787デフォルトの名無しさん:2009/08/27(木) 17:16:28
非immutableメンバ関数内で排他制御をしなきゃならん、じゃなくて、
メンバ関数を呼び出す側が排他制御をする必要があるかどうか判断できる、
ということのような気がする。
788デフォルトの名無しさん:2009/08/27(木) 17:50:48
読みました
immutable A b = cast(immutable)a;//これはcast(immutable(B))aです
immutable A c = new immutable(A)(a);//こっちはスライスされます
こうしましょう
immutable A c = new immutable(B)(a);
789デフォルトの名無しさん:2009/08/27(木) 18:24:47
>>787
確かにその通りですね。ただ、それはimmutableなインスタンスの有用性であって、
immutableメンバ関数の有用性ではない気がするのですが…
(immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
ではimmutableメンバ関数が有用なのはどんな時?)

>>788
もはや自分が何を言いたかったのか忘れてきたけど、何かそれは元も子もない何かを感じる
immutableなインスタンスを作る時にいつもそれができるとは限らないし…
790788:2009/08/27(木) 18:36:31
>>789
僕はキャストを使わなくてすむ方法があるのだから
そっちの方がいいなーということくらいしかないですw
791デフォルトの名無しさん:2009/08/27(木) 18:55:24
>>789
> (immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
> ではimmutableメンバ関数が有用なのはどんな時?)
>782のような場合にimmutableにキャストし忘れた場合にはエラーになるけれど、
関数をimmutableと修飾しておかない場合、エラーにできなくなるような気がする。
792770:2009/08/27(木) 19:23:21
>>791
もう値が変更されなくなった後でないと使うことが許されないメンバ関数…ってことか?
終了処理後でなければ実行することができないと明示するための宣言として利用できるということかな?
Hash計算クラスの、終了処理後でないと計算結果が出せない…みたいな。
793デフォルトの名無しさん:2009/08/27(木) 19:58:10
immutableがゲシュタルト崩壊してきた
794デフォルトの名無しさん:2009/08/27(木) 20:43:45
なんでimmutableなんてものを作った
795デフォルトの名無しさん:2009/08/28(金) 00:32:57
マルチスレッドで他の言語を圧倒しようという目論見
796デフォルトの名無しさん:2009/08/28(金) 00:42:50
std.xml の1947行目あたりで空要素タグの属性が消えちゃうっぽいんだけど、
これってxmlの仕様だっけ?(dmd2.031)
797デフォルトの名無しさん:2009/08/28(金) 00:46:35
XHTMLにおけるimgタグのsrc属性が不正ではないかという質問と同義。愚問だな。
798デフォルトの名無しさん:2009/08/28(金) 07:17:17
つまり仕様的には問題なくて、単にライブラリのバグってこと?わかりにくい物言いするね。
799デフォルトの名無しさん:2009/08/28(金) 07:28:35
それより日本語が入ってるとstd.xml.checkがエラーになる問題をだなぁ
800デフォルトの名無しさん:2009/08/28(金) 14:53:02
DMD2.0系に対応したSDLのポーティングって存在しないのかな。
801デフォルトの名無しさん:2009/08/28(金) 15:32:47
>>798
ごめん、愚問だなって言ってみたかっただけでした、すみません。バグだと思います。
auto doc = new Document(`
    <html><head></head><body><img src="aaa"/></body></html>`);
assert(doc.elements[1].elements[0].tag.attr["src"] == "aaa");// Range violation
こういうことだよね?
802デフォルトの名無しさん:2009/08/28(金) 16:57:46
>>800
ttp://shinh.skr.jp/d/
bit→boolで一応通ったけど。
803デフォルトの名無しさん:2009/08/28(金) 18:07:05
>>802
おお、通った。ありがとう!
804デフォルトの名無しさん:2009/08/28(金) 20:23:14
SDL1.3まだー
SDLにIMサポートさえ入ればGUIライブラリを捨てられる
805796:2009/08/28(金) 23:27:39
>>797 >>798
やっぱバグですよね。すっきりした。

>> 801
そうです。

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

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

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

ちなみにハッシュタグは、うぉるたんが #d_lang を使ってるけど、
いま検索すると出てくるのは日本人ばっかりw
826デフォルトの名無しさん:2009/09/03(木) 17:54:27
D 2.032 きてた
827デフォルトの名無しさん:2009/09/03(木) 18:02:41
>CTFE error messages now explain why the function could not be interpreted at compile time
キタ━━━━━━━━(゚∀゚)━━━━━━━━━!!!
828デフォルトの名無しさん:2009/09/03(木) 18:05:01
>synchronized member functions now implicitly typed as shared.
これはどういうこっちゃ?
829デフォルトの名無しさん:2009/09/03(木) 18:22:35
CTFE系うごかねぇwwww
830デフォルトの名無しさん:2009/09/03(木) 18:43:57
Nested functions can now be used in CTFE
これは動くね
831デフォルトの名無しさん: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
832796:2009/09/03(木) 22:42:38
>2.032
なおったー!
833デフォルトの名無しさん:2009/09/04(金) 11:26:54
toで死んだwwwたすけてwww
834デフォルトの名無しさん:2009/09/04(金) 11:50:06
コードは
835デフォルトの名無しさん:2009/09/04(金) 12:28:18
version(Windows) std.path.joinのバグ直してくれたよ
次の更新か最新のtrunkで
836デフォルトの名無しさん:2009/09/04(金) 12:49:30
簡単なバグは今「直してちょ」と伝えるチャンス
特にphobos
なんかあったらissue numberください
837デフォルトの名無しさん:2009/09/04(金) 15:18:27
toで死ぬとか・・・俺には恐ろしすぎて触れない
838デフォルトの名無しさん:2009/09/04(金) 15:21:52
昆布に毒でも入ったのか?
839デフォルトの名無しさん: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

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

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

>>840
toというよりコンパイル時の評価順にに変更があるみたい
循環参照があるソースコード全滅 orz
843デフォルトの名無しさん:2009/09/04(金) 23:11:39
>>842
評価順に依存してるコードに問題があるのか?
844デフォルトの名無しさん:2009/09/05(土) 00:11:16
dsssでビルドすると破綻するくらい入り組んだ使い方してる俺の出番だな
845デフォルトの名無しさん:2009/09/05(土) 00:22:33
>>843
ごめん。std.conv.toは中身が書き換わってた
以前2.031の段階でroundToにimmutable/constなものが通らないのでstd.traits使って書き直しとけとITSにレポートしておいたのだが、
Andreiがついでにいろいろ書き直した結果こうなったっぽい
846デフォルトの名無しさん:2009/09/05(土) 00:32:14
ちなみにエラーの原因はstd.convの所定の行を含む関数見れば分かるので、
自分でデバッグしてITSにレポートするといいかと
847デフォルトの名無しさん:2009/09/05(土) 01:42:30
848デフォルトの名無しさん:2009/09/05(土) 13:45:03
次バージョン出るまで>>847で対応しまふ。d
849デフォルトの名無しさん:2009/09/05(土) 14:11:06
仕様安定したら一緒に遊んでみようと思ってるんだが
Dは相変わらず仕様コロコロリンっぽいな
850デフォルトの名無しさん:2009/09/05(土) 14:27:29
1.0系列があるじゃない
851デフォルトの名無しさん:2009/09/05(土) 14:53:19
いや、半年くらい前に1回破壊的変更があってTangoすら使えなくなることがあったし、
ついこの前の更新でも余裕で言語仕様に追加があった。
D1系が安定というのは迷信。バージョンごと固定しなきゃダメだ。
852デフォルトの名無しさん:2009/09/05(土) 15:00:35
そしてバージョン固有のバグに引っかかってにっちもさっちも行かなくなる
853デフォルトの名無しさん:2009/09/05(土) 16:39:27
>>842
> 循環参照があるソースコード全滅
これは致命的だなぁ…D1系ですらDFL死んでるし。
854デフォルトの名無しさん:2009/09/05(土) 17:16:52
ああやっぱりDFLが死んだのはそのせいか
importしてるはずのシンボルが未定義になってる
855デフォルトの名無しさん:2009/09/05(土) 17:49:11
>>854
循環参照するクラスたちをファイルを分けずにひとつにしてしまうと動くことがある。
これ自体はもっと以前からあるバグのようなのだが、評価順が変わって顕在化するようになった模様
http://d.puremagic.com/issues/show_bug.cgi?id=3286
856デフォルトの名無しさん: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
857856:2009/09/05(土) 20:07:34
すみません。エラーメッセージに割り込んで書いてしまいました。
858デフォルトの名無しさん:2009/09/05(土) 20:15:59
たぶんそれ正しいランタイムライブラリ(たぶんphobos.lib)がリンクされてないか、
今のコンパイラのバージョンのランタイムライブラリで一般のライブラリをコンパイルしてないかじゃないかな
とりあえず環境を一から構築してみるといいかも。
859デフォルトの名無しさん:2009/09/05(土) 23:52:21
>>858
あー情報後だしになって申し訳ないですが、DLLを作ろうとしていて、そこで問題があったっぽいです。
試しにDllMainを普通のmainにしたら、意味のわからないリンクエラーはなくなりました。
ありがとうございました。
860デフォルトの名無しさん:2009/09/06(日) 00:44:54
>>855
まあ多分この問題はすぐに解消されるだろ
と信じていよう
861デフォルトの名無しさん:2009/09/06(日) 00:55:09
-200年後-
862デフォルトの名無しさん:2009/09/06(日) 08:56:49
フラグたてんなw
863デフォルトの名無しさん:2009/09/07(月) 04:58:11
Dに#ifndefの代替手段って何かあったっけ?
ありそうでなかったような気がしてきたんだが…
864デフォルトの名無しさん:2009/09/07(月) 05:32:12
static if (!(HOGE)) { ... }

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

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

コンパイル時のクラス定義時にはそのへんのプロパティは参照できず、
このfieldCountのような場合はちゃんとまともな値を返す、ってのが正しい動作かな?
873デフォルトの名無しさん:2009/09/08(火) 01:11:39
void f(const string s){}
ってsの型どうなんの?
874デフォルトの名無しさん:2009/09/08(火) 01:30:38
>>873
const(string) == const(immutable(char)[])
875デフォルトの名無しさん: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"になるのは何でなんだぜ?
876デフォルトの名無しさん:2009/09/08(火) 21:07:40
なにそれきもい
877デフォルトの名無しさん:2009/09/09(水) 00:48:39
>>875
テンプレイト以前にそもそも、En.A.stringof が En.A になるはずなのに
En になっちゃってるね。バグだと思う。報告よろ。
878デフォルトの名無しさん:2009/09/09(水) 07:30:10
よし、英語勉強してくる
879デフォルトの名無しさん: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);
  }
}
880デフォルトの名無しさん:2009/09/09(水) 14:18:32
ふつうに構築しろよww
881デフォルトの名無しさん:2009/09/09(水) 15:10:04
>>879
仕様によれば、scope変数の初期化にnew式を使う場合は、
クラスに限らずスタックに割り当てることになってるからバグだな。
報告しといてちょ
882デフォルトの名無しさん:2009/09/09(水) 15:30:19
>>879
ほう
そんなのあったのか
883デフォルトの名無しさん:2009/09/09(水) 16:44:53
>>879
よくしらべたなぁ・・・
884デフォルトの名無しさん:2009/09/09(水) 20:21:51
連想配列リテラルってなんで性的に使えないんだろ…
885デフォルトの名無しさん:2009/09/09(水) 21:29:55
16進数の文字列を整数に変換する関数ありますか?
886デフォルトの名無しさん:2009/09/09(水) 21:51:36
C++のboostのようにinclude(import)するだけで使えるライブラリを作りたいと思っています。
ライブラリ用のプロジェクトを作ってそこにソースを置いて、sc.iniのDFLAGSにパスを通したのですが、コンパイルはできてもリンクエラーが出てしまいます。
どうやればいいのでしょうか?
887デフォルトの名無しさん:2009/09/09(水) 21:57:45
>>885
なぜかないと思う
888デフォルトの名無しさん:2009/09/09(水) 22:00:37
>>885
そんなもんparse!int("0xffff")とかで…
できないね。変態度が足りん

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

となるとimportするだけで使えるライブラリって無理か
889デフォルトの名無しさん: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;
}
890デフォルトの名無しさん:2009/09/09(水) 22:06:23
>>886
#includeするだけで使えるライブラリ?
これの出番かw
mixin(import(filename.d"));
891デフォルトの名無しさん:2009/09/09(水) 22:14:27
>>890
見るからに邪悪すぎるwww
892デフォルトの名無しさん:2009/09/09(水) 22:23:33
>>886
ありとあらゆる関数をテンプレートにすればいいよ.
893デフォルトの名無しさん:2009/09/09(水) 22:27:04
とりあえず簡単なテンプレート関数だけのモジュールならimportだけで使えた。

なんかリンクする必要があるなら、ちゃっかりライブラリ側でpragma(lib,"foo.lib");とかやっちゃえばいい気がする。
894デフォルトの名無しさん: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!
}

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

>>888
C++のようにはいかないんですね。
>>890
それはちょっとw
>>892-893
なるほど。テンプレートだけならいけるんですね。
898デフォルトの名無しさん:2009/09/09(水) 23:53:57
自作したstaticライブラリにリンクしたら
Error: no object files to link
というエラーが出たんですが、これはどういう意味なのでしょうか?
899デフォルトの名無しさん:2009/09/10(木) 00:15:45
>>896
例外指向プログラミングときいて!
900デフォルトの名無しさん:2009/09/10(木) 00:30:18
>>899 そうだったのか
901デフォルトの名無しさん:2009/09/10(木) 02:07:19
>>894
左辺値から右辺値を推論って最近話題だよね
902デフォルトの名無しさん:2009/09/10(木) 07:35:41
>>889
parse!int("0xff")に統合して欲しいところだが
N進数文字列から数値への変換関数とどちらがいいか・・・?
toは数値からN進数文字列への変換関数としても使えるようだ
903デフォルトの名無しさん:2009/09/10(木) 13:49:03
baseを指定しなかった場合はプレフィックスから自動判別、
baseを指定した場合はプレフィックスでエラー

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

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

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

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

よく読むとこの辺の文法ツッコみ所満載だな
919デフォルトの名無しさん:2009/09/12(土) 01:30:31
>>918
ヒント: 字句解析と意味解析は別
920デフォルトの名無しさん:2009/09/12(土) 01:33:59
>>918
そのりくつはおかしい
http://www.kmonos.net/alang/d/2.0/lex.html
ここを読めばわかる
0_ は _ が無視されてただの 0 なので、整数リテラルの、Decimal
_._や_1._2は、 _ から始まるため、 Identifier
921デフォルトの名無しさん: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つとドットになるんだろうけど
922デフォルトの名無しさん:2009/09/12(土) 01:55:12
そんな感じの記述の齟齬は他にもなんかあった気がするな
923デフォルトの名無しさん:2009/09/12(土) 02:00:44
ひどいのだと
._e+_f
がFloatLiteralに適合してしまう
924デフォルトの名無しさん:2009/09/12(土) 03:36:01
Dの仕様のBNFはかなり適当だな。
実装を変えたのにドキュメントはそのままの箇所も結構あるし。
925920:2009/09/12(土) 03:54:05
>>921
確かにそのとおりだね。
報告よろしく
926デフォルトの名無しさん:2009/09/13(日) 13:40:19
結局、足りてない説明って
・リテラル先頭に'_'はおけない(Identifierになるから)
・DecimalDigits,HexDigits,OctalDigits,BinaryDigits は
 '_'以外の該当文字が必要('_'のみで構成されるのは不可)
って感じ?
(BNFでない説明も読めば、あまり勘違いしそうにないような
気もするけど)
927デフォルトの名無しさん:2009/09/13(日) 14:14:22
._0 とかどうしようもなくないか?
モジュールのスコープ解決演算子 '.' を使ってモジュール全体のスコープから_0というIdentifierを探すのか、
0.0 という意味の double型の浮動小数点数リテラルなのか、
仕様を全部読んでもどっちが正しいのかわからないような。
928デフォルトの名無しさん:2009/09/13(日) 16:07:42
.0って書けてもさほど嬉しくないから._0はglobal identiferでいいだろ
929デフォルトの名無しさん:2009/09/13(日) 18:10:01
.1 は数字であって欲しいけど
._1 は数字であって欲しくないなあ
930デフォルトの名無しさん:2009/09/13(日) 18:35:26
スコープ解決された_1というIdentifierは表現できないってこと?
931デフォルトの名無しさん:2009/09/13(日) 18:54:48
>>930
あ?
932デフォルトの名無しさん:2009/09/13(日) 21:38:15
結論:ドキュメント直してください
933デフォルトの名無しさん:2009/09/13(日) 22:03:00
ちょっと待って何か思い出した

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

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

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

Dのクラスオブジェクトのデストラクタは、
Javaや.NETでいうファイナライザに相当するもの。
955デフォルトの名無しさん:2009/09/16(水) 03:58:28
C++のデストラクタのようなものが欲しいなら.NETでいうDisposeパターンを実装するしかない。
C++/CLIではDisposeメソッドのことをデストラクタと呼んでいるくらいだし。
956デフォルトの名無しさん:2009/09/17(木) 06:23:14
            /^l
     ,―-y'"'~"゙´  |   それ  るるいえ うがふなぐる ふたぐん
     ヽ  ´ ∀ `  ゙':
     ミ  .,/)   、/)    いあ    いあ
     ゙,   "'   ´''ミ   ハ,_,ハ    ハ,_,ハ
  ((  ミ       ;:'  ,:' ´∀`';  ,:' ´∀`';
      ';      彡  :: っ ,っ  :: っ ,っ
      (/~"゙''´~"U    ι''"゙''u   ι''"゙''u
957デフォルトの名無しさん:2009/09/17(木) 12:57:23
うぉるたー!
958デフォルトの名無しさん:2009/09/17(木) 20:48:54
配列演算が楽しくなってきたところで…

idouble[] arr = [1i, 2i, 3i, 4i];
arr[] += 3;

でエラー吐いた後dmd落ちた。
ちなみにdmd2.032ね

演算後に型が変化しないことを表明する白魔術探すか
959デフォルトの名無しさん:2009/09/17(木) 21:16:12
test.d

import std.stdio;
void test() {writeln("test");}
void main() {
test!(0, true, "AAAAAAAAA!")();
}


$ dmd -run test.d
test


(゚д゚)
960デフォルトの名無しさん:2009/09/17(木) 22:07:08
複素数はstd.complexに置き換えられるのだろうか?
961デフォルトの名無しさん:2009/09/17(木) 22:45:23
もうZ言語までいこうぜ
962デフォルトの名無しさん:2009/09/18(金) 01:52:36
>>960
それが実現したらなんていうか、言葉に出来ない気持ちだよね
963デフォルトの名無しさん:2009/09/18(金) 11:11:21
libcurlのバインディングで使い物になるやつ知りません?
964デフォルトの名無しさん:2009/09/18(金) 11:17:51
systemでcurlを起動してる俺に言われても
965デフォルトの名無しさん:2009/09/18(金) 20:42:39
char*からstringへの変換をstd.convのtoを使って書いたのですが、実行時に例外ConvErrorが投げられます。
原因を特定するために、convのソースを見てみたのですが、2979行のreturn to!T(cast(size_t) value, 16u);が分かりません。
この先は何行目を見ればいいのでしょうか?
966デフォルトの名無しさん:2009/09/18(金) 20:44:07
noopのscopeいいな。Dにも入れて欲しい
967デフォルトの名無しさん:2009/09/18(金) 20:51:20
どういう機能?
968デフォルトの名無しさん:2009/09/18(金) 20:52:25
import std.stdio;
void main()
{
write("Say hello : ");
string line = readln();
if (line == "hello")
writeln("Hi.");
else
writeln("Bye...");
}

これ何入力しても偽になるんだがヘルプミー
Ubuntuです
969デフォルトの名無しさん:2009/09/18(金) 20:55:49
>>968
hello^
970デフォルトの名無しさん:2009/09/18(金) 20:55:57
D
971デフォルトの名無しさん:2009/09/18(金) 21:02:10
>967
http://code.google.com/p/noop/wiki/PropositionForScopes
あるインターフェースを宣言したスコープの中で俺実装のものを使うようにする
というようなことができるらしい
アロケータを切り替えたりするのに使えないかなーと思ってる。
今はコンストラクタに渡したり型に入れたりいまいちすっきりしないと思ってたので
972デフォルトの名無しさん:2009/09/18(金) 21:02:13
typedef型をtoで文字列にしたり戻したりできないのな
というかtypedefの元の型を取る方法ってあるんだろうか
973デフォルトの名無しさん:2009/09/18(金) 21:05:05
>>968
つstd.string.chop(readln());
974デフォルトの名無しさん:2009/09/18(金) 21:18:37
>>969
^はなんだそ

>>973
できたサンクス
chopで改行文字取り除いてるってこと?
975デフォルトの名無しさん:2009/09/18(金) 21:21:26
>>969-970で一続きとみた
976デフォルトの名無しさん:2009/09/18(金) 21:24:42
>>972
static if(is(T X == typedef))
977デフォルトの名無しさん:2009/09/18(金) 21:28:43
>>965
L2700
978デフォルトの名無しさん:2009/09/18(金) 21:29:03
>>976
あなるほど再定義すればいいのか
Thx
979デフォルトの名無しさん:2009/09/18(金) 21:39:08
>>976 is 式ほどわけわからんもんもないなあw
980デフォルトの名無しさん:2009/09/19(土) 00:28:04
>>977
thx
見る場所を間違えていました。
981デフォルトの名無しさん:2009/09/19(土) 01:47:16
C言語でDLLを作ることによって拡張できるアプリケーションがあります。
これに対してD言語で作ったDLL(extern (C) export)で、下記の4つを試しました。

1、空の関数を呼び出す→何もおきない
2、例外を投げてキャッチしない→「不正な処理〜」とメッセージが出て落ちる
3、例外を投げて、投げた型でキャッチする→上と同じ
4、例外を投げて、Object型でキャッチする→何もメッセージが出ずに落ちる

3と4が謎です。
テストコードのexeを作って、そのまま実行なら落ちないんですが、
DLLにすること事によって例外の挙動が変わるのはどういうことなのでしょうか?
982デフォルトの名無しさん:2009/09/19(土) 01:58:08
例外はDLLを越えちゃいかんのでは?
DLLのインターフェースにする関数はnothrowな関数であるべきだと思う。extern(C)なら特に。
983デフォルトの名無しさん:2009/09/19(土) 02:28:05
>>982
DLL内の関数で投げて、その関数内でキャッチしてます。
3はキャッチできてなさそうだし、4はキャッチできてるならDLLの外には影響しないはず?と思うのですが謎です。
984デフォルトの名無しさん:2009/09/19(土) 11:12:26
キャッチ出来てない例外があるとは思わないのか
985デフォルトの名無しさん:2009/09/19(土) 13:03:54
>>984 の言うように取れてない例外があるか…
Objectをキャッチしても落ちると言うなら、何かしらのアクセス違反があるのかもしれない。
986デフォルトの名無しさん:2009/09/19(土) 13:50:57
>>981
丁度try-catchで止められない例外が出たわ

自分のは単にアクセス違反だったよ
デバッガで追うと意味不明なところで止まるから、
そこで使ってるグローバル変数を__gsharedでマークしたらとりあえず動いた

extern(C) exportの中はTLSにアクセスすることすら許されないんだろうか…
987デフォルトの名無しさん:2009/09/19(土) 15:36:26
>>984-986
class Exception {};
try{
  throw new Exception;
}
/*catch (Exception e) {}*/
catch (Object o) {}

関数の中身は簡単なテストコードです。
うーん、分からない。
988デフォルトの名無しさん:2009/09/19(土) 15:52:18
GC初期化されてなくてnewで死んでるとかはないか?
989デフォルトの名無しさん
>>988
どうやらそれっぽいです。
throw new Exception;

Exception x = new Exception;
に変えても同じ症状になりました。

どうもでした。