D言語 Part23

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語 D (D Programming Language) について語るスレッドです。
過去スレ、関連スレは >>2

■前スレ
http://pc12.2ch.net/test/read.cgi/tech/1245602321/

■本家
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/candcpp2d2 (C/C++に疲れた人のD言語2.0)
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://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)
ttp://dronten.googlepages.com/dscite (DSciTE ※404)
2デフォルトの名無しさん:2009/09/20(日) 19:48:51
過去スレ、関連スレ
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統合M28【Java/C/PHP/Ruby/Python/Perl】
http://pc12.2ch.net/test/read.cgi/tech/1247051216/

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/09/20(日) 19:50:55
>>1-2 テンプレ変更点
- "C/C++に疲れた人のD言語"のURL更新 (2.0のほうに)
- 関連スレ更新
4デフォルトの名無しさん:2009/09/20(日) 19:58:56
おはD
5デフォルトの名無しさん:2009/09/20(日) 22:49:20
>>1

うぉるたんかわいいようぉるたん
6デフォルトの名無しさん:2009/09/21(月) 03:29:32
7デフォルトの名無しさん:2009/09/21(月) 22:34:31
うぉるたん、誰かに似てるね。
8デフォルトの名無しさん:2009/09/22(火) 01:52:48
まあ誰にも似てないことはないだろう。
9デフォルトの名無しさん:2009/09/22(火) 20:50:01
前スレはまた人知れず落ちたのかw
10デフォルトの名無しさん:2009/09/22(火) 21:42:18
D2はいつα版じゃなくなるんだい?
11デフォルトの名無しさん:2009/09/22(火) 21:54:58
D3が出たときです
12デフォルトの名無しさん:2009/09/22(火) 22:39:51
今日は布教活動があったようだから少し賑わうかな
13デフォルトの名無しさん:2009/09/22(火) 22:47:47
>>12
布教活動って?
14デフォルトの名無しさん:2009/09/22(火) 23:50:01
会津大学でD言語布教イベントがあったらしい。
15デフォルトの名無しさん:2009/09/23(水) 00:19:30
16デフォルトの名無しさん:2009/09/23(水) 01:31:07
linux環境でflock使う方法はないのかな。
というかphobosのstd.fileでロックかけられないのかな。
17デフォルトの名無しさん:2009/09/23(水) 04:11:26
std.streamは?
18デフォルトの名無しさん:2009/09/23(水) 08:56:41
関係ないが
foeach(char[] s; din)
このchar[]がいまだにconst char[]あるいはstringにできなくて悶絶した
19デフォルトの名無しさん:2009/09/23(水) 09:00:55
そこに型書いたことなかったから気づかなかったな
20デフォルトの名無しさん:2009/09/23(水) 12:44:30
std.cstreamもrangeベースになるのかね
21デフォルトの名無しさん:2009/09/23(水) 17:27:05
std.cstreamってまだ生きてたの?
そのうち無かったことにされそう
22デフォルトの名無しさん:2009/09/23(水) 20:12:05
C++でいうfind_ifとかremove_ifみたいに叙述関数でユーザー定義型の
コンテナにいろいろしたいんだけど、bind2ndみたいに叙述関数に引数を
渡すにはどうしたらいいんだろう。
23デフォルトの名無しさん:2009/09/23(水) 20:16:33
http://www.kmonos.net/alang/d/2.0/phobos/std_bind.html
C++にも機能的に同等なbindが入って
bind1st, bind2ndあたりが非推奨になる予定なのも
覚えておくと良いよ。
24デフォルトの名無しさん:2009/09/23(水) 20:34:30
>>22 これくらいしかないのでは
import std.algorithm, std.stdio;
bool less(int x, int y){
return x < y;
}
void main() {
int[] a = [1,2,7,3,5,4,6];
auto r = filter!((int z){return less(z, 4);})(a);
foreach(e; r) write(e, ",");
}
25デフォルトの名無しさん:2009/09/23(水) 23:24:49
コマンドプロンプトからbudを実行するとエラーが発生します。
Error: 4invalid UTF-8 sequence

引数なしや-helpならエラーは出ないんですが、
ファイル名(存在しないファイル名であっても)を入力すると上記のエラーが出ます。
何が原因なのでしょうか?
26デフォルトの名無しさん:2009/09/23(水) 23:29:47
その件は何回か話題になったね。
・*.dファイルの中身にUTF-8意外の文字列が含まれている。→保存する際に文字コードを指定する
・環境変数に日本語が含まれている。→環境変数の書き換えが必要。
だったかね。対応は。
27デフォルトの名無しさん:2009/09/23(水) 23:36:30
いつも気になってるんだけど
>Error: 4invalid UTF-8 sequence
この4はなんなの?
28デフォルトの名無しさん:2009/09/23(水) 23:48:08
4番目のエラーってことじゃないの?知らんけど
29デフォルトの名無しさん:2009/09/24(木) 00:13:35
http://dusers.dip.jp/modules/forum/index.php?topic_id=32#post_id107
アンケートのお知らせです。お題は「D3になったら来てほしい機能は?」です。
締め切りまで残り1週間となりましたが投票数がさみしい状況となっています。
どうか皆様のご助力を頂けたらと思います。
30デフォルトの名無しさん:2009/09/24(木) 00:59:22
>>29
もっと早く告示すりゃ良かった予感
ところでこれってウォルたんに送る予定ある? 是非前回のように送ってほすぃ。
31デフォルトの名無しさん:2009/09/24(木) 03:21:38
>>26
レスthx
DのソースはUTF-8で保存、システムの環境変数のPathは日本語は含まれてない、
dmd2とdmのsc.iniをUTF-8で保存しなおして、もう一度やってみましたがエラー。
うーん、どこが間違っているのかな・・・。
budの引数に存在しないファイル名を渡しても同じエラーになるんですが、
これは環境変数の方でうまくいってないと見ていいんでしょうか?
32デフォルトの名無しさん:2009/09/24(木) 12:07:37
>>31
そんな経験ないけどなあ
budはpathさえ通っていれば動いてるし
33デフォルトの名無しさん:2009/09/24(木) 12:13:11
bom (ぼそ
34デフォルトの名無しさん:2009/09/24(木) 12:15:01
 lazy x = t;
と書いたら
 auto x() { return t; }
の意味になったりしないかな。
35デフォルトの名無しさん:2009/09/24(木) 13:02:32
下も文? だとしたら,
代入文を宣言文と見なすと何がメリットあるんですか?
36デフォルトの名無しさん:2009/09/24(木) 13:28:33
上は代入じゃなくて初期化だろう。
文法上はどちらも定義。
37デフォルトの名無しさん:2009/09/24(木) 20:31:05
前スレ落ちた事に今気付いた
38デフォルトの名無しさん:2009/09/24(木) 21:57:59
>>31
budもdsssも使わずに、dmdだけでやってみたら?
39デフォルトの名無しさん:2009/09/24(木) 22:07:06
>>32
引数なしでヘルプを表示するのは、エラーなくできるのでpathは通ってるとは思うのですが謎です。
>>38
今まで直接dmdを起動していました。
これなら問題なくコンパイルできます。
40デフォルトの名無しさん:2009/09/25(金) 20:37:06
>>39
なんだろね
ほんとにBOMなのかな
41デフォルトの名無しさん:2009/09/25(金) 21:03:26
ユーザー名が日本語
dmdを置いてあるパスに日本語が混じっている
ソースファイルを置いてあるパスに日本語が混じっている
環境変数(Path以外の)に日本語が混じっている
sc.iniに日本語が混じっている
…ここまで調べて原因が判らなかったら素直にレスポンスファイルかmakefile書いた方がいいんじゃないかな。
42デフォルトの名無しさん:2009/09/25(金) 21:42:28
スペース含むパスとかいまだにコマンドラインの敵だしな
43デフォルトの名無しさん:2009/09/25(金) 21:44:51
Fixed bug processing spaces in dmd's directory
でも一番新しい更新でdmdのパスにスペース含められるようになった(らしい)よ
44デフォルトの名無しさん:2009/09/25(金) 23:33:44
>>43
それもようやくだよなあw
何年越しだろう
45デフォルトの名無しさん:2009/09/26(土) 01:10:48
>>41
> ユーザー名が日本語
これが原因でした。
日本語のユーザー名は、PC使ってて度々問題になってるのにすっかり忘れていました。
ユーザー名に日本語使わなければよかった・・・。
46デフォルトの名無しさん:2009/09/26(土) 03:41:08
以下のような mixin を D1 でも使えないかな・・・。
mixin を書いたところの __FILE__ 情報とかが出力されて欲しいんだけど。
今はこのテンプレートを書いたファイルの名前が出てしまう。
D2 では使える?


template CompileMsg(string MSG)
{
 pragma(msg, __FILE__ ~ "(" ~ __LINE__.stringof[0..$-1] ~ "): " ~ MSG);
}
47デフォルトの名無しさん:2009/09/26(土) 04:30:28
template CompileMsg(string MSG, string FILE = __FILE__, LINE = __LINE__)
{
 pragma(msg, FILE ~ "(" ~ LINE.stringof[0..$-1] ~ "): " ~ MSG);
}
4846:2009/09/26(土) 06:25:04
>>47

D2 ならできるんかな。
D1 はムリだった。
49デフォルトの名無しさん:2009/09/26(土) 15:29:54
D言語で、自分自身の関数ポインタまたはデリゲートを返す関数って書けたっけ?
50デフォルトの名無しさん:2009/09/26(土) 15:46:53
関数名とかが明確に分かってるなら普通に書けばいいと思うけど
分からない場合ってあるのかな
5149:2009/09/26(土) 16:55:35
http://codepad.org/bitaKSKg
これをもっとスマートにできないかなぁということ。
52デフォルトの名無しさん:2009/09/26(土) 17:52:32
>>49
昔は出来た。ある時から出来なくなった。
5349:2009/09/26(土) 18:38:23
>>51
ああ、やっぱそうか。残念。なんか昔はできた気がしてたんだよな…
typedefかなんか使うんだったっけ?
何でできなくなったんだろ
54デフォルトの名無しさん:2009/09/26(土) 18:41:29
ミスった…スマン
×>>51 ○>>52
55デフォルトの名無しさん:2009/09/26(土) 18:43:23
>>53
昔使えたのが偶然だと思うよ。
使えなくなったのは型のsemanticが走る順序の変更とかの影響だと思う。
56デフォルトの名無しさん:2009/09/26(土) 19:38:25
いつの間にかstaticメソッドでtypeof(this)とか出来るようになっててビビったわ
57デフォルトの名無しさん:2009/09/26(土) 19:47:03
メソッドの外でもできたはずだからよくalias typeof(this) THIS;とかやってたな
58デフォルトの名無しさん:2009/09/26(土) 22:09:28
昔は typedef F(*F)(); ができた。
59デフォルトの名無しさん:2009/09/27(日) 03:25:35
import std.stdio;

typedef F function(int) G;
typedef G function(int) F;

F f(int x) {
writeln(x);
return cast(typeof(return))&f;
}

void main() {
f(1)(2)(3);
}
60デフォルトの名無しさん:2009/09/27(日) 03:26:27
alias F function(int) G;
typedef G function(int) F;

のほうがよかったかも。
6149:2009/09/27(日) 04:02:28
>>59にヒントを得た! サンクス

import std.stdio;
struct Func
{
    Func delegate() dg;
    alias dg this;
    Func opCall() { return dg(); }
}
void main()
{
    int a=0;
    Func fn1, fn2;
    fn1 = {a++; writefln("1 - %d", a); return fn2;};
    fn2 = {a++; writefln("2 - %d", a); return fn1;};
    Func fn = fn1;
    while (a < 10) fn = fn();
}
62デフォルトの名無しさん:2009/09/27(日) 14:38:15
budを使ってDLLを作る事ってできないんでしょうか?
簡単なサンプルで試してもみても、phobos.libやSNN.libでエラーが出てしまいます。
63デフォルトの名無しさん:2009/09/28(月) 00:32:24
テンプレートを本物のマクロのように使うアイデアを思いついた
今のDだと以下のような制限がある

map!("a < 2")(arr) //できる

int n = 2;
map!("a < n")(arr) //できない

テンプレートが使用された周りのシンボルを参照できない
→新しい予約語__OUTER__を導入する

// 名前は__SCOPE__とか__FRAME__とかでもいいかも
template map(string cmp, alias o=__OUTER__){ ... }

o.n か mixin("o." ~ "n") で mapが使われたスコープのnを参照できる
64デフォルトの名無しさん:2009/09/28(月) 00:33:39
さらに独自構文のように見えるテンプレートを定義するための構文

template loop(string code){
 ...
 alias loop = mixin(ResultCode); //mixin式をテンプレートの結果にできる
}

int sum;
loop!q{|x; 1...10|
 sum += x;
};
65デフォルトの名無しさん:2009/09/28(月) 00:43:26
なるほど
66デフォルトの名無しさん:2009/09/28(月) 02:20:33
macroで出来るようになったりして
67デフォルトの名無しさん:2009/09/28(月) 02:29:36
正直ここまでくると
Lispのコンパイラマクロと何が違うのか分からなくなってくる
68デフォルトの名無しさん:2009/09/28(月) 03:52:26
macroは構文木をがしがし弄れるようになる予定なんじゃないの
69デフォルトの名無しさん:2009/09/28(月) 05:14:01
ありがとうウォルターたん、ついにこの方法をとってくれた! (Leandro Lucarella)
http://www.dsource.org/projects/dmd/timeline

…まえからdmdのリポジトリなんて見れたっけ。
70デフォルトの名無しさん:2009/09/28(月) 05:20:10
確か、見れたけどリリースごとにしか更新されてなかった
71デフォルトの名無しさん:2009/09/28(月) 18:40:13
Changeset [197] by walter
implement contract inheritance
なにこれ
72デフォルトの名無しさん:2009/09/28(月) 18:50:00
多分、制約(関数のin/out)の継承。
73デフォルトの名無しさん:2009/09/28(月) 18:52:07
s/制約/契約/
74デフォルトの名無しさん:2009/09/28(月) 22:07:59
マルチスレッドで下記のようなことをやろうとして詰みましたorz
<pre>
class SubThread: Thread
{
alias void delegate() Proc;

private static
{
shared List!(Proc) m_queue;
}

static this() { m_queue = new shared(List!(Proc)); }
this() { super( &run ); }

private void run()
{
while( true )
{
if( m_queue.size > 0 )
{
m_queue.front();
m_queue.popFront();
}
}
}
}
</pre>

sharedって何なのでしょうか・・・
75デフォルトの名無しさん:2009/09/28(月) 23:08:51
これだけでは何とも…
Listの実装とかSubThreadで何をしようとしているのかが全く分からなくてエスパーできない。
やろうとしていることと、詰んだ時の状況を詳しく。
76デフォルトの名無しさん:2009/09/28(月) 23:22:58
>>75
えっと・・・とりあえずエラーはこんな感じでした。

D_thread.d(45): Error: function D_list.List!(void delegate()).List.size () is not callable using argument types ()
D_thread.d(47): Error: function D_list.List!(void delegate()).List.front () is not callable using argument types () shared
D_thread.d(48): Error: function D_list.List!(void delegate()).List.popFront () is not callable using argument types () shared

Listのsizeはデータの個数、frontは先頭のデータ、popFrontは先頭データ削除です。

やろうとしていることの詳細とまでは厳しいですが(汗)
SubThreadはメイン・スレッドと並行して走らせるスレッドでして、
ThreadManagerクラスによって実行が開始されます。
そしてm_queueにはメイン・スレッドと並行して処理したい関数を追加していくわけですが、
この追加関数はSubThreadに用意してThreadManagerから呼び出すつもりです。

解りにくくてすみません(;^^
77デフォルトの名無しさん:2009/09/28(月) 23:52:42
size, front, popFront関数がそれぞれshared関数でないため、
sharedオブジェクトから呼び出すことができない。
というエラーだな。
Dの型システムが、Listにマルチスレッドな場所からpushとかpopとかすると、
マルチスレッドに対応していない関数だから危険ですよ、と教えてくれている。
ttp://d.hatena.ne.jp/haru-s/20090925/1253864045
↑ここでそのエラー表示わからんという愚痴が見れて
ttp://dusers.dip.jp/modules/forum/index.php?topic_id=36#post_id118
↑ここでshared型とshared関数の関係についての愚痴が見れる

どうすればいいかは…スマンがよくわからない。

やりたいことは、ThreadPoolみたいなもんかな?
78デフォルトの名無しさん:2009/09/28(月) 23:59:24
auto a=new shared(A);
shared修飾オブジェクトaのメンバ関数は
getterをconst memberに
setterをsynchronized memberにしてみて
79デフォルトの名無しさん:2009/09/29(火) 00:08:52
>>77
ThreadPoolみたいなスレッドの再利用を考えたものの、
どうもcore.threadにそれらしい機能が見つからなかったので(;^^
仕方なくメイン・スレッドが動いている間は常に動いているようなスレッドを考えたわけです。

それにしても、Listをsharedに対応させれば今回の件は解決なのでしょうか・・・
80デフォルトの名無しさん:2009/09/29(火) 00:15:12
そんなわけありませんでしたorz
Listのメンバをsharedに変えたら大量にエラーが・・・
他の手を考えます。

回答ありがとうございました!
81デフォルトの名無しさん:2009/09/29(火) 00:27:07
まとめ
- List!(T)が同期未考慮だから、shared(List!(T))周りでエラーがでる
- List!(T)で同期考慮しろ。sharedメンバ関数やsynchronizedメンバ関数を使え
- もしくは使う側で同期考慮も可能。その場合はsharedの代わりに__gshared使え
82デフォルトの名無しさん:2009/09/29(火) 00:52:53
shared関数にすると、sharedオブジェクトからしか参照できなくなるから、
普通のオブジェクトにしたい時にpopとかpushとかできなくなる。
Listとは分けて新しく作った方がいいかも。
83デフォルトの名無しさん:2009/09/29(火) 00:54:11
たびたび失礼します(;^^
sharedから__gsharedに変えたら動いたのですが、
これじゃ複数のスレッドで共有するという目的は果たせませんか?

すみません、sharedとかよく解ってないもので・・・
84デフォルトの名無しさん:2009/09/29(火) 00:57:20
同期処理は自己責任で。
見落としがあって、1週間掛けて想定外のバグに悩まされても泣かないこと。
85デフォルトの名無しさん:2009/09/29(火) 01:06:59
>>82
そうですね。。。
同期を考慮した簡易リストクラスを作ることにしました。
86デフォルトの名無しさん:2009/09/29(火) 01:07:39
>>83
まずマルチスレッドの基礎を勉強した方が良い。
…でもD言語前提のはない悪寒。immutableとかsynchronizedとかはJava由来、mutexとかtlsとかCは由来、sharedは独自だから上手く学ぶのは難しいかもな。
87デフォルトの名無しさん:2009/09/29(火) 01:10:21
おとと
mutexとかtlsとかCは由来→mutexとかtlsとかはC由来
88デフォルトの名無しさん:2009/09/29(火) 01:31:46
>>86
ですねorz
思ってたよりマルチスレッドは敷居が高いようです。

shared以外は理解しているつもりなのですが、
sharedに関する情報が少ない・・・

とりあえず、__gsharedはなんか違うということが解りました(;^^
sharedで頑張ります。
89デフォルトの名無しさん:2009/09/29(火) 01:46:59
>>86に加えてここら辺まとめた記事があると良いかも
- Javaのwaitsetに当たるものの代替実装
- メモリバリアとアトミック命令
- リングバッファ、RCU、デッカーのアルゴリズム
- rwlock
- spin lock (adaptive lockより時代遅れ)
- adaptive lock (効率的な実装はスケジューラ依存(ロックを保持しているプロセスが他のcpuで動いてるかの情報が必要)なのでユーザー空間での実装は無理。preempt対応(ユーザー空間プログラムはpreemptなので)で仮想メモリにフラグを
置くようにしたadaptive lockのAPIをユーザー空間に提供しているOSがあるかは知らん)
90デフォルトの名無しさん:2009/09/29(火) 19:16:20
1. クラス内にネストした構造体を作る
2. ネストした構造体からクラスのメンバにアクセス

これがコンパイルエラーになるのが納得いかない
納得いかないけどドキュメント見るとネスト構造体を「関数内」に定義できるとしか書いてないんだよな…
91デフォルトの名無しさん:2009/09/29(火) 19:54:28
>>90
内部構造体は使う周囲のシンボルを
テンプレートのaliasに取るだけのテンプレート構造体らしい
どこで読んだか忘れたけどね…

内部クラスは外部クラスのインスタンスから生成するけど、
構造体は外のインスタンス特定できないから仕方ないんじゃね?

それとも
class Hoge
{
  class Huga { }
}

Hoge foo = new Hoge;
Huga bar = obj.new Huga;
みたいな構文が構造体用に存在するのかな?w

構造体を普通にクラスの中に書いたら、束縛されてる範囲がアレなだけで
同じファイルに書いた以上の意味はないんじゃね?
92デフォルトの名無しさん:2009/09/29(火) 20:11:13
>>91
なるほど、構造体のドキュメントの最後の方に書いてあったのはそれだったのね
微妙に不便…
93デフォルトの名無しさん:2009/09/29(火) 20:34:59
微妙に不便といえば
class C {
 A a = new A;
}
みたいなのはいつになったら出来るようになるんだろうか

コンストラクタに書けばいいじゃん、って事なんだろうけど
mixinして使うプロパティみたいなテンプレートを書いてると初期化の所で詰むんだよな
せめて
dynamic this() {
 a = new A;
}
とか書いとくとコンストラクタに自動で組み入れてくれるとか
94デフォルトの名無しさん:2009/09/29(火) 21:59:46
class C
{
    scope a = new A;
}
むしろこれがほしい
95デフォルトの名無しさん:2009/09/30(水) 17:16:18
>>82
スレッドセーフなライブラリに加えて,
スレッドアンセーフなライブラリも欲しいときは確かにあるかもしれないけど・・・
わざわざ同じ機能のものを両方提供しているメジャーなライブラリなんてあるんですかね
(boostとか他の言語のライブラリ含む)
96デフォルトの名無しさん:2009/09/30(水) 17:28:59
javaの方面では両方提供しているのもあったはず。具体的なのは出ないけど…
97デフォルトの名無しさん:2009/09/30(水) 17:53:29
>>96
そうなんだ
Dならスレッドセーフかアンセーフかを
コンパイル時に切り替えて使うようなクラスライブラリは簡単に作れそうだね
Dらしくなくてもいいならポリシー化してやればいいんだろうきっと
98デフォルトの名無しさん:2009/09/30(水) 18:33:08
どうせならGC使わないようにするための型とかも導入してほしいね
GC使わない関数からはGC使う関数を呼べなかったり、
GC使わないクラス内ではGC使うオブジェクトを変数に使えなかったり
99デフォルトの名無しさん:2009/09/30(水) 18:37:27
>>97
>コンパイル時に切り替えて
いや、利用側がそのクラス/構造体をマルチスレッド共有するかどうかによってスレッドセーフのを使うかアンセーフのを使うか選べるようにするのが正しいと思うが
そういやshared型からconst型への暗黙の変換ってあったっけか。今試せないので分からんが、これ無いときついと思う。
100デフォルトの名無しさん:2009/09/30(水) 18:51:47
>>99
なんできついの?
101デフォルトの名無しさん:2009/09/30(水) 19:09:02
>>100
tls・shared・immutableが同時に扱える型が無いと、全部対応させる関数の引数のconst shared/tlsもしくはshared/const分けが必要になり、表現力が狭まり複雑になるから。
んでその型の役目は(俺が何か見落としてない限り)constに負わせるのが実装的に一番良いと思うから。
102デフォルトの名無しさん:2009/09/30(水) 19:38:18
shared型からconst型に暗黙変換可能ってことは、const型がshared型と同じような特性を備えている必要があるってことだろ?
const関数はかならずスレッドセーフにしなければいけないってのもなぁ…
10399=101:2009/09/30(水) 19:55:34
>const関数はかならずスレッドセーフにしなければいけない
そんなことないはず。
スレッドセーフになってるものをスレッドセーフとして扱わない(shared→const)って話で。
10499=101:2009/09/30(水) 20:08:07
あやっぱダメか。コピーにロックかかる訳じゃないから。
どういう実装法が良いんだろ…。
105デフォルトの名無しさん:2009/09/30(水) 20:36:40
必要になった時点でインスタンスを作って以後はそのインスタンスを使う、
みたいな手法とconstは相性が悪い
というか両立不能
lazyフィールドとか出来ないかな
106>>95=>>97:2009/09/30(水) 21:30:40
>>101
class A
107>>95=>>97:2009/09/30(水) 21:48:24
ミスったorz
1つのたたき台としてだが・・・
下がスレッドセーフなのはsyncronizedのおかげなので
class A{
private int v;
public const int get() return v; }
public synchronized void set(int i) { v = i; }
}
auto a = new A;
a.set(999);//error
auto sa = new shared(A);
sa.set(999);// ok
shared型でなくてもsynchronized関数を呼び出せるようにする修飾子を加えるだけでいいはず
auto usa = new __threadUnsafe(A);
usa.set(999);// ok
108>>95=>>97:2009/09/30(水) 22:08:53
ていうかsynchronizedでオーバーロードできたから現状これでなんとかなりますね
import std.stdio;
class X
{
const int f() {
writeln("const int f()");
return 1;
}
void f(int i) {
writeln("void f(int i)");
}
synchronized void f(int i) { // synchronized でオーバーロード
writeln("synchronized void f(int i)");
}
}
void main()
{
auto b = new X;
b.f = 10;
int s = b.f;

auto a = new shared(X);
a.f = 10; // synchronized メンバが呼ばれる
int r = a.f;
}
実装を各関数で共有したい場合は
別にprotected/privateメンバ関数を用意して両方から呼び出せばいいでしょう
あとは >>101 が言うようにこれ以上の支援をどうするか
109デフォルトの名無しさん:2009/09/30(水) 22:17:11
引数の型ではなく修飾子でオーバーロードとか結構キモいな
110>>95=>>97:2009/09/30(水) 22:19:56
>>109
C++でもconst/非constメンバ関数で正しくオーバーロードしましょうって言うでしょう?
111デフォルトの名無しさん:2009/09/30(水) 22:20:34
>>109
でも、オーバーロード規則ではthisポインタの型が違うからオーバーロードできる、ってなるっぽいね。
112デフォルトの名無しさん:2009/09/30(水) 22:30:34
>>111
納得した
113デフォルトの名無しさん:2009/09/30(水) 23:20:45
オーバーロードはできるけど、オーバーライドはできるのかよくわからないね
>派生クラスの関数で、基底クラスの関数と名前と引数の同じものは、 基底の関数を上書きします
thisポインタも引数と考えるならsharedとかconstとかでオーバーライドできないはず…?(なのに実際はできる…バグ?)
114デフォルトの名無しさん:2009/09/30(水) 23:55:48
オーバーライドといえばabstractがついてないけどabstractメソッドが残ってるクラスで30分くらいハマった
is (typeof(new MyClass))がfalseになるせいだったんだけどそこを特定する手懸りがないから困る
115デフォルトの名無しさん:2009/10/01(木) 02:38:58
以前のアンケート「D3になったら来てほしい機能は?」の結果が出たのでお知らせします。
http://tinyurl.com/yc98z2e
1位(5票): リフレクション
1位(5票): フリー関数をメンバ関数のように使える機能
3位(4票): macro
4位(3票): メモリバリア&アトミック命令
5位(2票): 引数のenum名省略
5位(2票): D言語によるD言語の実装
5位(2票): ガベージコレクション使用選択
5位(2票): Windowsの標準出力のマルチバイト対応
9位(1票): ランタイムアセンブラ&コンパイラ
9位(1票): PEG用構文&コンパイラタイムコンパイラコンパイラ
9位(1票): Reactive Programming
9位(1票): std.typecons.Tuple相当をSML#のように使える機能
9位(1票): Multi-Return Function Call
9位(1票): 使いやすい&&わかりやすい構造体リテラル
9位(1票): 構造体のstatic opCallの撤廃
という結果となりました。
皆様のご協力感謝いたします。また、これら項目に関してより具体的な意見が出ましたら、
公式へのフィードバックも行おうかと考えています。

今月もアンケートがありますので、またよろしければご回答ください。
http://dusers.dip.jp/modules/forum/index.php?topic_id=37#post_id126
116デフォルトの名無しさん:2009/10/01(木) 05:09:52
また明日から無限に長いテープを前後に動かす仕事が始まるお
117デフォルトの名無しさん:2009/10/01(木) 08:30:07
constメンバ関数のconstは引数リストの後ろに書けるのに
synchronizedは書けない・・・なんでやねん
118デフォルトの名無しさん:2009/10/01(木) 08:54:10
>>115
しかしあまりにも票数が少なすぎる
119デフォルトの名無しさん:2009/10/01(木) 09:49:57
一人何票か入れてるのかな。
仮に一人二票で16人とするとこのスレずっと張り付いてる人数的に妥当な気もちょっとするw
120デフォルトの名無しさん:2009/10/01(木) 10:17:25
俺は別の項目に計5票入れたけど?w
121デフォルトの名無しさん:2009/10/01(木) 13:39:50
入れすぎだろw
122デフォルトの名無しさん:2009/10/01(木) 13:57:11
>>116
チューリングマシン乙
123デフォルトの名無しさん:2009/10/01(木) 19:24:08
そろそろ約束のときなのですが
124デフォルトの名無しさん:2009/10/01(木) 20:05:09
constじゃないメンバを参照するopApplyがコンテナクラスがconstな時は使えないので
コンテナがconstな時のopApplyも定義しようとしたらなんだか物凄い泥沼にはまった
int opApply(int delegate(ref C));
int opApply(int delegate(ref const C)) const;
だけで正常に動いてくれたのむ
125デフォルトの名無しさん:2009/10/02(金) 08:08:04
UTF-8の文字列をShift-JISに変換したいのですが、最も簡単な方法は何ですか?
126デフォルトの名無しさん:2009/10/02(金) 08:32:45
iconv
127デフォルトの名無しさん:2009/10/02(金) 09:28:50
>>126
http://www.gnu.org/software/libiconv/
これをDLして使う事になりますか?
D言語の標準にはないんですね。
128デフォルトの名無しさん:2009/10/02(金) 14:27:36
scope(exit)に登録して末尾呼び出ししても最適化はされない?というかできない?
129デフォルトの名無しさん:2009/10/02(金) 16:36:12
scope(exit)を処理するのはフロントエンドで
末尾呼び出し最適化をするのはバックエンドだから、
結果的に末尾コールになってたらジャンプに置き換えられると思う。

思うだけ。
130デフォルトの名無しさん:2009/10/02(金) 18:05:13
>>125
std.windows.charset.toMBSz()じゃダメなの?
131デフォルトの名無しさん:2009/10/02(金) 20:39:09
本当はstd.encodingにあるべきなんだろうけど無いんだよなぁ
132デフォルトの名無しさん:2009/10/02(金) 22:05:05
Public Domainみたいなライセンス形態をとっているiconvのような文字コード変換ライブラリってあるの?
ICUは著作権表示の必要があるっぽいし…
そういうのでないとPhobosには採り入れられないんじゃないかな?
133デフォルトの名無しさん:2009/10/03(土) 02:29:11
DIY!
134デフォルトの名無しさん:2009/10/03(土) 02:36:07
>>131-132
俺が前に書いたのがあるからstd.encodingのインターフェイスが確定したら投げてみるわ
135デフォルトの名無しさん:2009/10/03(土) 03:36:27
>>130
まさにこういうのが欲しかったです。
公式にドキュメントまでありますね。見落としてました。
136デフォルトの名無しさん:2009/10/03(土) 08:58:09
>>134
std.encodingは各自が拡張して使うもんなんじゃないかな?
phobosに投げても切りがないから一緒にしてくれないような気がして
137デフォルトの名無しさん:2009/10/03(土) 10:32:29
テキストを選択してCtrl+Alt+F5でコンパイルリンクランするAutoHotKeyスクリプト

^!F5::
Clipboard =
Send ^c
ClipWait 2
FileDelete C:\hoge\hoge.d
FileAppend %Clipboard%, C:\hoge\hoge.d
Run run.bat, C:\hoge
return

---- C:\hoge\run.bat
type hoge.d
nkf -w hoge.d > hogeutf.d
dmd -run hogeutf.d | nkf -s
pause
138デフォルトの名無しさん:2009/10/03(土) 11:59:44
>>136
「実用的」をキーワードにゴリ押ししてみるとか

そして「こっち英語圏だからイラネーヨ」とか言われる
139デフォルトの名無しさん:2009/10/03(土) 15:32:41
ライブラリの配布と導入で

テキストかishで配布
クリップボード経由で導入

というのを思いついた
140デフォルトの名無しさん:2009/10/03(土) 16:11:38
URLをD専用のインストーラに渡したら自動でインストールでいいような。
というかそれをさらに簡略化しようとするとdsssになるのでは
141デフォルトの名無しさん:2009/10/03(土) 16:19:12
婆さんや、dsssのアップデートはまだかいのう…
142デフォルトの名無しさん:2009/10/03(土) 22:26:05
import http://pc12.2ch.net/test/read.cgi/tech/1253443684/

これを組み込めば完璧だな
143デフォルトの名無しさん:2009/10/03(土) 22:35:53
dmdの前に一枚かませば今すぐにでも
144デフォルトの名無しさん:2009/10/04(日) 10:54:35
wgetとexecvpとsedを組み合わせるのか
こうなってくるとdmdには標準入力にも対応して欲しいな
145デフォルトの名無しさん:2009/10/04(日) 18:48:43
beta 1.048 and 2.033
http://www.dsource.org/projects/dmd/changeset/200

とのことだけど、俺には何が変わったのかさっぱりだ…
結局今月のリリースまで待つしか…
146デフォルトの名無しさん:2009/10/04(日) 23:52:23
>>145
D1で、オーバーロードされている関数のアドレスを取ったらエラーにする変更のようだ。
147デフォルトの名無しさん:2009/10/05(月) 03:47:37
>>144

dmd con
148デフォルトの名無しさん:2009/10/05(月) 12:59:16
>>145
PhobosのChangeLogの差分を見たほうが分かりやすい。
http://www.dsource.org/projects/phobos/changeset/1284
149デフォルトの名無しさん:2009/10/05(月) 13:48:05
>>148
なるほど、これは目からうろこだ。

PhobosがBoost 1.0 Lisenceになるとかあるけど、どういうライセンスなのか調べてもよくわからなかった。
Must be simple to read and understand.  とかなにこれ?
150デフォルトの名無しさん:2009/10/05(月) 15:07:19
151デフォルトの名無しさん:2009/10/05(月) 17:17:52
2.033出た。

「gdbでスタックトレイスが動くようになった」とあるけど、
私の環境ではそもそも行番号が取れないんだよ... orz
152デフォルトの名無しさん:2009/10/05(月) 17:39:49
153デフォルトの名無しさん:2009/10/05(月) 19:01:38
いつの間に 1-click install なんてもんがあったんだよ…
とりあえず2.033だ!ワーイ
154デフォルトの名無しさん:2009/10/05(月) 19:03:40
今回の更新は面白い更新はないっぽいか
sharedも放置だし、dflも使えないままだし…
循環参照してるようなimportがダメなのは仕様なのか?
155デフォルトの名無しさん:2009/10/05(月) 19:04:14
仕様だよ
156デフォルトの名無しさん:2009/10/05(月) 19:15:56
>>155
マジで?どこに書いてある?
157デフォルトの名無しさん:2009/10/05(月) 19:21:09
ダメなのはstatic this使ってるときだけじゃないの?
158デフォルトの名無しさん:2009/10/05(月) 19:52:07
循環importで果てしなく死んだ
159デフォルトの名無しさん:2009/10/05(月) 20:04:48
>>156 あれ?俺間違ってるっぽ?ごめんね
import宣言の循環(モジュールがお互いをimportしあう、循環依存)は、 どちらか一方が静的構築の不要なモジュールであれば、問題ありません。 双方とも静的構築が必要であった場合は、 実行時例外が発生します。
160デフォルトの名無しさん:2009/10/05(月) 20:08:06
循環しまくっててもスタックに収まるならいいじゃん、とテンプレート使いまくってると思う
161デフォルトの名無しさん:2009/10/05(月) 21:36:10
コンパイルの停止問題なんて無視www
162デフォルトの名無しさん:2009/10/05(月) 23:11:48
循環importはバグ持ち。
意味論解析が早すぎるのが原因。
関数のデフォルトパラメタで循環importに引っかかるとか罠だった

パッチあて作業はこちら参照
ttp://d.puremagic.com/issues/show_bug.cgi?id=3301
163デフォルトの名無しさん:2009/10/05(月) 23:24:30
>>162
有志によるパッチあて作業とかカッコイイw
164デフォルトの名無しさん:2009/10/05(月) 23:28:47
これはもしやみんなにもうちょっと綺麗な設計をさせようという
ウォルたんの心遣い
165デフォルトの名無しさん:2009/10/05(月) 23:32:40
循環参照を回避するだけなら難しくない。けど、美しくない。
166デフォルトの名無しさん:2009/10/05(月) 23:35:34
とりあえず次バージョンを待つわ
167デフォルトの名無しさん:2009/10/06(火) 00:08:35
循環参照って関数の後方参照と同じレベルでよく使うよな?
168デフォルトの名無しさん:2009/10/06(火) 00:15:25
>>167 確かにそうだが、俺はどちらもほとんど使わない派…
昔C++使ってたからか、気持ち悪く感じるんだよね…
169デフォルトの名無しさん:2009/10/06(火) 00:16:46
>>166
いつまでも待つことになるぞw
170デフォルトの名無しさん:2009/10/06(火) 00:20:17
バグ持ちなのは
× 循環参照
○ 循環import
171デフォルトの名無しさん:2009/10/06(火) 11:13:10
>>147
OSによっては動かないらしい
内部からdmdを呼ぶ標準入出力対応のdmd_con作るか
172デフォルトの名無しさん:2009/10/06(火) 15:29:59
char[] buf;
buf.length = 1000000; //1桁小さければエラーは発生しない

普通のexeなら問題ないのですが、DLLの場合、上記のコードは実行時に落ちます。
ここから考えられる原因は何でしょうか?
173デフォルトの名無しさん:2009/10/06(火) 18:00:21
OSの制限のような気がするけど知らない
174デフォルトの名無しさん:2009/10/06(火) 21:01:33
>>173
どうもです。
C++でこういう事が起きたことないんですが謎です。
ふと思ったのは、DLLのみエラーが発生するという事は、DllMainでの処理が問題なのか・・・?
175デフォルトの名無しさん:2009/10/06(火) 23:16:45
話はそれるけど、-covで使えるコードカバレッジの、出力されるファイルの名前とかパスって制御できないの?
176デフォルトの名無しさん:2009/10/07(水) 00:13:37
ソースをいじればいいんじゃね
177デフォルトの名無しさん:2009/10/07(水) 00:37:30
std.coversetDestDir
178177:2009/10/07(水) 00:38:49
訂正
std.cover.setDestDir
179デフォルトの名無しさん:2009/10/07(水) 03:07:31
昔はそれあったみたいだね…今は
dmd2\src\druntime\src\compiler\dmd\cover.d
あたりにそれらしきコードを発見
extern(C) dmd_coverSourcePath(string);
とかすればできるかも?(試してないけど)

パッケージ名が違ってモジュール名が同じ時って対処しようがないのかね。
…と思ってちょっと探したら同じファイルに臭いところが…
FILE* flst = fopen( (addExt( baseName( c.filename ), "lst\0" )).ptr, "wb" );
baseNameとか嫌な香りがぷんぷんするぜ…
180177:2009/10/07(水) 11:06:09
>>179
うわぁ、ちゃんと調べずに答えてしまって申し訳ない。
とりあえず頑張ってくれ。
181デフォルトの名無しさん:2009/10/07(水) 12:48:32
>>180
がんばった結果をご報告
試したのはTangoの方でだけど、ランタイムライブラリを書き換えることで動作を変えることができた。

char[] getCovFileName( char[] f )
{
auto fname = f.dup;
foreach (ref c; fname)
{
if (c == '\\') c = '.';
else if (c == '/') c = '.';
else if (c == ':') c = '.';
}
if (fname.length >= 2 &&
(fname[$-2..$] == ".d" || fname[$-2..$] == ".D") )
{
fname = fname[0..$-2];
}
return appendFN(dstpath, baseName(fname ~ ".lst")) ~ "\0";
}

こんな感じのをcover.dのどこかに加えて、static ~this()内で、
if( !readFile( getCovFileName( c.filename ), lstbuf ) )
とか、
FILE* flst = fopen( getCovFileName( c.filename ).ptr, "wb" );
という感じにlstファイルを扱うっぽい部分を書き換える。
驚くべきことに、こう書き変えない限りdmd_coverDestPathで指定した出力先のパスも無視されるみたいだ。
ちなみに、D2の方だと型がstringとかになるので、適宜castすると良いと思われ
182デフォルトの名無しさん:2009/10/07(水) 22:28:21
__FILE__や__LINE__をテンプレート引数に受け取ってstatic assertでメッセージにするとき
__LINE__をどうやったら簡潔に文字列にできますか?

できればstd.conv含め外部のシンボルをimportしたくないんですけど…
自前でprivateなitoaテンプレート書くのがベストですか?
183デフォルトの名無しさん:2009/10/07(水) 22:43:59
>>182
自前で書くしかないかと
184デフォルトの名無しさん:2009/10/07(水) 23:25:55
過去にそんなのを書いた人がいたような。
185デフォルトの名無しさん:2009/10/08(木) 01:39:16
>>182
std.metastrings? 使いたくないならしかたないけど
186デフォルトの名無しさん:2009/10/08(木) 04:35:58
.stringof は?
187デフォルトの名無しさん:2009/10/08(木) 07:07:19
"__LINE__"って出ると思う
188デフォルトの名無しさん:2009/10/08(木) 07:11:18
今ならCTFEもあるから簡単に書けると思うけど
189デフォルトの名無しさん:2009/10/08(木) 13:10:48
循環 import で dmd クラッシュする?
import をいじるとクラッシュしたりしなかったり・・・。
どれが循環してるか調べる方法があればいいんだけど。
190デフォルトの名無しさん:2009/10/08(木) 19:45:24
性的構築が必要なモジュールを循環インポートで実行時例外が出るのはまだいい
だがその例外でどこが循環してるのかわからないのはどういうことだ
191189:2009/10/08(木) 23:25:31
dmd1.047->1.048 の更新で
flectioned をインポートするとクラッシュするように
なってしまった。。。
ひとまず外しておくか。

だいぶ時間を無駄にしてしまった・・・。
192デフォルトの名無しさん:2009/10/08(木) 23:39:53
dmd1系を使ってるんだったら、Tangoの次のバージョンにスタックトレースが含まれるからそれを待った方がいいと思うよ。
svnのリポジトリではもう使えるようになってるみたい
193189:2009/10/09(金) 00:00:02
>>192
マジスカ。いいなぁ、Tango。

しかしもう Phobos 使いまくりで、
Phobos 無しでは生きて行けない体に・・・!
194デフォルトの名無しさん:2009/10/09(金) 00:13:29
D1のPhobosなら、Tango+Tangobos入れればそのまま動くんじゃない?
195189:2009/10/09(金) 00:21:05
>>194
なるほど、Tangobos 使ってひとまずスタックトレースのみ
利用してみればいいか。

見てみる。ありがd
196デフォルトの名無しさん:2009/10/09(金) 02:46:06
D2ユーザを救援してくれ・・・
197デフォルトの名無しさん:2009/10/10(土) 01:23:09
>>182
あったこれだ
http://codepad.org/OSyr9CVb
198デフォルトの名無しさん:2009/10/10(土) 01:32:25
任意のクラスのメソッドの中から特定の型を持つものだけを取り出してデリゲートを列挙したいのですが、いい方法はありますでしょうか。
199デフォルトの名無しさん:2009/10/10(土) 03:17:24
traitsとmixinを組み合わせればできないことはないだろう
200デフォルトの名無しさん:2009/10/10(土) 10:29:44
パスを指定する時、フォルダ名を区切るのに
Makefileは/でないとうまくいかない部分が、dmdは\でないとうまくいかない部分があるんですけど、
どっちかに統一して書く方法はないですかね?
201デフォルトの名無しさん:2009/10/10(土) 10:49:45
1. 諦める 2. \を受け入れるmakeを探す 3. DMDのパッチを書く
202デフォルトの名無しさん:2009/10/10(土) 11:43:20
関係ないけどstd.pathにパス区切りとかあるよね
ちゃんと使わないとなあ
203デフォルトの名無しさん:2009/10/10(土) 14:06:45
>>201
簡単には解決できないんですね。
\と/の問題とかスペースが含まれる時の問題とか日本語とか含まれる時の問題とか
こういうの嫌だなぁ。
204デフォルトの名無しさん:2009/10/10(土) 14:23:14
>>199
allMembersとかで関数の名前は取れるんだけど
それをmixinする事ってできる?
205デフォルトの名無しさん:2009/10/10(土) 14:45:48
>>200
俺は$(subst /,\,PATH)ってやってる。gmake。
206デフォルトの名無しさん:2009/10/10(土) 15:03:40
俺はrdmdで実行できる簡易ビルドツールをD言語で書いてる
207デフォルトの名無しさん:2009/10/10(土) 15:26:04
俺はmingw32-make使ってる
\区切りパスが普通に使える
208デフォルトの名無しさん:2009/10/10(土) 16:08:16
よーしパパmakeのためにCygwin入れちゃうぞー
209デフォルトの名無しさん:2009/10/10(土) 17:13:57
>>205-207
mingw32-makeを使っているので基本は\が使えるのですが、
$(wildcard $(dir)\*.d)
とやった時などに\じゃうまくいかないです。
こういう部分だけ/を使えば、まあなんとかなるのですが、\と/が混ざっているのがいつかハマりそうで気持ち悪いです。
210デフォルトの名無しさん:2009/10/11(日) 02:53:30
今頃気付いたんだが配列演算の演算子ってオーバーロードどうするんだ?
opDot使って配列に転送するとしたらキモすぎるんだけど…
これだと配列使ってないと転送もクソもないし…
最近マルチスレッド周りはsharedでこけまくるし…

うぉるたんなんとかしてくれー!
211デフォルトの名無しさん:2009/10/11(日) 11:11:27
可変個の文字列を渡して関数を生成するようなテンプレートって
書けますか?
例えば

mixin GenFuncs!("Hoge", "Huga", "Test");

ってやると

void HogeFunc(){}
void HugaFunc(){}
void TestFunc(){}

などと定義される感じです。
212211:2009/10/11(日) 11:16:23
上記のさらに先の意図としては、関数を使う際に

doFunc!("Hogee");

と書くとコンパイラさんに

HogeeFunc なんてねぇよ! HogeFunc, HugaFunc, TestFunc の
どれかを使ってくれ!

と手取り足取り教えてもらえるようにできないかなぁと
思ってます。
こうすると定義したソースをいちいち見に行かなくても
使える関数が分かるので楽かなと・・・。
213デフォルトの名無しさん:2009/10/11(日) 12:00:33
>>212
doFuncを特殊化(あるいは,static ifで分岐)するのじゃいかんの。
214211:2009/10/11(日) 12:15:10
>>213
そうですね、それでもいいんですが、出来れば一般化して
テンプレートとして定義できれば、ライブラリ化っぽく
できるかなぁと思ってまして。

テンプレートに文字列を複数渡せて、
それらを巡る static for みたいなのが使えれば
キレイに書けるんですが・・・。
215デフォルトの名無しさん:2009/10/11(日) 12:57:55
>>214
template GenFuncs(string f, Fs...) {
// define function f

mixin GenFuncs!Fs;
}
216デフォルトの名無しさん:2009/10/11(日) 13:00:54
forはなくても再帰で同等のことはできるだろう?
217デフォルトの名無しさん:2009/10/11(日) 14:01:58
でもstatic forは欲しいな
218デフォルトの名無しさん:2009/10/11(日) 14:22:37
static foreachはそのうち入るよ
219デフォルトの名無しさん:2009/10/11(日) 14:29:22
そう言い続けて一年くらい経ってるよね
220デフォルトの名無しさん:2009/10/11(日) 14:31:10
Dにはよくあること
221211:2009/10/11(日) 16:18:50
>>215

ありがとうございます!できました。
こんな感じ。

template GenFuncs(string N)
{
 mixin(` N を使って関数定義 `);
}

template GenFuncs(string N, Ns...)
{
 mixin GenFuncs!(N);
 mixin GenFuncs!(NS);
}
222デフォルトの名無しさん:2009/10/11(日) 16:24:00
でペンコンは?
223デフォルトの名無しさん:2009/10/11(日) 16:25:45
誤爆しましたごめんなさい
224211:2009/10/11(日) 16:27:55
>>222

ペンコンならこんな感じです!

mixin GenFuncs!("Penkon");
225デフォルトの名無しさん:2009/10/11(日) 16:32:17
マジレスすんなw
226デフォルトの名無しさん:2009/10/11(日) 20:09:10
うーん、GCの仕組みがよく分からない。
extern (C) export void hoge(char* buffer)
こんな感じでCでアロケートされたメモリが渡された時、このメモリに対してGCは関与するのでしょうか?
227デフォルトの名無しさん:2009/10/11(日) 20:19:26
>>226
GC管理下の領域にそのポインタをコピーしたら、
そこから辿れる領域は使用中とマークされるんじゃないかな
228デフォルトの名無しさん:2009/10/11(日) 20:25:20
>>226
されない
229デフォルトの名無しさん:2009/10/11(日) 20:42:07
>Dでのポインタは、大きく分けて二種類に分類できます:
 一つは、 ガベージコレクタで管理されたメモリを指すもの、もう一つは、そうでないものです。
 後者の例としては、C の malloc() を呼んで作られたポインタや、 C のライブラリが返すポインタ、 あるいは静的データやスタックへのポインタなどがあります。
 これらのポインタに対しては、Cで合法な操作は全て実行できます。

Dでnewした=GCが割り当てた=GCが管理している。
それ以外=GCは関知しない。
のかな。
230デフォルトの名無しさん:2009/10/11(日) 20:45:46
>>229
そう。
231デフォルトの名無しさん:2009/10/11(日) 20:48:00
>>227-229
レスありがとうございます。

Dでnewしたメモリだけが対象という事なら分かりやすいですね。
232デフォルトの名無しさん:2009/10/12(月) 12:39:54
>>172でも質問したのですが、
DLL内で大きなメモリを確保しようとすると落ちます。
どうもトータルで1MBいったあたりで落ちるようです。
mallocを使えば1MB以上でも落ちません。
トータル1MBを超えるとGCが動作しだすというところが落ちる引き金になっている気がします。
exeの場合なら正常、DLLの場合に落ちるという事はDllMainでのGCの初期化がちゃんとできてないという事でしょうか?
http://www.kmonos.net/alang/d/2.0/dll.html
DllMainは、ここの最初の例をほぼそのままコピペしました(g_hInstの行を除く)。
どうすれば落ちなくなるのでしょうか?
233デフォルトの名無しさん:2009/10/12(月) 17:45:51
Version D 2.034 Oct 11, 2009
New/Changed Features

Bugs Fixed

* Bugzilla 258: Undefined identifier error for circular import
* Bugzilla 1140: ICE(cod1.c) casting last function parameter to 8 byte value
* Bugzilla 1592: dmd fail to resolve class symbol when i put files in a package
* Bugzilla 2687: ICE(statement.c): tuple foreach in an erroneous template.
* Bugzilla 2829: ICE(expression.c) static array block-initialized in struct literal
* Bugzilla 3006: ICE(e2ir.c, tocsym.c) template module using array operation
* Bugzilla 3041: Array slices can be compared to their element type: bad codegen or ICE
* Bugzilla 3042: Segfault on incorrect override
* Bugzilla 3101: Stack overflow: declaring aggregate member twice with static if
* Bugzilla 3119: Segfault(expression.c) template function overloads with function with same name in other module
* Bugzilla 3174: ICE(mtype.c): Compiler crash or compiler error with auto returns and const / immutable / invarient / pure
* Bugzilla 3176: Compiler hangs on poorly formed mixin in variadic template
* Bugzilla 3261: compiler crash with mixin and forward reference
* Bugzilla 3286: Default parameter prevents to resolve inter-module circular dependency
* Bugzilla 3301: Undefined identifier error dependent on order of imports when a circular import is involved
* Bugzilla 3325: ICE(func.c) function literal with post-contract
* Bugzilla 3343: Crash by "auto main(){}"
* Bugzilla 3344: ICE(e2ir.c) returning an invalid function from main()
* Bugzilla 3357: ICE(cod1.c) using 'in' with a static char array as AA key
* Bugzilla 3366: Segfault(declaration.c) variadic template with unmatched constraint
* Bugzilla 3374: [tdpl] ICE(init.c): Associative array type not inferred
234デフォルトの名無しさん:2009/10/12(月) 18:07:20
はやっ
235デフォルトの名無しさん:2009/10/12(月) 20:24:46
1.049 にしてコンパイルしてみた。
返り値が void の関数内で return true; してるところが
コンパイルエラーになった。
今まではなぜならなかった・・・!?
236デフォルトの名無しさん:2009/10/12(月) 20:30:48
てっきりそういう仕様なんだとばっかり…
237デフォルトの名無しさん:2009/10/12(月) 20:49:34
ダメだ…
循環importが死ぬ
238デフォルトの名無しさん:2009/10/12(月) 21:12:27
flectioned も死ぬ・・・
239デフォルトの名無しさん:2009/10/12(月) 21:18:26
久しぶりだなぁ。
240デフォルトの名無しさん:2009/10/12(月) 21:20:06
>>237
それってbugzilla登録してる?
241デフォルトの名無しさん:2009/10/13(火) 00:08:03
D2.0なんだけど、連装配列で構造体のキーがまともに動作しない...
なんか、opEquals も toHash も opCmp も呼ばれてない...

http://codepad.org/bGC0SSRB
242デフォルトの名無しさん:2009/10/13(火) 01:04:12
const hash_t toHash() にしたら呼ばれたよ。まぁ妥当かと。
243デフォルトの名無しさん:2009/10/13(火) 01:16:33
そのへんは集成体用のconcept的な何か待ちだな
foreach rangeのドキュメントには.next .retreatと書いてあるが、
動くのは.popFrontと.popBackだ
244デフォルトの名無しさん:2009/10/13(火) 01:32:35
>>237-240
下記バグのパッチが原因と思われる。
ttp://d.puremagic.com/issues/show_bug.cgi?id=3301

#258, #1592, #3286, #3301は直ってると聞くが、
かなり書き直したようなので、もうすこしバグ修正しないとだめそうね。
あそこのITSはbroken englishでもある程度大丈夫だから積極的に送るといい
コードとビルドログに片言で説明足しただけでもOK。
245デフォルトの名無しさん:2009/10/13(火) 08:16:46
dmd2.034じゃDFLが謎なところでエラーになりやがるorz
c:\d\dmd2\src\dfl\internal\winapi.d(2078): Error: long has no effect in expression (0)
enum: LRESULT
{
 TBDDRET_DEFAULT = 0, // <<<<<<<<<<<<<<<<<
 TBDDRET_NODEFAULT = 1,
 TBDDRET_TREATPRESSED = 2,
}
246241:2009/10/13(火) 10:18:50
>>242 thx

他のメソッドもいろいろ試してみたけど、結局こうしないといけないみたいだな

hash_t toHash() const
equals_t opEquals(ref const(X) rhs) const
int opCmp(ref const(X) rhs) const
247241:2009/10/13(火) 10:27:20
でもopEqualsは連想配列から呼ばれないんですね...
248デフォルトの名無しさん:2009/10/13(火) 14:58:36
import std.stdio;
import std.stream;
void main() {
  try
  {
    char[] buff;
    std.stream.File file = new std.stream.File("hoge.txt");
    buff.length = file.available();
    file.read(buff);
    file.close();
  }
  catch (Object e)
  {
    writeln(e.toString());
  }
  while(1)
  { }
}

これを実行すると

hoge.txtの中身が半角3文字までなら
std.stream.readException: not enough data in stream

hoge.txtの中身が半角4文字以上なら
object.Error: Access Violation

と出力されます。
どこが間違っているのでしょうか?
249デフォルトの名無しさん:2009/10/13(火) 16:54:10
確かStreamのchar[]の読み書きデータは
文字列の長さ(size_tのサイズ)のあとに実際の文字列が入るやつだから
前者はサイズ(おそらく4byte)がなくて読み込めず
後者は最初の4byteを読み込むべき文字列の長さと勘違いして膨大なデータを読もうとしてる
一度適当なファイルにfile.write("hoge");としてバイナリエディタで覗いてみるとわかりやすい
250デフォルトの名無しさん:2009/10/13(火) 17:35:07
>>249
なるほど。
シリアライズ/デシリアライズの処理も含まれているんですね。
ただのテキストファイルを読み込みたい時はstd.fileを使わないといけないんですね。。
251デフォルトの名無しさん:2009/10/13(火) 18:01:06
やり方が間違ってるだけ。

ubyte[1024] buff;
std.stream.File file = new std.stream.File("test.txt");
size_t sz;
char[] str;
while (!file.eof) str ~= buff[0..file.read(buff)];

こんな感じにしてシリアライズしないで読み込めばいい。(BOMなしUTF8を読み込む場合は。)
BOMはEndianStream通すんだったか?
あとavailableはバッファ使うときじゃなかったかな?
252デフォルトの名無しさん:2009/10/13(火) 18:14:46
>>251
なるほど。
read(ubyte[] buffer)は仕様が違うんですね。
253デフォルトの名無しさん:2009/10/13(火) 19:13:09
というかD2ならstreamは廃止予定だから使わない方がいい
254デフォルトの名無しさん:2009/10/13(火) 19:23:57
>>253
まじですか・・・。
代わりに推奨されている物は何になりますか?
255デフォルトの名無しさん:2009/10/13(火) 19:36:35
らんげ
256デフォルトの名無しさん:2009/10/13(火) 20:00:59
>>255
std.rangeですか。
これがstreamの代用かぁ。
257デフォルトの名無しさん:2009/10/13(火) 20:51:05
RangeベースのFileあるいはFileRangeみたいなのがないとStreamの代わりにはならなくね
258デフォルトの名無しさん:2009/10/13(火) 21:58:37
>>257
std.stdio.File
259デフォルトの名無しさん:2009/10/14(水) 04:24:42
え? std.stdio.file がRangeだって!?ほんとに?
260デフォルトの名無しさん:2009/10/14(水) 05:44:25
std.stdio.File自体はCのラッパーだけど,byLineとか使ってRangeのように使える
ただコメントアウトとかがあって完成しているのかどうかは不明(LockingTextWriterとか見れば分かる)
参照カウントによる自動クローズとか普通に使う分には問題ないと思うけど
261デフォルトの名無しさん:2009/10/14(水) 05:46:40
忘れてた.だからstd.stream.Fileの代替にはなるけどstd.streamの代替はまだないと思う
262デフォルトの名無しさん:2009/10/14(水) 09:11:03
ストリームの代替はレンジそのものだろう。

phobosに入ってるソースストリームはファイルとソケットだけだから、
ソケットのレンジ化が完了すればストリームは捨てられる
263デフォルトの名無しさん:2009/10/14(水) 10:14:27
そうなった場合エンディアンとかバッファとかどうなるの?
264デフォルトの名無しさん:2009/10/14(水) 10:25:08
>>263
ラッパレンジを作るだけだろ
265デフォルトの名無しさん:2009/10/14(水) 11:54:59
struct AsEndian(Endian endian, R) {
R r;

static if(is(typeof({ r.put(ubyte.init); }()))) {
void put(ubyte x) { r.put(x); }
void put(int x) { /*ほげほげ*/ }
/*そのほか*/
}
}
266デフォルトの名無しさん:2009/10/14(水) 14:44:24
Shift-JISのテキストファイルを読み込み、その文字列から区切られた文字列を抜き出すコードがあります。

import std.file;
import std.windows.charset;
string tokenize(in char[] str,/*引数省略*/)
{
  // コード省略
  assert(0); // アサート1
  return result;
}

char[] strMB = cast(char[])read("hoge.txt");
string str = fromMBSz(strMB.idup.ptr);
string token = tokenize(str,/*引数省略*/);
assert(0); // アサート2

resultに日本語の文字列が入る場合に問題が起きます。
・このまま実行するとアサート1の行でAssertion failureが発生。
・アサート1をコメントアウトするとInvalid UTF sequence: 133が発生。

アサート1とアサート2の間には戻り値のコピーしかないので、なぜこのようなエラーが出るのかさっぱりわかりません。
どんな原因が考えられるでしょうか?
267デフォルトの名無しさん:2009/10/14(水) 17:11:47
readの戻り値がshift-jisならchar*で受けることになるんじゃ
char*のバイナリを配列にキャストしたら関係ないデータが要素数として読みとられて
idupで関係ないところまでコピーしようとしてるとか
調べてないので適当です
268デフォルトの名無しさん:2009/10/14(水) 18:15:23
std.stdioのlinesとかってRangeオブジェクトを返してたのか
269デフォルトの名無しさん:2009/10/14(水) 18:24:53
>>267
strをファイルに書き出して中身を確認したところ、
文字コードの違い以外はhoge.txtと同じなので、そこは問題ないと思います。

文字列が日本語の時のみ、Invalid UTF sequence: 133というエラーなので文字コードが関係してる気がするのですが、
エラーの発生箇所が戻り値のコピーなので謎です。
270デフォルトの名無しさん:2009/10/14(水) 18:33:53
UTF8としておかしな文字がないかどうかチェックされるようだから
コピー時に行われるそれがエラーになっているのだろう
271デフォルトの名無しさん:2009/10/14(水) 19:09:25
え、戻り値(string型つまりimmutableなchar配列の参照)のコピーなのになんで内部チェックとかしてるの?
そもそもfromMBSzでShift_JISからUTF8に戻しているはずだから文字コードが問題でもない気がする。
tokenize内で何かしらの最適化が起こって、assert(0);の評価順が変わってるとかってことはないかな?
272デフォルトの名無しさん:2009/10/14(水) 19:29:47
assert(0) は到達不能性の表明としてコードフロー解析で特別視されるから、
生成コードが変わってしまう可能性があるよ。
デバッグのときは普通にprintfかthrowしたほうがいい。
273デフォルトの名無しさん:2009/10/14(水) 20:40:12
>>270-272
言語の基本仕様の部分に動的な値チェックがある事は考えていませんでした。
でも、配列もクラスのような物?ですね。

assert(0)の評価順が変わる可能性があるのも知らなかったです。
>>266のアサート1とアサート2の部分をthrowに変えてみましたが、
同じようにアサート1の行からアサート2の行の間でInvalid UTF sequence: 133が発生しているようです。
もうさっぱりわかりません・・・。
274デフォルトの名無しさん:2009/10/14(水) 20:57:12
std.utf.validateつかってresultとかの文字列を全部ステップごとに確認しながら追っかけてみたら?
275デフォルトの名無しさん:2009/10/14(水) 22:43:50
うーん。いろいろ試してみたが再現しないぞ
もう少しコード載せられね?

もしかしてShift_JISな文字列をwritelnとかしてるとかいう落ちではないよねえ
276デフォルトの名無しさん:2009/10/15(木) 04:56:52
そうだな完全な再現コードとコンパイラのバージョンをくれ
277デフォルトの名無しさん:2009/10/15(木) 08:49:53
「assert(0)の「評価順」が変わる可能性」はないだろ?
生成されるバイナリが変わる可能性があるだけで.
関係なくね
278デフォルトの名無しさん:2009/10/15(木) 10:36:30
>>274-276
大変申し訳ない事なのですが、ここに載せてないコードが原因でした・・・。
問題が発生するtokenizeの呼び出しよりも前に1回tokenizeを呼び出していて、これを見落としていました。
アサート1を有効にすれば1回目のtokenizeでエラー、コメントアウトすると2回目のtokenizeでInvalid UTF sequence: 133という事でした。

Invalid UTF sequence: 133が発生する箇所は
auto pos = find(str, '<');
これを
auto pos = find(str, "<");
に直したらエラーは出なくなりました。
お騒がせしました。
279デフォルトの名無しさん:2009/10/15(木) 10:58:29
indexOfも調べといてね
280デフォルトの名無しさん:2009/10/15(木) 13:39:21
281デフォルトの名無しさん:2009/10/15(木) 14:49:51
この速さはD0の頃を思い出すな
282デフォルトの名無しさん:2009/10/15(木) 15:56:48
なんだとwwwwwwwww
283デフォルトの名無しさん:2009/10/15(木) 20:12:45
この速さはD2を完成させてD3の開発に移行するフラグ
284デフォルトの名無しさん:2009/10/15(木) 20:52:14
俺のダウンロードフォルダにある解凍していないdmd.2.034.zipの立場はどうなる
285デフォルトの名無しさん:2009/10/15(木) 21:25:59
-Xうごかねww
286デフォルトの名無しさん:2009/10/15(木) 21:57:08
287デフォルトの名無しさん:2009/10/15(木) 22:26:05
mainがあるソースでもmoduleいるのか
288デフォルトの名無しさん:2009/10/15(木) 22:28:30
buggyだな
289デフォルトの名無しさん:2009/10/15(木) 22:42:13
明日には2.037が出るな
290デフォルトの名無しさん:2009/10/16(金) 00:51:38
>>289
2.036はどこに行ったんだw
291デフォルトの名無しさん:2009/10/16(金) 01:48:15
一応D3の準備が始まってるのか???
292デフォルトの名無しさん:2009/10/16(金) 01:48:36
う、うん……(´・ω・`)
293デフォルトの名無しさん:2009/10/16(金) 02:10:11
なんでションボリしてんのw
294デフォルトの名無しさん:2009/10/16(金) 02:34:54
>>291
以前MLで「2で実装したかった幾つかの機能は3に持ち越し」みたいなこと誰かが書いてたような気がする
希に名前は出てくるけどどうなってるかは分からない……(´・ω・`)
295デフォルトの名無しさん:2009/10/16(金) 12:56:01
wktkしてきた!
296デフォルトの名無しさん:2009/10/16(金) 12:58:54
シリアライズが面倒くさい・・・
boost::serializationみたいなのできないかなぁ。
297デフォルトの名無しさん:2009/10/16(金) 13:02:20
wktkは、ど〜でもいいんだけど、どうなの?
Dは、ぼちぼち実用できるレベルになったの?
得意分野を持たない物は、プログラミング言語に限らず公には
忘れられていくと思うんだけど、これ!こゆ事にはD!とかいう
分野は確定できた?
298デフォルトの名無しさん:2009/10/16(金) 13:32:49
D2の安定版出たらベターCとして使いたいね
299デフォルトの名無しさん:2009/10/16(金) 13:37:04
来年にはD4リリースです
300デフォルトの名無しさん:2009/10/16(金) 13:38:07
>>297
Pythonは、とくに得意分野もないけど定着したね。
登場当初は「Perlあるからイラネ」と言われてたものでした。
301デフォルトの名無しさん:2009/10/16(金) 13:47:37
>>297みたいにDと実用って語が同時に出てくると反射的に
「こいつ何言ってるんだろう……」とか思ってしまう俺は本当によく訓練されてると思う。
302デフォルトの名無しさん:2009/10/16(金) 16:14:51
>>300
いや、perlに比べるとpythonは覚え易いっしょ。
303デフォルトの名無しさん:2009/10/16(金) 16:15:28
訓練ではない、調教だ
304デフォルトの名無しさん:2009/10/16(金) 16:56:31
>>303 は全面的に正しい
305デフォルトの名無しさん:2009/10/16(金) 17:59:42
better Cじゃなくてbetter C++だろ?

それに、どちらかで書かれた外部ライブラリだって使えるんだから、
プアーでない環境でのC/C++とほとんど同じ領域で実用できるさ。
スレッドやデリゲート、よりよいテンプレートなどがある分、C++03よりも実用的なくらいだ。
※ただし言語仕様の変更に応じてソースを修正できるならね(笑)
306デフォルトの名無しさん:2009/10/16(金) 18:20:14
>>305
ソースコンバータで一儲けできるまでに広まって欲しいっす。
307デフォルトの名無しさん:2009/10/16(金) 19:52:21
QtDが再びWindowsでビルドできるようになってたから使ってみたらわけのわからないところで落ちまくる
これだよこれ、やっとまともなDのライブラリになったな
308デフォルトの名無しさん:2009/10/16(金) 23:54:40
>>307
よく調教され(ry
309デフォルトの名無しさん:2009/10/17(土) 18:15:02
dmdで
-c -o- -deps=ほげ source.d
ってやるとsource.dが依存するファイルが一覧で取れるって今知った

上手く解析すればbudみたいの作れないかなー
310デフォルトの名無しさん:2009/10/17(土) 18:55:28
libdmdみたいにしてそういうインターフェースを整えてくれないものだろうか、うぉるたん
311デフォルトの名無しさん:2009/10/17(土) 20:11:58
>>310
コンパイラをバイナリレベルでリンクするのは前にC++コンパイラで試したけど面倒だったから
テキストで出力する方式にするっていってた。
312デフォルトの名無しさん:2009/10/17(土) 20:26:21
QtDの中の何かを呼び出したタイミングで落ちるのかと思ったら
なぜかstd.file.readを使ったところで落ちる
QtDと組み合わせなければ落ちない
何やねん
313デフォルトの名無しさん:2009/10/18(日) 00:30:37
バグのないプログラムは無いが直せないバグはない、っていう
言葉と同じで、安定していないからモノを作れない、にはならないぜ!


って思う俺はやはり調教されてるのか。。。
314デフォルトの名無しさん:2009/10/18(日) 02:22:52
なんか理想と現実だいぶ違うから〜っていう歌を思い出した
315デフォルトの名無しさん:2009/10/18(日) 04:56:12
311が何を言っているのかわからないのは俺だけか
316デフォルトの名無しさん:2009/10/18(日) 05:32:38
“We are all Walter Bright.”
317デフォルトの名無しさん:2009/10/18(日) 07:57:09
俺が・・・・俺たちがウォルターブライトだ!!

ふいたwwwww
318デフォルトの名無しさん:2009/10/18(日) 15:26:35
クラスでの機能の継承よりも mixin での機能の委譲って
なんだか便利だね。
同一機能を複数、個別の名前をつけて委譲できる文字列 mixin が
重宝してます。
319デフォルトの名無しさん:2009/10/18(日) 16:03:51
機能を共有する手段として継承使うと結局わやくちゃになるからな
320デフォルトの名無しさん:2009/10/18(日) 17:05:39
template method patternは親クラスの設計からはみ出すような要件がでてきたとたんに
クラスツリーを丸ごと放棄するか全面的な書き換え(少なくとも読み直し)が必要になって困るんだが
Dだとmixinを使ってうまく柔軟にやれるのかい?
321デフォルトの名無しさん:2009/10/18(日) 17:15:25
名前さえ同じであればいいし、些細な違いはstatic ifとかで吸収できるから
JavaBeansみたいなのを超強化したような事がやれると思う
322デフォルトの名無しさん:2009/10/18(日) 21:58:15
プロトタイプベースのオブジェクト指向できるかな
323デフォルトの名無しさん:2009/10/18(日) 22:04:32
mixin使うと可読性が低くなるのがちょっとな…
普段あんまり使わないからかもしれないけど。
どうやって書いたら可読性の高いmixinができるかな?
324デフォルトの名無しさん:2009/10/18(日) 22:19:40
``を上手く使うくらいしか思いつかね
325デフォルトの名無しさん:2009/10/18(日) 22:36:14
>>324
文字列にしたらIDEからのサポートは絶望的になるな。
もしmixinでいろいろやるとしたらtemplate mixinの方がいいんじゃないか?
326デフォルトの名無しさん:2009/10/18(日) 22:40:00
>>322
class O {
Variant[] prototype;
O dup() {
auto o = new O;
o.prototype = this.prototype;
return o;
}
}
327デフォルトの名無しさん:2009/10/18(日) 22:40:32
>>325
template mixinと文字列mixinは名前こそ似てるが完全に別物だぞ
328デフォルトの名無しさん:2009/10/18(日) 22:47:58
mixin絡みでC++の二の舞の気がしてきた
なんだかオラわくわくしてきたぞ
329デフォルトの名無しさん:2009/10/18(日) 22:49:11
>>320 はtemplate mixinのつもりだった
330デフォルトの名無しさん:2009/10/18(日) 22:50:22
``よりもq{}の方が便利だ
331デフォルトの名無しさん:2009/10/18(日) 22:55:36
>>326
インスタンスへ静的にメソッドを追加できないかね
332デフォルトの名無しさん:2009/10/18(日) 22:57:34
いやインスタンスは流石に無理かw
じゃあこれでw
class Some(string method){
mixin(method);
}
333デフォルトの名無しさん:2009/10/19(月) 01:07:10
mixin系ってなにげにいろんな言語に取り込まれているな
ぱっと思いつくところではRubyとかScalaとか
334デフォルトの名無しさん:2009/10/19(月) 01:37:13
連想配列に関して何か意見あったら今のうちにNG送っとけよ
335デフォルトの名無しさん:2009/10/19(月) 01:41:03
template mixinはダイナミックスコープのまま?
レキシカルスコープになる気配ある?
336デフォルトの名無しさん:2009/10/19(月) 08:59:54
>>334
あっても英語ができない
ないけど
337デフォルトの名無しさん:2009/10/20(火) 10:45:03
struct Hoge { int a, b, c; }
Hoge hoge;
foreach(ref e, hoge.tupleof) {
e = 100;
}

こんな感じでtupleをforeachで回してstructのメンバに代入したいのですが、
foreachの行でコンパイルエラーError: no storage class for value eが発生してしまいます。
何か方法はないのでしょうか?
338デフォルトの名無しさん:2009/10/20(火) 10:48:37
× foreach(ref e, hoge.tupleof) {
○ foreach(ref e; hoge.tupleof) {
339デフォルトの名無しさん:2009/10/20(火) 10:59:20
見た目の格好悪さを我慢できるならこれが手軽。

struct Hoge { int a, b, c; }
void main(){
Hoge hoge;
foreach(i,e; hoge.tupleof) {
hoge.tupleof[i] = 100;
}
}
340デフォルトの名無しさん:2009/10/20(火) 11:19:36
>>338
書き間違えました。
>>339
なるほど。
使わないeを宣言してるところは格好悪いですね。
341デフォルトの名無しさん:2009/10/20(火) 17:49:44
import std.stdio;
import std.algorithm;
void main()
{
struct Hoge { int a, b, c; };
Hoge hoge;
fill(cast(int[])((cast(void*)&hoge)[0..Hoge.sizeof]), 100);
write(hoge);
}

何がなんだかわからなくなってきた
342デフォルトの名無しさん:2009/10/20(火) 18:10:11
void func(T)(ref T t){...}
int[10] arr;
func(arr);

Error: cannot have out or ref parameter of type int[10u]
静的配列をrefで受け取る事ってできないんですかね?
343デフォルトの名無しさん:2009/10/20(火) 18:26:27
>>342
そもそも静的配列は左辺値じゃないからな。
344デフォルトの名無しさん:2009/10/20(火) 19:01:20
スライスにする
import std.stdio;
void func(T)(ref T t){ t[0] = 1; }
void main(){
int[10] arr;
func(arr[]);
writeln(arr);
}
345デフォルトの名無しさん:2009/10/20(火) 19:06:49
>>343-344
thx
動的配列と似てるようで結構違うんですね。
346デフォルトの名無しさん:2009/10/20(火) 19:27:00
なんでスライスにしたら書き換えられて
静的配列だと書き換えられないんだw
347デフォルトの名無しさん:2009/10/20(火) 19:52:32
配列のスライスも通常の左辺値じゃないはずから(=で代入できるけど、特殊な処理が走る)
refで渡した物に代入しても期待通りの結果にはならないと思う。
348デフォルトの名無しさん:2009/10/20(火) 19:55:56
配列自体が特殊な参照型だから(ry
349デフォルトの名無しさん:2009/10/20(火) 20:13:01
静的配列は値型、動的配列は特殊な参照型(サイズ+ポインタ)。
静的配列をスライスすると、その静的配列を指す動的配列になる。
静的配列型変数も立派な左辺値な。ただ静的配列は変数の引数に使えない、返り値に使えないなどの謎な制限がある。ロス無しで制限回避するなら構造体にキャストするのが正解。まぁスライス取った方が読みやすいが。
350デフォルトの名無しさん:2009/10/20(火) 21:43:26
int[new] dynArr;
int[N] staArr;
auto slice1 = dynArr[0..2];
auto slice2 = staArr[0..3];
になったらそこらへんも一緒に改善されるかな?
351デフォルトの名無しさん:2009/10/20(火) 21:45:53
ついでにタプルを関数から返せるように・・・
とか改善して欲しいところは昔から一杯残ったままだな
ちゃんとvotes使われてるのか?
352デフォルトの名無しさん:2009/10/21(水) 08:39:22
http://www.prowiki.org/wiki4d/wiki.cgi?LanguageDevel
保留中のアイデア
Move 'delete' from language to library. Possibly even get rid of 'new'.
えー
353デフォルトの名無しさん:2009/10/21(水) 13:35:12
D言語でSDLを使う方法が書かれているページの通りにやったらエラー出て、
原因はD 2.0を使っているためだと思い、何分か試行錯誤して、使えるようにできた。
SDLフォルダ(SDL.dとかSDL_video.dとかがあるフォルダ)の中のD言語ソースファイルの「bit」というところを「bool」に書き換える。
これで動作するはず。
既出だったらごめんなさい。
354デフォルトの名無しさん:2009/10/21(水) 13:39:37
bitってもう完全に廃止されたんだっけ?
deprecatedになったのは覚えてるんだけどいつの間にかなくなってたよね
355デフォルトの名無しさん:2009/10/21(水) 13:42:09
bitになってるとエラー出る(英語はわからないが、多分、bitなんていう識別子は無いってことだと思う)から、
bitは多分消えたと思う
356デフォルトの名無しさん:2009/10/21(水) 15:30:24
動的配列のconstを全てはずすにはどうやればいいですか?
例えばstd.traits.Unqual!(const(char)[][])とやってもconstがはずれません。
357デフォルトの名無しさん:2009/10/21(水) 17:12:06
再帰的に適用するテンプレートつくれば
358デフォルトの名無しさん:2009/10/21(水) 18:08:53
テンプレートって本質的に型汎用的だから
自作したテンプレートってたいてい標準で備わっていて欲しくなって困る
いや困らない
359デフォルトの名無しさん:2009/10/21(水) 18:11:40
>>357
Phobosにはないんですね。
まあ作るのは簡単そうですね。
360デフォルトの名無しさん:2009/10/21(水) 20:22:53
>>355
D1だとobject.dにboolのaliasで定義されてるんだけど
D2になる機会にスッキリ息の根を止めようってことみたいね
361デフォルトの名無しさん:2009/10/21(水) 20:27:55
bitはもともと1bitの型だったの?
362デフォルトの名無しさん:2009/10/21(水) 21:03:20
bitがboolのaliasだったということはbitはboolと同じなんじゃないですか?
363デフォルトの名無しさん:2009/10/22(木) 00:03:09
C++から来てforeach便利すぎて多用してるんだけど
二つの配列同時になめてく時はインデクスでアクセスしなきゃいけないのがなんか悔しい。

>>353
たしか前スレで出てた。
364デフォルトの名無しさん:2009/10/22(木) 00:06:12
foreach (i, v; a)
のiの部分をindexに限定してることはforeachの幅を著しく下げてるよね
foreach (i; v1; a)とかにして
foreach (i; v1, v2; a1, a2)とかやりたいよね
365デフォルトの名無しさん:2009/10/22(木) 00:08:40
>>363
どこかにzipWithなかったっけ。
366デフォルトの名無しさん:2009/10/22(木) 00:17:21
>>363
そのためのrange
367デフォルトの名無しさん:2009/10/22(木) 01:35:00
ついでにttp://www5.atwiki.jp/yaruhara/pages/74.htmlのサンプルの画像を表示が
D2.0ではエラー出るのを直す方法も考えた。
SDL_video.dの、SDL_LoadBMP関数の引数、「char* file」を
「immutable(char*) file」に書き換えておく。
こうすれば一応サンプルは動く。
これも既出だったらごめんなさい。
368デフォルトの名無しさん:2009/10/22(木) 01:58:46
普通にstringでいいんじゃね
369デフォルトの名無しさん:2009/10/22(木) 02:37:29
元は、
SDL_LoadBMP(const char *file);
なので,そこは
SDL_LoadBMP(char* file);
にしとくべきだと思うが。
370369:2009/10/22(木) 02:38:39
すまん。わかりにくかった。
2行目がC言語,4行目がD言語な。
371デフォルトの名無しさん:2009/10/22(木) 02:40:06
>>369
SDL_LoadBMP(const(char)* file);
でしょ
372デフォルトの名無しさん:2009/10/22(木) 02:41:37
D言語で、引数の型をAutoにする方法は無いのでしょうか。
373デフォルトの名無しさん:2009/10/22(木) 02:42:31
>>372
template関数じゃ駄目なの?
それとも更に構文糖が欲しいってこと?
374369:2009/10/22(木) 02:49:22
>>371
D の const は、型修飾子ではなく記憶クラスです。従って、 型修飾子として使われている const は全て除いてしまいます:

CのconstってDと違うし、外すべきだと思ったんだが。
375デフォルトの名無しさん:2009/10/22(木) 02:56:49
templateは便利ですね。
これならstringもimmutable(char*)にもchar[]にも対応できるSDL_LoadBMPができるかも
376デフォルトの名無しさん:2009/10/22(木) 03:08:26
>>374
それは一体いつの知識なんだ。

>>375
そもそもCでconst char*型で定義されているのだから、
Dではこれと同等の型であるconst(char)*型で宣言すべき。

stringすなわちimmutable(char)[]も、immutable(char)*も、char[]も
const(char)*に暗黙的に変換できる。
377デフォルトの名無しさん:2009/10/22(木) 08:21:07
>>376
const(char)*で成功しました。
ありがとうございます。
378デフォルトの名無しさん:2009/10/22(木) 10:25:54
>>365-366
zipってforeach(ref e; r){e = 1;}みたいに代入するのにも使えるの?
379デフォルトの名無しさん:2009/10/22(木) 10:36:48
今の実装だとたぶんできないな.
380デフォルトの名無しさん:2009/10/22(木) 11:21:48
foreachってなんでデフォが値のコピーなんだろう?
array[i] = 1;のつもりでforeach(e; array){e = 1;}と書き間違うリスクが高いと思うんだが。
381デフォルトの名無しさん:2009/10/22(木) 16:33:25
それはない。
382デフォルトの名無しさん:2009/10/22(木) 17:16:52
>>380
おまえは何を言っているんだ
383デフォルトの名無しさん:2009/10/22(木) 17:26:37
バイナリの入ったTangoの前バージョンってどこ行けば手に入るんでしょうか
384デフォルトの名無しさん:2009/10/22(木) 18:26:49
make it yourself
385デフォルトの名無しさん:2009/10/22(木) 23:52:51
>>380じゃないけど配列に処理結果書き込まれてなくてあれ、とか思ったらref付け忘れてた、ってことはあった。
for (i = 0; i < a.length; ++i)
386385:2009/10/22(木) 23:54:34
二行目間違いw 消し忘れなんで気にしないでくれ。
387デフォルトの名無しさん:2009/10/23(金) 00:10:48
tango.core.Exception.UnicodeException: Unicode.toString32 : invalid utf8 input
日本語使ってないんですが、上記のエラーが出ます。
なぜ?
388デフォルトの名無しさん:2009/10/23(金) 00:51:50
>>387 最小限の再現コードを作って
389デフォルトの名無しさん:2009/10/23(金) 01:31:58
D言語で、コンソールをクリアするにはどうすればいいのでしょうか。
clsコマンドのようなことをしたいのですが、
390デフォルトの名無しさん:2009/10/23(金) 01:45:38
system("reset")
391デフォルトの名無しさん:2009/10/23(金) 01:54:40
連続で質問してすいません。
「#IFDEF _WIN32」のようなことをしたいのですが、、
どうすればいいのでしょうか。
392デフォルトの名無しさん:2009/10/23(金) 02:06:42
version (Win32)
{
/* コード */
}
393デフォルトの名無しさん:2009/10/23(金) 02:09:23
ちなみにそれを含めて >>389 に答えるとこうなる

import std.stdio;
import std.process;

void main() {
writeln("aaaaa");
version (Windows) {
system("cls"); // Winならclsでコンソールをクリア
} else {
system("reset"); // Win以外の環境だとこうなの?よく知らないけど
}
}
394デフォルトの名無しさん:2009/10/23(金) 02:12:36
resetよりclearの方が良くね?
$ clear | hexdump
0000000 5b1b 1b48 325b 004a                    
0000007
それと単にこのコード吐き出しゃ良い気もする
395387:2009/10/23(金) 06:25:28
module main;
private import tango.io.FilePath;

int main()
{
new FilePath("c:\\d");
return 0;
}

tango-0.99.7-bin-win32-dmd.1.033
です。
396デフォルトの名無しさん:2009/10/23(金) 06:51:10
import dfl.all;
private import tango.io.FilePath,tango.io.Stdout;
class MyForm: dfl.form.Form
{
this()
{
allowDrop = true;
text = "My Form";
clientSize = dfl.all.Size(248, 189);
this.dragOver ~= &this.dOver;
}
void dOver(Control sender, DragEventArgs ea) {
if ( ea.data.getDataPresent( DataFormats.fileDrop ) ) {
Stdout("1").newline;
char[][] fs = cast(char[][])ea.data.getData( DataFormats.fileDrop ).getStrings();
Stdout("2").newline;
foreach(int i , char[] f ; fs ) {
Stdout("3").newline;
FilePath fp = new FilePath(f);
}
}
}
}
int main()
{ int result = 0;
try { Application.run(new MyForm()); }
catch(Object o) { msgBox(o.toString(), "Fatal Error", MsgBoxButtons.OK, MsgBoxIcon.ERROR); result = 1; }
return result;
}

すいません。間違いました。こっちで。
397デフォルトの名無しさん:2009/10/23(金) 07:44:53
自己解決しました。
>>395
で、エラーの内容が\が入ってるとはっきり出ていたので、Text.substitute で置き換えたらあっさり通りました。
バックスラッシュが駄目なんですね・・・、なんでだろ。
後は、Application.autoCollect = false; がmain関数内に必要でした。

お騒がせしました。
398デフォルトの名無しさん:2009/10/23(金) 13:44:29
ncursesのDラッパとか探せばあるんじゃね
399デフォルトの名無しさん:2009/10/23(金) 18:59:09
assertにエラーメッセージを付加することってできないですか?
例外クラスを書いてthrowするしかない?
400デフォルトの名無しさん:2009/10/23(金) 19:02:28
assert(0, "msg");ってことじゃなくて?
401デフォルトの名無しさん:2009/10/23(金) 19:33:34
>>400
簡単にできるんですね。
どうもでした。
402デフォルトの名無しさん:2009/10/23(金) 19:45:33
数値を文字列に変換するpure関数ってないでしょうか?
pure関数の契約の中で、convのtoを使って数値を文字列に変換しようとしたらpureじゃないって怒られました。
403デフォルトの名無しさん:2009/10/23(金) 19:58:10
convにpureつければおk
404デフォルトの名無しさん:2009/10/23(金) 19:59:10
std.conv.toがpureじゃないのがおかしいんじゃないか…?
405デフォルトの名無しさん:2009/10/23(金) 20:02:29
早くbugzillaにパッチをあげてandreiの尻を叩くんだ
406デフォルトの名無しさん:2009/10/23(金) 20:23:03
>>403-405
言われてみれば確かにpureじゃないのが変な気がします。
何か理由でもあるんでしょうか?
今後に期待orz
407デフォルトの名無しさん:2009/10/23(金) 20:24:00
たぶん実装的には現状のままでもpureつけて動くと思うよ
408デフォルトの名無しさん:2009/10/23(金) 20:58:10
>>407
parseとかいくつか修正が必要なので素直にMLに投げてAndreiに修正してもらった方が楽かも
409デフォルトの名無しさん:2009/10/23(金) 20:59:32
phobosは未だにpureとかnothrowとかついてない関数が多いな
CTFEで出来そうなのにそうなってない関数とかも
410デフォルトの名無しさん:2009/10/23(金) 22:17:49
nothrowの使いどころってイマイチ分かってない。
Stack Overflowがあり得る以上、関数呼び出しもしちゃだめなのか?

nothrow double func(){
return func2();
}
nothrow double func2(){
return func();
}
void main(){
func();
}
これは今のところコンパイルも通る(dmd2.035)し、ちゃんと落ちますが。
411デフォルトの名無しさん:2009/10/23(金) 22:23:41
検査例外と実行時例外
412デフォルトの名無しさん:2009/10/23(金) 22:36:45
>>410
nothrowはExceptionを投げない関数なのでErrorを投げる可能性がある。

とはいえ、検査例外的な機能を入れるならJavaのように投げる可能性のあるものを列挙できるようにしないと
catch(Excepiton)するしかなくなるので、俺も使い道はよく分からない。
413デフォルトの名無しさん:2009/10/23(金) 23:13:43
>>nothrowはExceptionを投げない関数なのでErrorを投げる可能性がある。

class Error : Exception だと思ってた漏れを笑ってやってください。
なんだThrowableってw
414410=413:2009/10/23(金) 23:42:14
nothrow void func(){
throw new Error("error!"); // <- new が may throw
}
nothrow void func2(){
try throw new Error("error!");
catch(Exception e) writeln("error!"); // <- writeln が may throw
}
nothrow void func3(){
try throw new Error("error");
catch(Exception) {} // OK >>412 するしかなくなる
}
ぬぅ。。。やっぱりよくわかりませんでした。>使い道
415デフォルトの名無しさん:2009/10/24(土) 00:00:55
throw new Errorが通らないのはたぶんバグ
416414:2009/10/24(土) 01:10:41
>>415
>(newに)失敗すると、null を返すのではなく OutOfMemoryException 例外が投げられます。
らしいから、バグじゃないかも?
OutOfMemoryErrorじゃないのがバグ?

ところでobject.Error: Stack Overflowって catch(Error) で取れないんですね。
StackがOverflowしてるんだからしゃーないのか?
このぶんだとOutOfMemoryExceptionも取れないのだろうか。メモリ無いんだし。
417デフォルトの名無しさん:2009/10/24(土) 17:50:00
実行時例外って何かと思ったら
runtime exceptionを訳したのか
このruntimeを実行時って訳すのに違和感・・・
ランタイムに出る例外じゃなくてランタイムが出す例外だよね?
418デフォルトの名無しさん:2009/10/24(土) 19:11:00
(゚Д゚)
419デフォルトの名無しさん:2009/10/24(土) 19:29:08
ランタイムライブラリをランタイムと略したらそうなるんだろうけど
420デフォルトの名無しさん:2009/10/24(土) 21:18:41
>>417
実行時のエラーが原因で投げられるから実行時例外なんでしょ
421デフォルトの名無しさん:2009/10/24(土) 22:43:30
アホなこと言ってごめんよw
実行時のエラーが原因で投げられるのは検査例外も一緒じゃないの
422デフォルトの名無しさん:2009/10/25(日) 00:25:43
そもそもコンパイルタイムに例外なんて飛ばないんだから
423デフォルトの名無しさん:2009/10/25(日) 00:33:15
compile time errorに対してのruntime errorだから、
例外がない時代の用語を元にしているんだよなあ。
runtime libraryは言語仕様ライブラリとかの方がしっくりくる。
424デフォルトの名無しさん:2009/10/25(日) 00:37:10
コンパイルタイム例外?
http://d.puremagic.com/issues/show_bug.cgi?id=3050
425デフォルトの名無しさん:2009/10/25(日) 01:07:08
>>422
そもそもコンパイルタイムに例外なんて飛ばないんだから、
runtime exceptionを実行時例外と呼ぶことに違和感がある、んだけど・・・
426デフォルトの名無しさん:2009/10/25(日) 01:10:47
>>425
コンパイル時に処理漏れを検査できる検査例外に対して、
実行してみないとどこで飛ぶか分からないのがruntime exceptionだから
実行時例外でもいいでしょ
427デフォルトの名無しさん:2009/10/25(日) 17:03:30
import std.algorithm;
import std.range;
makeIndex!("a.at!(0) == b.at!(0) ? a.at!(1) > b.at(1) : a.at!(0) > b.at!(0)")(zip(arr1, arr2), index);

functional.d(176): Error: static assert "Bad binary function q{a.at!(0) == b.at!(0) ? a.at!(1) > b.at(1) : a.at!(0) > b.at!(0)}. You need to use a valid D expression using symbols a of type Proxy and b of type Proxy."
「値が同じなら別の値を使ってソートする」という事をしたいのですがコンパイルエラーになります。
述語を関数やファンクタにするとなると、zipが返す型を記述しないといけなくなるのがなんだかなーといった感じです。
うまい方法はないでしょうか?
428427:2009/10/25(日) 17:05:09
すみませんタイプミスでした。
b.at(1)をb.at!(1)に変えたら解決しました。
429デフォルトの名無しさん:2009/10/25(日) 17:16:36
htodを使ってOpenCVのcv.hをDのモジュールにしようとしたら、
Fatal error: unable to open input file 'assert.h'
というエラーが出て、不完全なファイルが出力されてしまいました。
どうすればいいのでしょうか。
430デフォルトの名無しさん:2009/10/25(日) 17:22:03
assert.hを読めるようにインクルードパスを設定する
431デフォルトの名無しさん:2009/10/25(日) 17:31:08
assert.hがあるところに環境変数PATHを設定したのですが、それでも同じエラーが出ます。
dmフォルダのsc.iniに書かれているインクルードパスもassert.hがあるフォルダに設定されています。
cv.hとは違うディレクトリに出力させているためでしょうか。
432デフォルトの名無しさん:2009/10/25(日) 17:33:21
-Idm\include
433デフォルトの名無しさん:2009/10/25(日) 17:37:52
>>432
それで成功しました。ありがとうございます。
しかし、cv.hの最初のほうの複雑な入れ子になっている#ifdefがそのままになっています。
このままでも使えるんですか?
434デフォルトの名無しさん:2009/10/25(日) 17:51:16
>>433
そのへんは自分で直す必要がある。
というか、htodの出力は一通り人の手で修正しないと使い物にならないよ
435デフォルトの名無しさん:2009/10/25(日) 17:54:47
確かに、「module D:\hoge\cv.d」のようにフルパスで出てきているところや、
プリプロセッサ削除ができていないところは修正するしかないですね。
OpenCVのhファイルの中でもコンパイルエラー出して変換できないものも多いですし
436デフォルトの名無しさん:2009/10/25(日) 18:01:55
BCDとかどうなんだろ?バインディング生成が目的みたいだけど.
437デフォルトの名無しさん:2009/10/26(月) 01:05:59
htod任せだとconstも全部取り除いてくれるから文字列渡すときにdup.ptrとか渡すことになる。
上のほうでSDLについてその辺の話が出てるけど。
438デフォルトの名無しさん:2009/10/26(月) 03:23:31
だってhtodが生成するのってD1だろ
439デフォルトの名無しさん:2009/10/26(月) 19:28:08
動的配列を逆向きにたどったスライスが欲しくて
int[] arr;
auto r = std.range.retro(arr);
auto r2 = r[0..2];
というのを考えたのですが、Retroには引数を2つ取るopSliceがないようです。

arr.reverseとするのは処理コストがかかりそうで、できれば避けたいのですが、
他に方法はないのでしょうか?
440デフォルトの名無しさん:2009/10/26(月) 19:35:37
>>439
// r = retro(arr)[m .. n]

auto r = take(n, retro(arr));
popFrontN(arr, m);
441デフォルトの名無しさん:2009/10/26(月) 19:37:19
最後arrじゃなくてrだった
442デフォルトの名無しさん:2009/10/26(月) 19:51:57
>>440
thx
443デフォルトの名無しさん:2009/10/26(月) 23:42:02
何も表示されないんだけど
import std.stdio;
import std.range;
void main(){
int[] arr = [1,2,3,4,5];
auto r = take(1, retro(arr));
popFrontN(r, 2);
foreach(int e; r) writeln(e);
}
444デフォルトの名無しさん:2009/10/26(月) 23:42:49
あ,takeで1個しか取ってないからだ orz
445デフォルトの名無しさん:2009/10/26(月) 23:45:21
import std.stdio;
import std.range;
void main(){
int[] arr = [1,2,3,4,5];
auto r = take(4, retro(arr)).popFrontN(1); // これできないのなんでだろう
foreach(int e; r) writeln(e);
}
main.d(5): Error: no property 'popFrontN' for type 'Take!(Retro!(int[]))'
main.d(5): Error: function expected before (), not __error of type int
main.d(6): Error: foreach: int is not an aggregate type
446デフォルトの名無しさん:2009/10/27(火) 01:06:08
あ・・・まだrangeなんですね
447デフォルトの名無しさん:2009/10/28(水) 02:00:15
まだRangeはダメなんですね でした orz
448デフォルトの名無しさん:2009/10/28(水) 02:53:05
ダメというのは?
449デフォルトの名無しさん:2009/10/28(水) 03:20:10
atの第1引数がrangeでも(*)ができるのかと思いましたができないんですねという意味です
int at(int[] arr, uint index){
 return arr[index];
}
int[] arr = [1,2,3];
assert(arr.at(1) == 2); // (*)
450デフォルトの名無しさん:2009/11/02(月) 08:26:52
次のまだー
451デフォルトの名無しさん:2009/11/03(火) 00:16:50
なぜphobosはモジュールをstructで書くのだろう?
Dのstruct関係が最適化が効いててやたら速いからなのだろうが、
値型でモジュールを書くのはC++の悪夢を思い出して嫌な感じがする。
452デフォルトの名無しさん:2009/11/03(火) 02:31:43
というかアンドレイがだな
なんでかな
453デフォルトの名無しさん:2009/11/03(火) 07:51:38
とはいえ言語の基幹部分にクラス入れられるのも変な感じがする
454デフォルトの名無しさん:2009/11/03(火) 08:08:03
よし、すべての引数をrefで受け渡しだ!
455デフォルトの名無しさん:2009/11/03(火) 09:25:56
右辺値参照rrefまだー
456デフォルトの名無しさん:2009/11/03(火) 10:00:17
perlerが暴れてるのか
457デフォルトの名無しさん:2009/11/03(火) 17:40:57
クラスの上位は抽象的なのが望ましいから
クラスライブラリを使うとGoFのAdapterを使う場面が増える
Adapterに派生を使うと、そこから他のクラスを継承できなくなるので
自然に集約のAdapterを選択している

      |
   \  __  /
   _ (m) _ピコーン
      |ミ|
   /  .`´  \
     ハ_ハ  
     ( ゚∀゚)')
    (つ ノ
    ⊂__ノ
.     し'
だったら最初から集約を強制すればいいじゃないか
458デフォルトの名無しさん:2009/11/03(火) 18:17:44
>>457
コードも一緒に載せてください m(..)m
459デフォルトの名無しさん:2009/11/03(火) 19:59:26
>>458
ちょw
460デフォルトの名無しさん:2009/11/04(水) 01:35:18
構造体なんてC/C++との橋渡しのみ、くらい割り切ることはできんのかなぁ。
Dは基本的にクラスで統一、ただしC/C++の概念である構造体も相互運用のためサポートしてます、くらい明確に住み分けて欲しい。

クラスをはっきり値型として宣言できるとか、
変数をnullableと宣言しない限りnullを代入できないとか、
構造体的な使い方しかしなければ構造体と同じように最適化してくれるとか、

ああ畜生! なんでこの言語触ってると自分で言語作りたくなってくるんだ!
おかげでコンパイラの作り方とか本買っちまったじゃねーかYO!!
461デフォルトの名無しさん:2009/11/04(水) 02:06:32
Dのアドバンテージってもうネイティブコード吐けるくらいしかないなぁ
普段python使ってて間に合っちゃってるし
462デフォルトの名無しさん:2009/11/04(水) 03:11:21
>>461
pythonいいな、Dよりもpythonの優れた箇所を知りたい
463デフォルトの名無しさん:2009/11/04(水) 07:44:40
>>460
むしろ逆にnewを消してクラスを構造体に近づけようという動きの方が盛んだと思うが
464デフォルトの名無しさん:2009/11/04(水) 08:37:37
俺も何となくnewっていらないよなーと思っていたので改めて考えてみる
class A{void f(){}}
A a;
a.f(); // これで動く
やっぱり,未初期化でインスタンスを指さない変数なんていらなくね?
それが欲しかったら
A a = null;
って明示すりゃあいいんだし.
nullよりインスタンスを指す変数の方がよく使うでしょ.
465デフォルトの名無しさん:2009/11/04(水) 11:15:02
それはnewより未初期化変数の方の問題なんじゃないだろうか。

コードの不吉な匂いの一種として「甘やかされたnull」なんてどこかで言われてたっけね。うまい言い方だと思った。
あれはプログラマーが甘やかしてるケースだったけど、いろんな言語の仕様からもnullは甘やかされてるって思う。
ある変数がnullであることが何を意味するのかってドキュメントでしか分からないんだし、
もーちょっとnullを使わなくてもよくする言語仕様ってのが欲しいね。
コンパイラには「nullにしときますね」じゃなく「これnullになるけどお前それでいいのか?どういう意味か分からないんですわ?お?」と言って欲しい。
466デフォルトの名無しさん:2009/11/04(水) 19:06:42
D3に期待
467デフォルトの名無しさん:2009/11/04(水) 19:39:51
今まで動的配列で扱っていた部分をrangeに置き換えようと思っているのですが、
関数の引数で動的配列を受け取っていた部分は、全部テンプレートに書き直すことになるんですかね?
全て書き換えるのは大変なのですが、rangeから動的配列に変換する事はできないのでしょうか?
468デフォルトの名無しさん:2009/11/04(水) 22:20:33
core.threadのThreadでstartしたのにスレッドが実行されていない事があるのですが、
どのような原因が考えられますでしょうか?
また、解決策として下記のようにしたのですが問題ありますでしょうか?

while( !m_thread.isRunning )
{
 m_thread = new SubThread;
 m_thread.isDaemon = true;
 m_thread.start();
}

一応、何回か試したところ大丈夫そうなのですが・・・
469デフォルトの名無しさん:2009/11/04(水) 23:01:36
linuxなら、ガベコレがバグっててスレッドのコンテキストの切り替えが
めちゃくちゃになっているから、とても使えたものではない
という話を聞いたことがある
470デフォルトの名無しさん:2009/11/04(水) 23:31:45
windowsなら、一見動いてても意味不明のアクセス違反が発生しまくる事があった気がする
471468:2009/11/05(木) 00:20:09
環境はWindowsで、コンパイラは最新のDMD2.035です。
やっぱりバグの可能性もあるのですね(;^^
472デフォルトの名無しさん:2009/11/05(木) 01:03:32
いや、たぶん使い方間違えてるだけじゃない?普通にできたよ?
daemon状態でjoinせずにmain関数終了させたとかないか?
>>469とか>>470はいつの話だ?相当昔のバグだった気がする。

import std.stdio;
import core.thread;
class SubThread: Thread{
this(){ super(&run); }
private void run(){
Thread.sleep(10_000_000);
writeln("finish");
}
}
void main(){
auto t = new SubThread;
t.start();
t.join();
}
473デフォルトの名無しさん:2009/11/05(木) 01:53:03
>>467
書き直した方がいいんじゃなかろうか
Rangeから動的配列を作り出すコストがかかるのでは
474デフォルトの名無しさん:2009/11/05(木) 08:57:58
>>467
std.array.array
475デフォルトの名無しさん:2009/11/05(木) 09:38:01
アレアレ
476デフォルトの名無しさん:2009/11/05(木) 11:27:14
>>473-474
thx

> 入力レンジ r の内容を持った配列を新しくアロケートします。
これはコストが高そうですね。
range使うなら全部range用のコードにしないとあまり旨味がなさそうですね。
477デフォルトの名無しさん:2009/11/05(木) 11:57:04
静的配列ってバイナリに埋め込まれるのですか?ですよね。
なら、全部埋め込むとバイナリが大きくなるから、
コンパイル時に静的配列のシーケンスを生成することはできますか?
何らかの級数なりなんなりであれば、理論的には可能だと思うのですが。
478デフォルトの名無しさん:2009/11/05(木) 13:10:30
>>477
sequenceかなんかで数列を生成してコピーすればいいだけじゃないの?
479デフォルトの名無しさん:2009/11/05(木) 13:18:03
>>476
別にコストっていっても長さのわかってるrangeなら高々長さに比例した時間しか掛からないし、
遅延評価的な挙動では困るときは結局range長さ分のメモリを確保してコピーするしかないのだから
場合によるとしかいえないだろう
480デフォルトの名無しさん:2009/11/05(木) 16:17:58
動的配列を関数の引数で受け取り、関数内で配列の中身を書き換えたら、実引数の配列には影響しませんでした。
これは、refやoutを指定しない限り、配列がコピーされるという事なのでしょうか?

少し上でも話題になっていますが、phobosがstructで書かれている事も含めて、
C++での「基本型以外を引数にする時はconst参照」という習慣をDでもやりたくなってきます。
でも、コピーのコストが気になるからといってrefをつけていたら、in,out,refの意味論からはずれてしまいますよね?(inが使えない)
またconst ref char[]ではstringを受け取れないという問題も発生します。
どういうスタイルで書けばいいのでしょう?
481477:2009/11/05(木) 17:28:38
あれ?なんかおかしなことを言っていますね
すいません
気にしないで下さい
482デフォルトの名無しさん:2009/11/05(木) 18:55:47
>>480
>動的配列を関数の引数で受け取り、関数内で配列の中身を書き換えたら、実引数の配列には影響しませんでした。
>これは、refやoutを指定しない限り、配列がコピーされるという事なのでしょうか?
そんなはずはないでしょ。なにか間違えてるよ。

>少し上でも話題になっていますが、phobosがstructで書かれている事も含めて、
>C++での「基本型以外を引数にする時はconst参照」という習慣をDでもやりたくなってきます。
C++と違ってDのclassはもともと参照型なのでコピーのコストを理由に参照で渡す必要は全くないよね。

>でも、コピーのコストが気になるからといってrefをつけていたら、in,out,refの意味論からはずれてしまいますよね?(inが使えない)
inとref/outは意味として全く違うカテゴリに属すからいいんじゃないの。
まあ、このあたりの言語仕様は整理が必要だとは思うけど。

>またconst ref char[]ではstringを受け取れないという問題も発生します。
>どういうスタイルで書けばいいのでしょう?
immutable(T)[]* を const(const(T)[])* に変換できないのは当然だから、意味を考えてオーバーロードするしかないだろうけど、
動的配列は (size_t, void*) 程度の大きさしかないから参照渡しする必要はないと思うよ。
483デフォルトの名無しさん:2009/11/05(木) 19:38:42
>>482
import std.stdio;
void func(int[] arr) {// outでもrefでもない
  arr.length = 10;
  for (int i = 0; i != 10; ++i) { arr[i] = i; }
}
void main() {
  int[] arr;
  arr.length = 1;
  arr[0] = 100;
  func(arr);
  writeln(arr);
  while(1){}
}
実行結果は100と表示されます。

> C++と違ってDのclassはもともと参照型なのでコピーのコストを理由に参照で渡す必要は全くないよね。
structの時にコピーのコストが問題になります。phobosがstructを使っていますし。

> inとref/outは意味として全く違うカテゴリに属すからいいんじゃないの。
> まあ、このあたりの言語仕様は整理が必要だとは思うけど。
in ref int[] arrとしたくなります(意味論はinで、コピーコストを避けるためにref)。

> immutable(T)[]* を const(const(T)[])* に変換できないのは当然だから、意味を考えてオーバーロードするしかないだろうけど、
> 動的配列は (size_t, void*) 程度の大きさしかないから参照渡しする必要はないと思うよ。
mutableもimmutableも受け取れるconstは便利だと思うので、const refじゃだめだなーと思いました。
484デフォルトの名無しさん:2009/11/05(木) 19:58:56
>>483
長さを変えたらコピーされるのは当然だろうが。アホちゃうの
485デフォルトの名無しさん:2009/11/05(木) 20:07:42
>>484
動的配列って長さ変えたら参照先が別物になってしまうんですか・・・。
実質長さを変えられない(変えたら別物)っていうのは扱いづらく感じるなぁ。
486デフォルトの名無しさん:2009/11/05(木) 20:07:45
>>483
CoWのドキュメント読み直すべき
487デフォルトの名無しさん:2009/11/05(木) 20:08:35
>>485
そのためのrefだろ
488デフォルトの名無しさん:2009/11/05(木) 20:09:19
なんか話がかみ合ってないなw
489デフォルトの名無しさん:2009/11/05(木) 20:10:19
>>485
だから動的配列は長さとポインタのペアだって言ってるがな……
490468:2009/11/05(木) 20:25:54
>>472
ダメでした・・・
join()しても同じ状況になりました。

static this()でstart()しているのですが、
なぜかスレッドが実行されていないことがあるようですorz
491デフォルトの名無しさん:2009/11/05(木) 20:29:10
>>486
なるほど。
Copy-On-Writeなんですね。
しかし、C++の感覚のせいか
*p = ...

p = ...
の区別が表面に見えないのが気持ち悪く感じてしまいます。

>>489
長さとポインタのペアと言っても、C++のstd::vectorみたいなのを想像していました。
492デフォルトの名無しさん:2009/11/05(木) 20:42:59
>>490
それはcore.threadのstatic thisより先に実行される可能性があるからまずくないか
493デフォルトの名無しさん:2009/11/05(木) 20:51:01
>>492
GCが動き始めるときにスレッドの初期化は終わってるはずだから、それは心配しなくていいと思う。
494468:2009/11/05(木) 20:59:56
>>492
20回程度ためしてみたら問題ありませんでした^^
どうやらstatic this()がマズかったようですね・・・

回答ありがとうございました!
495480:2009/11/05(木) 21:41:51
本題から話がそれてしまいましたが、もう少し意見を頂きたいです。
structについて>>480はどう思われますか?
structのコピーのコストを気にするのはD言語らしくないのでしょうか?
496デフォルトの名無しさん:2009/11/05(木) 21:58:38
コピーのコストが気になるに+1票。
組込型はC++のconst T、その他はconst T&相当がデフォルトになるのを希望。
でもまぁ、アラインメント・inline・組み込み関数なんかも整備されないとどうせC++並の
速度は出せないのであまり気にしても仕方ないと思うことにしてる。
497デフォルトの名無しさん:2009/11/05(木) 22:00:53
D言語は最適化がしやすいように作られていると思ったので、仮引数をinにしたら構造体のコピー
なんて実際には起こらないかもしれない、ということを期待することができる。
なので、気にせずにどんどんinで値渡ししていいと思うよ
498デフォルトの名無しさん:2009/11/05(木) 22:09:46
>>496-497
レスthx
コンパイラの最適化にまかせておけば良さそうですね。
499デフォルトの名無しさん:2009/11/05(木) 22:10:42
>497
引数を受け取った関数の中でさらに別の関数へ飛んだらその引数の
アドレスの何かが書き換えられるかもしれないと思うんだけど、
そういうのってどうやって判断するの?
500デフォルトの名無しさん:2009/11/05(木) 22:47:17
何のためのconst/immutableだ
501デフォルトの名無しさん:2009/11/05(木) 23:10:23
よーしパパ
auto b = cast(immutable) a;
a.var = "c";
しちゃうぞー
502デフォルトの名無しさん:2009/11/05(木) 23:54:15
>>500
引数にimmutableなものを渡したからって引数渡しの方法が変わるとは
思えないんだけど、それってどっかに書かれてる?
503デフォルトの名無しさん:2009/11/06(金) 00:03:40
最適化の可能性の話してるんじゃないのか?
504デフォルトの名無しさん:2009/11/06(金) 01:22:45
>>499
inにしたらその引数のアドレスを無理やり取って書き換えるようなことはしてはいけない。
その操作は未定義動作で、最適化によってバグった挙動になっても文句言えない。

でもまぁ現状そういう最適化はされてないみたいで、下記ベンチマークだとfugaの方が3万倍くらい速いみたい。
inの意味が現状のconst refと同じような挙動になればいいなとは思う。

struct XXX{int[0x10000] x;}
size_t gHoge;
void hoge(in XXX x){gHoge += cast(size_t)x.x.ptr;}
size_t gFuga;
void fuga(const ref XXX x){gFuga += cast(size_t)x.x.ptr;}
void main(){
XXX x=void;
foreach (i; 0..100000) hoge(x);
foreach (i; 0..100000) fuga(x);
}
505デフォルトの名無しさん:2009/11/06(金) 02:57:57
immutable型ならポインタ渡しに書き換えても不都合は生じないけど、
関数の引数を弄るとシグネチャが変わってしまったりしてやりづらいのかもしれない
506デフォルトの名無しさん:2009/11/06(金) 04:17:13
最適化がしやすい言語設計になってても実際のdmdはあんま最適化に力入れてないからね。
ベクトル演算遅いし。自動的に非仮想関数になるはずなのにfinalつけたほうが呼び出し早いし。
507デフォルトの名無しさん:2009/11/06(金) 04:26:11
in を scope const じゃなくて ref const にしろと?
508デフォルトの名無しさん:2009/11/06(金) 10:54:55
それは悪くない選択かもしれないけどref型だとimmutable()からconst()への暗黙的変換ができないので、
その辺はコンパイラが適当に面倒をみてくれる方がいいとおもう
509デフォルトの名無しさん:2009/11/06(金) 13:18:10
Pascal系の言語みたく、inは、関数内では書き換え不可の何か渡し、で、
引数型のサイズに応じてレジスタ、スタック、参照渡しを使い分けるようなのをだな……
510デフォルトの名無しさん:2009/11/06(金) 17:25:54
>>474
Σ(゚Д゚)

初めて知った
511デフォルトの名無しさん:2009/11/06(金) 17:35:49
はいはい2.036ですよー
512デフォルトの名無しさん:2009/11/06(金) 20:13:14
> Bugzilla 424: Unexpected OPTLINK Termination at EIP=0044C37B (too many fixups)
キタコレ
513デフォルトの名無しさん:2009/11/06(金) 23:04:19
うーむ
バグなかなか直らないな
514デフォルトの名無しさん:2009/11/07(土) 00:51:00
1年ぐらい放っておくと忘れた頃に直ってる
515デフォルトの名無しさん:2009/11/07(土) 16:40:29
D言語に限った事ではないですが、
テンプレート絡みのコンパイルエラーのメッセージのわかりにくさってなんとかならないんですかね?
例えば、phobosのファイル名と行番号出されても、どこを修正すればいいのかわかりづらいです。
516デフォルトの名無しさん:2009/11/07(土) 17:20:07
* ライブラリの設計者がそこかしこにstatic assertを仕込む
* コンパイラがテンプレート展開のトレースを吐けるようにする
517デフォルトの名無しさん:2009/11/07(土) 17:53:27
std.convとかどこで失敗してるのかわからなくて途方にくれるよな
518デフォルトの名無しさん:2009/11/07(土) 18:07:27
>>516
テンプレート展開のトレースがあったら便利だと思うのですが、C++も含めてないですよね。
作るのが難しいんでしょうか。
>>517
呼び出し元の行番号が表示されてくれれば・・・と思うことがよくあります。
519デフォルトの名無しさん:2009/11/08(日) 00:58:16
import std.range;
void func(in int[] arr) // arrは読み取り専用
{ auto r = retro(arr); }

range.d(515): Error: this is not mutable
const配列のRetroは作れないんでしょうか?
520デフォルトの名無しさん:2009/11/08(日) 04:55:37
import std.range;
void func(in int[] arr) // arrは読み取り専用
{ auto r = retro(arr.dup); }
だとどうなる?
現状、retroがmutableしか受け取らないのが問題
521デフォルトの名無しさん:2009/11/08(日) 12:34:00
>>520
それならいけました。
しかし、const配列のRetroが作れないのって何か理由があるんでしょうか?
mutableの配列しか作れないのは不便だなぁ。
522デフォルトの名無しさん:2009/11/08(日) 17:40:20
あれ?それ普通にできたけど
dmd2036
523デフォルトの名無しさん:2009/11/08(日) 20:00:56
>>522
2034を使っていたのですが、2036にしたらエラーでなくなりましたthx。
524デフォルトの名無しさん:2009/11/09(月) 01:06:12
int func(Range)(in Range r)
{ return r.length; }

void main() {
int[] arr;
auto r = retro(arr);
int i = func(r);
}

Error: function std.range.Retro!(int[]).Retro.length () is not callable using argument types ()

in Range rをRange rに変えればエラーは出なくなります。
constのRetroのlengthを呼び出す事はできないのでしょうか?
525デフォルトの名無しさん:2009/11/09(月) 01:35:27
RetroのlengthがRetroの中身を書き換えないことが明らかなら、castではずしてやればいい。
そのためにconst/immutableのところで
immutable性を取り除くキャストは、正しく静的型がついていないくて、 しかもそれが修正できないという場面で必要となってしまうことがあります。
って述べられてる。
526デフォルトの名無しさん:2009/11/09(月) 08:51:37
uint length(R)(const(R) range);
相当になってて欲しいな
527デフォルトの名無しさん:2009/11/09(月) 09:01:56
いやuint length() const;相当か
528デフォルトの名無しさん:2009/11/09(月) 12:05:55
>>525
なるほど。
しかし、「lengthがRetroの中身を書き換えないことが明らか」なら、
>>526氏に同じく、constのRetroからlengthを呼び出せるようにして欲しいところです。
試しにrange.dの572行目をsize_t length()からsize_t length() constに変えたら呼び出せるようになりました。
単なるconstつけ忘れなんでしょうかね。
529デフォルトの名無しさん:2009/11/09(月) 12:08:42
>>528
ラップされたrangeのlength()がconstでない可能性を考慮するとそう単純な話ではない。
530デフォルトの名無しさん:2009/11/09(月) 12:12:24
>>529
それでも読み取り用のlengthはconstであるべきだし,必ずそうできるはずじゃないですか?

そうでなかったとしたら,constメンバ関数は非constメンバ関数とオーバーロードできるので,
せめて両方を定義しておくべきではないかな.
いや,immutableもあるので3つ定義・・・
いやいや,sharedもあるので4つ・・・・
これどうにかしてくれw
531デフォルトの名無しさん:2009/11/09(月) 12:47:39
>>530
たとえば、rangeの実体がネットワークの向こう側にあって、lengthの取得に通信が必要な場合、
意味的には何か状態を変更する訳じゃないんだけど、型システム上はconstにできないんだよね。

ちなみに今は(mutable), const, immutable, shared, shared constの5つのオーバーロードを用意する必要があるはず
532531:2009/11/09(月) 12:50:36
いや、作り方によってはconstにできるか。
rangeのコンストラクタでコネクションを張って、デストラクタで切る、というようなのを想定してた。
533デフォルトの名無しさん:2009/11/09(月) 12:52:45
>>531
その5つにコンパイル時定数を加えて全部で6つだなw
534デフォルトの名無しさん:2009/11/09(月) 12:52:57
>>531
え?できない?
ダメだ.何でそうなるのかわからない・・・
535デフォルトの名無しさん:2009/11/09(月) 12:58:47
>>533 どんなん?
536デフォルトの名無しさん:2009/11/09(月) 13:02:10
>>535
struct EmptyRange(T) {
enum empty = true;
enum length = 0;
const T front() { assert(0); }
void popFront() { assert(0); }
}
537528:2009/11/09(月) 14:02:59
複雑な問題なんですね。
でも、「const rangeはlengthを呼べません」と言われたら「えっ?」と思ってしまいます。

メンバ関数書く時、C++みたいにconstだけ考えればいいという訳じゃないのは面倒くさいなぁ。
538デフォルトの名無しさん:2009/11/09(月) 16:11:05
>>536
enumはオーバーロードセットに加わってくれないみたいだぞ
import std.stdio;
class A{
int f(){writeln("mutable");return 0;}
int f() const {writeln("const");return 0;}
int f() immutable {writeln("immutable");return 0;}
int f() shared {writeln("shared");return 0;}
int f() const shared {writeln("const shared");return 0;}
//enum f = 0;
}
void main(){
(new A).f();
(new const(A)).f();
(new immutable(A)).f();
(new shared(A)).f();
(new shared(const(A))).f();
}
539デフォルトの名無しさん:2009/11/09(月) 16:33:53
最小でconstさえ定義されていれば他はいらないみたいだ?
540デフォルトの名無しさん:2009/11/09(月) 16:42:03
>>538
そもそもenumは関数じゃないからオーバーロードできない
>>533が言いたいのは「lengthが定数かもしれないからよきに計らえよ」ってことじゃないの
541デフォルトの名無しさん:2009/11/09(月) 16:49:23
>>539
constとconst sharedがいるんじゃね?
542デフォルトの名無しさん:2009/11/09(月) 17:39:56
>>541
だとしたら,shared const修飾されたオブジェクトからは,
shared constメンバしか呼べないようにならないといけないってことかい
543デフォルトの名無しさん:2009/11/09(月) 17:41:29
>>540
意味的に定数だったらenumを使って構文的にも定数にするケースがあるってことね
オーバーロードの文脈だったからもしかしてできるのかと思ったw
544デフォルトの名無しさん:2009/11/09(月) 17:47:08
でもenumにするとダックタイピングできないと思うので(定数は括弧付きで呼べないよね),
enumを使うべきときと,オーバーロードしまくるべきときとはいつも別の場面になりそう

で,話題のlengthはプロパティだからenumでもいいかもしれないけど,
mutableなメンバ関数相当しかない現状からconst性とかを考慮するようにする場合,
lengthをenumで実現することはできなくなるんじゃないかな
545デフォルトの名無しさん:2009/11/09(月) 17:53:16
rangeってconstにすると、lengthどころかforeachで回すことすらできなくなるなぁ・・・。
constで使用されること自体想定されておらず、
読み取り専用で使いたい時はInputRangeを作れっていう事なのかな。
546デフォルトの名無しさん:2009/11/09(月) 18:39:24
日本の日時を取得にはどうやればいいですか?
toUTCString(UTCtoLocalTime(getUTCtime()))とやっても
Mon, 09 Nov 2009 09:35:44 UTC
みたいになります。
547デフォルトの名無しさん:2009/11/09(月) 19:56:21
int[] a = [1, 2, 3, 4, 5];
randomShuffle(a);

auto b = [1, 2, 3, 4, 5];
randomShuffle(b);

2.036にしたらいきなり後者がシャッフルされなくなって心臓止まった
548デフォルトの名無しさん:2009/11/09(月) 19:58:57
医者はどこだ
549デフォルトの名無しさん:2009/11/09(月) 22:05:57
>>547 bは静的配列だから、値型としてrandomShuffleに渡ったんじゃないかな
550デフォルトの名無しさん:2009/11/09(月) 22:25:01
>>542
そうじゃないかな。sharedとれるのはおかしいし
551デフォルトの名無しさん:2009/11/09(月) 22:28:17
>>545
popFrontはレンジの状態を変更するわけだからconstなレンジは先頭を参照するしかできないよ。

constなコンテナはopSlice()でmutableなレンジを返すようにすればforeachに食わせられる
552デフォルトの名無しさん:2009/11/09(月) 22:29:08
>>546
toString
553デフォルトの名無しさん:2009/11/09(月) 22:31:13
DWT生きてた
554デフォルトの名無しさん:2009/11/10(火) 01:10:10
>>552
toUTCStringになっているのを見落としていました。
しかし、toStringに変えても
Mon Nov 09 15:58:55 GMT+0000 2009
このように日本の時間にならないです。
どうすればいいのでしょうか?
555デフォルトの名無しさん:2009/11/10(火) 02:10:30
>>549
順調にお約束や罠が増えてきてるなあ
C++の二の舞だ
556デフォルトの名無しさん:2009/11/10(火) 02:39:20
>>552 本当だ。とっくに死んだかと思ってた。
557デフォルトの名無しさん:2009/11/10(火) 14:31:23
配列リテラルの型を動的配列にしてくれたらいいのに
558デフォルトの名無しさん:2009/11/10(火) 14:46:10
auto[]とか書ければよさそうなもんだけど.
559デフォルトの名無しさん:2009/11/10(火) 16:58:20
>>554
タイムゾーンの設定してるか?
560477:2009/11/10(火) 17:25:39
>>558
パターンマッチみたいだな
561デフォルトの名無しさん:2009/11/10(火) 18:16:07
>>547
auto b = [1, 2, 3, 4, 5];
randomShuffle(b[]);
こうしなきゃならんのか
今すぐref引数に改められるべき
562デフォルトの名無しさん:2009/11/10(火) 18:18:09
結果を引数(のバッファ)に返す書き方はもう止めて
戻り値で返すように統一する方がいいか
563デフォルトの名無しさん:2009/11/10(火) 18:59:47
>>559
すみません、タイムゾーンはどこで指定すればいいのでしょうか?
564デフォルトの名無しさん:2009/11/10(火) 19:03:22
565デフォルトの名無しさん:2009/11/10(火) 19:43:13
>>564
importしてみましたが、結果は変わりませんでした。
うーん、どこがいけないんでしょうか・・・。
566デフォルトの名無しさん:2009/11/10(火) 20:12:35
>>565

import std.stdio;
import std.date;
import std.datebase;

void main()
{
writeln(toString(getUTCtime()));
}

このコードで「Tue Nov 10 20:08:53 GMT+0900 2009」の結果が得られています。
(dmd 2.036 Windows Vista)

お望みの結果はこれで合っていますか?
そちらで同じ結果がでなければdmdのバージョンを上げてみてはいかがでしょう。
他の原因はちょっと思いつかないですね。
567デフォルトの名無しさん:2009/11/10(火) 20:47:21
というかOSの設定が+0000になってるんじゃね?
568デフォルトの名無しさん:2009/11/10(火) 23:06:14
>>566
環境はdmd 2.036 Windows XPなのですが、そのコードは望む結果(GMT+0900)になりました。
しかし、なぜか自分のプログラムに同じコードを書いてもGMT+0900になりませんでした。
違いと言えば、Cから呼び出せるようにextern(C)したDLLなぐらいだと思うのですが、ここに原因があるのかなぁ。

>>567
タスクバーの右の時刻のところでGMT+0900になっていることを確認しました。
569デフォルトの名無しさん:2009/11/10(火) 23:10:38
Dは外部ライブラリをリンクすると色々超常現象が起こって実に楽しい死にたい
570デフォルトの名無しさん:2009/11/10(火) 23:20:00
DのDLLはランタイムの初期化に一癖二癖
571デフォルトの名無しさん:2009/11/11(水) 15:29:31
そういえば>>342がいつの間にかできるようになっていました。
逆にrefなしで受け取ると呼び出し元に反映されないという罠・・・。
>>547の原因もこの変更が影響してるのかも?
572デフォルトの名無しさん:2009/11/11(水) 18:29:54
change logの冒頭に書いてある
* Static arrays are now passed by value to functions rather than by reference

小さな配列を扱うには小気味いいが、大きな固定長配列だと怖いな。
仮引数に配列の長さを指定しなければいいだけの話ではあるが。
573デフォルトの名無しさん:2009/11/11(水) 18:45:38
>>570
公式に書いてある通りRuntime.initialize()を呼び出してるだけなのですが、これでは不十分なんでしょうか?
ググるとDllMainで色々やってるのも出てくるのですが、ページの更新日時が古い物も多くて何を信用すればいいのかわからないです。
574デフォルトの名無しさん:2009/11/11(水) 22:35:07
575デフォルトの名無しさん:2009/11/11(水) 23:27:10
見事に被ってるな
576デフォルトの名無しさん:2009/11/11(水) 23:42:07
構成はクラスとテンプレート/CTFEを抜いたDという感じだな。
文法はCというよりPascal風だ。

5年後くらいにD厨vsGo厨とかいう構図になるかもしれんな。
Py厨vsRuby厨みたいな感じで。
577デフォルトの名無しさん:2009/11/11(水) 23:45:22
GoのinterfaceはDのそれと同じかな。
それとは“違って”革新的なダックタイピング的なものだとすると、
DのRangeで形成されつつあるConcept的な方向性が強化されるかもな。
578デフォルトの名無しさん:2009/11/12(木) 00:03:11
EとFは?
579デフォルトの名無しさん:2009/11/12(木) 00:23:30
Dに信者なんているの?
580デフォルトの名無しさん:2009/11/12(木) 01:37:00
いるかいないかで言ったらいるよな
581デフォルトの名無しさん:2009/11/12(木) 01:41:59

やっぱりVS Goが見えてくるよな
と思ってたら話題になっててワロタ
582デフォルトの名無しさん:2009/11/12(木) 01:57:09
【プログラム】グーグル、C/C++に代わる新言語「Go」をOSSで公開:超高速なコンパイル、GC、並列プリミティブ [09/11/11]
http://anchorage.2ch.net/test/read.cgi/bizplus/1257950853/81

81 名前:名刺は切らしておりまして[sage] 投稿日:2009/11/12(木) 00:58:01 ID:iye+GbXe
>>51
C#やJavaのinterfaceとはまた違うぞ。
C#のinterfaceは対象クラスがinterfaceを実装することを
明示的に記述していなければいけないが、Goだと
ユーザー定義型に対してあるinterface が要求する
メソッドが全て定義されてあれば、型は
そのinterfaceを実装しているとして自動的に看做される。

例えばC#だとinterface IHogeと interface IFugaが同じ
public void foo();を規定するインタフェースであったとしても、
IFugaをインプリメントとしてfoo実装したクラスTのインスタンスは関数
void func1(IHoge arg)
の引数にすることはできんのに対して、
Goだとユーザー定義型がfooを実装していればfunc1の引数にIHoge、IFuga
どちらの制約を要求されていても型のインスタンスは引数となることができる。

・・・・っていう理解であってますかね?
http://golang.org/doc/go_for_cpp_programmers.html
583デフォルトの名無しさん:2009/11/12(木) 02:01:49
Dなどのtemplateでのduck typingは使われている関数さえ定義されていればよい.
Goのinterfaceはすべての関数が実装されていなければならないので,
Dなどのduck typingよりGoのinterfaceの方が制約力は強いってことか.
584デフォルトの名無しさん:2009/11/12(木) 02:06:22
・・・いや・・・違うか
2つは何が異なるんだ
585デフォルトの名無しさん:2009/11/12(木) 02:09:02
IAの変数があったとして,IBがIAのすべての関数を持っていたら,
その変数をIBの変数に代入できるってことかな
継承関係がなくてもいいってところが違う,でいいかな
586デフォルトの名無しさん:2009/11/12(木) 02:19:38
今は亡きECMAScript4のlikeみたいなものかな?
587デフォルトの名無しさん:2009/11/12(木) 02:21:34
>>585
まーそんなとこだな。
要するにconceptみたいなもの
588デフォルトの名無しさん:2009/11/12(木) 06:50:39
if(is(typeof({ /* */ }())));

をきれいに書けるようにしたものでしょ。
ダックタイピングを見えないようにするシンタックスシュガー。要するにコンセプト。
589デフォルトの名無しさん:2009/11/12(木) 10:58:45
ライブラリでやろうとすると大変だが、Dでもコンパイラのサポートがあれば構造体をインターフェイスにキャストする(つまりvtblを組み立てる)のは可能だろうなあ
590デフォルトの名無しさん:2009/11/12(木) 12:37:59
andreiはgoがきにくわないみたいだなw
591デフォルトの名無しさん:2009/11/12(木) 14:02:17
>>590
なんて?w
592デフォルトの名無しさん:2009/11/12(木) 14:33:13
593デフォルトの名無しさん:2009/11/12(木) 16:02:53
言語仕様も標準ライブラリもほぼ読んでないけどarmなlinuxで動くようなので落としてビルド中
GlantankでWebアプリ作ってみたりしてる俺には嬉しいぜ
webアプリ用ライブラリとかも充実してたら嬉しいなぁ
594デフォルトの名無しさん:2009/11/12(木) 19:33:09
>>592
「そこはDが11年前に通過した場所だッッッ」ってことか
595デフォルトの名無しさん:2009/11/12(木) 19:46:56
実際目新しいとこなんてないよな
596デフォルトの名無しさん:2009/11/12(木) 19:59:40
継承を禁止してinterfaceに絞ったことでprematureな構造化を防ぐ効果はあるとは思うが、
反面コピペコードは増えそうな感じだな。
アダプタでなんとかしろってことなんだろうけど、
その意味ではGoにこそalias thisとかopDotが必要な気がするんだが。あるんだっけ?
D規格のうちからbetter Goなサブセットを組むのは難しくないと思われ。
597デフォルトの名無しさん:2009/11/12(木) 20:01:36
11年も前に通過していながらいまだに完成してないというのが
Dにとっての大問題なわけで
goの方が先に完成するならそっちでもいい
598デフォルトの名無しさん:2009/11/12(木) 20:26:03
D終わったと思ってたけど
Goスレ見るとまだまだ終わってないなとは思い直した
しかしここでGoに対抗してDが変にがんばると
よくないような気もする
GoががんばるならDは身を引くべきじゃまいか
599デフォルトの名無しさん:2009/11/12(木) 20:28:56
俺もD終わったと思ったけどよく比較してみると現時点ではやっぱりDの方がいい
Googleの事だから物凄い勢いで発展させるか放り出すかのどっちになることやら
600デフォルトの名無しさん:2009/11/12(木) 20:31:12
>>592
「無視されるなんてくやしいっ…ビクンビクン」というのも入ってるな
601デフォルトの名無しさん:2009/11/12(木) 20:50:03
Re: Go: A new system programing language Andrei Alexandrescu 2009/11/11 16:34
> On Wed, Nov 11, 2009 at 11:25 AM, Bill Baxter wrote:
>> But that's a good list. In the video he makes it sound like generics
>> will probably happen eventually, they're just not sure how best to do
>> it yet.
>
> Just noticed, The Language FAQ[1] says the same thing about
> exceptions. They're interested, just not sure how to do it.
>
> [1] http://golang.org/doc/go_lang_faq.html#exceptions

So they are roughly where D was eleven years ago.

One thing I dislike about Go is the incult attitude it fosters.
Apparently its creators weren't aware about the existence of D, which is
quite difficult in this day and age (D is the *second* result when
searching for system programming language with Google after the
obligatory Wikipedia entry, so it takes a lot of effort to dismiss it as
not being "major" and essentially pretend it doesn't exist). The authors
failed to even exercise due diligence - there's a language called Go!
that has even a book written about (the news is all over
http://www.reddit.com/r/programming/).

Also, the language does not make use of many advances that PL technology
has made in the recent years. These things combined are quite indicative
of an attitude towards language design that I highly disapprove of.

Funny detail - one goal is to avoid "stuttering" (one of the first
examples in the video). Yet "Hello, World" defines package main and
function main in the main file, and imports fmt "fmt".

Andrei
602デフォルトの名無しさん:2009/11/12(木) 21:51:28
言語が終わったとかどうとか、簡単に言い切れるものかな?
スレも立たなくなったときが本当に終わったときじゃまいかと
603デフォルトの名無しさん:2009/11/13(金) 01:12:22
この世にMがいる限りDの灯は消えない。
604デフォルトの名無しさん:2009/11/13(金) 01:13:20
>>598
むしろ張り合うべきだろ
605デフォルトの名無しさん:2009/11/13(金) 01:24:50
いいとこどりしてGoD言語誕生か
606デフォルトの名無しさん:2009/11/13(金) 01:50:41
神言語とは恐れ多いw
607デフォルトの名無しさん:2009/11/13(金) 01:56:56
本当に誰かやりそうで困る。いや困らん
608デフォルトの名無しさん:2009/11/13(金) 02:25:34
・Cへのコードコンバータで
・Goとほぼ同等のことができて
・Dのサブセット
という規格を考えたが、妄想の中にしまっておくことにした
609デフォルトの名無しさん:2009/11/13(金) 02:26:27
>>594
本当にそう言ってるとはw
610デフォルトの名無しさん:2009/11/13(金) 04:23:07
>>600
http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=100668
ヲルタン「Google に出向いて二度も D のスピーチしたのに…D のこと聞いたことある人いるかな?
お手上げっピッ! って客席に聞いたらほぼ全員が挙手してくれたのに…無視だなんてくやしいっ…ビクンビクン」
http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=100681
ヲルタン「(∩゚д゚)アーアーきこえなーい」
611デフォルトの名無しさん:2009/11/13(金) 04:42:42
>>596
selector(x.f式の記法)が完全にオーバーロードセット的なものになっているが、
構造体の無名フィールドを作るとその型のフィールドとメソッドが外側の構造体のオーバーロードセットに加わることで
これが実装の継承として機能する、ということのようだね。

この仕様はalias thisやopDotより好きかもしれん。
多重継承がかなりやりやすくなる。
が、暗黙の型変換があるほうが好きなのでalias thisもいいなあとか。
集成体メンバなら複数alias thisできれば素敵なのに。
612デフォルトの名無しさん:2009/11/13(金) 07:43:58
http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=100775

Walter Bright wrote:

There's a lot in there we could use in the D library:
http://golang.org/pkg/


ワロタ
613デフォルトの名無しさん:2009/11/13(金) 10:56:35
goの記事見て久しぶりにこっち来たんだが
Dの方は最近どうなの。仕様が固まったり良いことあったりしないのけ。
614デフォルトの名無しさん:2009/11/13(金) 11:03:12
>>613
今年中には本を出してD2の仕様を固めて、D3の開発に移行する予定
615デフォルトの名無しさん:2009/11/13(金) 12:46:45
うぉるたんがキレてGoのライブラリを吸収し始め、Phobosが最強のライブラリになることを希望。
616デフォルトの名無しさん:2009/11/13(金) 12:55:35
さすがアンゴルモアの大王
617デフォルトの名無しさん:2009/11/13(金) 13:01:28
>>611
alias this相当の機能もあるみたいだぜ

http://golang.org/doc/effective_go.html#embedding
_ とおりすがり (2009-11-13 10:35)

実装の共有は、型の埋め込み(embedding)で表現できるようです。
ttp://www.rubyist.net/~matz/20091113.html#c01
type A struct {
Foo;
x int;
}
コンポジションのように見えますが、このケースでは Foo のメソッドが
A のメソッドとして露出(昇格)するので、明示的な委譲は不要 です。
もちろん、Foo のメソッドを A のメソッドが上書きすることも可能ということで、
今後の発展をニヤニヤしながら見守りたいですね(えらそう)。
618デフォルトの名無しさん:2009/11/13(金) 13:05:20
あ,リンクの埋め込み場所の編集をミスって逆になった
619デフォルトの名無しさん:2009/11/13(金) 13:34:47
>>614
ありがとう。D3の仕様が固まりつつある頃にまた戻ってくるかw
620デフォルトの名無しさん:2009/11/13(金) 14:20:10
621デフォルトの名無しさん:2009/11/13(金) 18:04:01
>>615
うぉるたんが鬱になってないかどうか心配
622デフォルトの名無しさん:2009/11/13(金) 19:52:23
goてexception無いのか
その根拠は説明してるみたいだけどえーご読めねぇや
「この先入れるかも」かもみたいに書いてある気がするけど
誰か翻訳してくれる人はいませんかねぇ……(チラリ
623デフォルトの名無しさん:2009/11/13(金) 20:06:56
>>622
複雑になるとかめんどいとかしか書いてないぞ。
624デフォルトの名無しさん:2009/11/13(金) 21:44:49
>>623
あ、そうっすか……ありがとうございます。

なんか見れば見るほど全然Dと被ってるようには見えなくなってきたんだけど、
俺が本質を見抜くだけの能力を持ってないだけなんだろうか。
個人的に期待したようなものではなさそうだけど、
Duck Typingとか言語レベルでのConcurrencyとか、
今まで何となく避けてきた概念をじっくり考察してみるかって気にはなってきた。
625デフォルトの名無しさん:2009/11/13(金) 22:13:20
「ネイティブに落ちるコンパイラを持っててGC有りで、C/C++の置き換えを目指していてLL的な開発効率を求めている」
と言ってしまうとDとGoのどっちも当てはまるけど、Dが言語レベルでの堅牢性や最適化の可能性を追求しているのに対して、
Goは「JavaScriptをネイティブで動くようにしてみました」なんて感じの雰囲気がするね。

GoがPythonに似てるとか言われてるけど、設計思想的にはDのほうがPythonに近いと思う。
626デフォルトの名無しさん:2009/11/13(金) 23:46:03
例外はないならないで例外安全とか考えなくていいしな
627デフォルトの名無しさん:2009/11/14(土) 00:06:04
ないとマクロやsetjmpを使うような黒魔術的なものが蔓延るからなぁ
多少ダメでもないよりはあったほうがずっといいと思うが
628デフォルトの名無しさん:2009/11/14(土) 00:16:38
なぁに、gotoで解決さ
629デフォルトの名無しさん:2009/11/14(土) 00:19:58
>>627
そうなの?>蔓延る
異常系のフローを正常系から独立させるのは例外の提唱以前からやられていたことなんだと想像するけど
630デフォルトの名無しさん:2009/11/14(土) 00:31:05
フローの独立自体じゃなくて、各々のプログラム/ライブラリが互換性のない方法で
それをやってライブラリ同士を組み合わせて使用するのが難しくなるのが問題なんだよ
631デフォルトの名無しさん:2009/11/14(土) 00:36:50
Goの名称の代替案の"Issue 9"が神すぎるw
632デフォルトの名無しさん:2009/11/14(土) 02:36:49
"Going : Go is not Go!"もなかなか
633デフォルトの名無しさん:2009/11/14(土) 02:56:37
>>632
面白いけどググりにくいなやっぱ。
634デフォルトの名無しさん:2009/11/14(土) 12:37:51
もうプログラミング言語"ぐ"でいいんじゃね
635デフォルトの名無しさん:2009/11/14(土) 14:23:42
>>633
そこは「わが社の優秀な検索エンジンならこのとおり!」じゃね?
636デフォルトの名無しさん:2009/11/14(土) 18:10:19
goも何回かぐぐってたらgolang.orgが一番上に出るようになったし、そんなに困らないのかもなあ
637デフォルトの名無しさん:2009/11/14(土) 19:31:59
>>636
公式はでるんだろうけど、その他のサイトとかがでない。
638デフォルトの名無しさん:2009/11/14(土) 21:48:22
Dはgoに対抗してdoroutineつくるべき
639デフォルトの名無しさん:2009/11/15(日) 02:14:23
たしかに予約語doはもっと有効活用したいよな。
640デフォルトの名無しさん:2009/11/16(月) 03:33:57
最近のMLの話題:
- opPow, opDollarくれ
- 配列リテラルはimmutableにしてくれ
- ついでに配列リテラルの型も変えたい
- new廃止しようぜ
- typedef廃止しようぜ
- Cスタイルの関数宣言/配列宣言廃止しようぜ
- Goのあの機能いいよな
641デフォルトの名無しさん:2009/11/16(月) 12:17:09
Dはどこに行こうとしてるんだ……
642デフォルトの名無しさん:2009/11/16(月) 12:50:50
another Dimension
643デフォルトの名無しさん:2009/11/16(月) 18:02:43
>>640
これらも気になる
- switchはデフォルトbreakにしよう
- Cocurrencyそろそろ入るかも(Created by Sean?)
- Phobosにコレクション入れよう
- TangoはSeanとDonの部分はBoostライセンスOKなので問題は他
- foreachはRangeのindexとれるべき

opPowとか途中から追ってないんだけど結局どうなったの?
opPowは入っても他のオブジェクトでの使い道がいまいち
644デフォルトの名無しさん:2009/11/16(月) 19:01:26
- Phobosにコレクション入れよう

これいつ書いても「誰かがやってるだろ」で誰もやらないんだよなw
645デフォルトの名無しさん:2009/11/16(月) 21:12:29
そして運ばれてくるtango2.0
646デフォルトの名無しさん:2009/11/18(水) 11:46:21
I've been looking at forcing an order of eval on all expressions. -- Walter
647デフォルトの名無しさん:2009/11/18(水) 18:09:16
検索して見つかった要素のインデックスが欲しい時
import std.algorithm;
import std.iterator;
auto r = find(range, value);
if(!r.empty){
index = begin(r) - begin(range);
}else{
...}
もっとすっきりと書く方法はないですか?
648デフォルトの名無しさん:2009/11/18(水) 18:46:51
>>647
仮に配列以外にイテレータが実装されたとしても、イテレータの差は求められるとは限らないからなあ。
649デフォルトの名無しさん:2009/11/18(水) 18:50:35
>>648
なるほど、rangeが何であるかによって>>647の方法も使えないんですね。
std.string.indexOfのような物が欲しい。
650デフォルトの名無しさん:2009/11/18(水) 20:02:04
distanceないのか?
651デフォルトの名無しさん:2009/11/18(水) 22:37:34
というかなんでindexOfが文字配列以外に使えないんだ
652デフォルトの名無しさん:2009/11/18(水) 22:44:14
文字列の検索は要素ごとに比較すればいいような単純なものでないからじゃ
653デフォルトの名無しさん:2009/11/18(水) 23:35:23
質問を勝手に自分の理解できる範囲の問題に解釈し直すのはいくない
654デフォルトの名無しさん:2009/11/19(木) 02:28:43
assert(2 == count!"true"(until([ 1, 3, 5, 7, 9 ][], 5)));

これしか思いつかん
655デフォルトの名無しさん:2009/11/19(木) 02:34:46
lengthでよくね
656デフォルトの名無しさん:2009/11/19(木) 04:37:36
walkLengthか
657デフォルトの名無しさん:2009/11/19(木) 11:04:49
walkLength
そんなものがあったのか
658デフォルトの名無しさん:2009/11/19(木) 15:29:18
>>654
なるほど、untilが使えるんですね。
>>656
C++のstd::distance的な物ですね。

しかし、検索した要素のインデックスを得る処理に使う関数の名前がuntilというのも・・・。
やはりindexOfのような物がry
659デフォルトの名無しさん:2009/11/22(日) 00:00:36
うpでとまだー
660デフォルトの名無しさん:2009/11/22(日) 00:22:29
Goが出てからDコミュニティの活性化も異常だったからなぁ。
今回の更新は期待大だ
661デフォルトの名無しさん:2009/11/22(日) 01:04:33
やっぱ宿命のライバルみたいなのは必要だよな
662デフォルトの名無しさん:2009/11/22(日) 03:48:58
文字列を区切り文字で分割したい時、std.string.splitを使いますが、
複数の区切り文字で分割したい時はどうやればよいのでしょう?
例えば" "または","を区切り文字として分割したいです。
663デフォルトの名無しさん:2009/11/22(日) 03:51:10
std.regexp.split
664デフォルトの名無しさん:2009/11/22(日) 04:18:50
>>663
ありです。
std.string.splitは簡易版なんですね。
665デフォルトの名無しさん:2009/11/22(日) 06:06:57
"No love for foreach_reverse? <tear>" -- Walter
666デフォルトの名無しさん:2009/11/22(日) 06:22:43
>>661
だよね
いままでのんびりしすぎてたんだ
もっと危機感もってやらないと
667デフォルトの名無しさん:2009/11/22(日) 08:21:40
phobosのtrunkを見ると楽しみだ
$(LI Conditional expressions ?: can now be modifiable lvalues.)
$(LI The type inferred from an
$(LINK2 expression.html#ArrayLiteral, $(I ArrayLiteral))
is now a dynamic array, not a static one.)
$(LI Added support for $(I op)= for array.length)
$(LI Array and associative array types are now determined by using ?: across
all the elements, not just using the first one.)
$(LI Array concatenation with elements now allows implicit conversion of
the elements to the array element type.)
$(LI No more comma operators allowed between [ ].)
$(LI ClassInfo now merged into TypeInfo_Class.)
$(LI $(BUGZILLA 3380): [tdpl] typeid(obj) should return the dynamic type of the object)
)
$(BUGSFIXED
$(LI $(BUGZILLA 111): appending a dchar to a char[])
$(LI $(BUGZILLA 3375): [tdpl] Ternary operator doesn't yield an lvalue)
668デフォルトの名無しさん:2009/11/22(日) 08:24:29
とうとう配列リテラルが動的配列になる!
[1,2,3][]とかしなくてもいいぞ
669デフォルトの名無しさん:2009/11/22(日) 08:30:18
配列リテラルを静的配列にするには[1,2,3][0..$]ってしなきゃいけないじゃん面倒。
670デフォルトの名無しさん:2009/11/22(日) 08:45:26
>>669
それでも性的配列にはならないだろう
671デフォルトの名無しさん:2009/11/22(日) 08:58:35
auto x = { int[3] t = [1,2,3]; return t; }();
672デフォルトの名無しさん:2009/11/22(日) 09:00:17
それスライスだよね
int[3] a; a[] = [1,2,3];
int[3] b = [1,2,3];
どっちかでいいんじゃないの
673デフォルトの名無しさん:2009/11/22(日) 10:10:35
なんにしても宣言が必要だからなー
674デフォルトの名無しさん:2009/11/22(日) 18:51:25
どちらかにしかならんしな
分ける構文も思いつかない
675デフォルトの名無しさん:2009/11/23(月) 00:50:55
gdcはもう更新されないのかと思ったら、こんなのがあるんだな。
ttp://www.digitalmars.com/d/archives/D/gnu/Update_of_gdc_status_of_2009_10_04_3516.html
676デフォルトの名無しさん:2009/11/23(月) 07:59:40
int[3](1,2,3)

とか
677デフォルトの名無しさん:2009/11/23(月) 08:18:30
import std.stdio;
import std.math;

struct pow {
 static auto opDiv_r(T)(T x) {
  struct S {
   T x;
   auto opDiv(T)(T y) {
    return std.math.pow(x, y);
   }
  }
  return S(x);
 }
}

void main() {
writeln(2. /pow/ 3);
}
678デフォルトの名無しさん:2009/11/23(月) 08:44:23
なにそれこわい
679デフォルトの名無しさん:2009/11/23(月) 19:52:06
なんということヲ…
680デフォルトの名無しさん:2009/11/23(月) 20:23:04
auto a=new[1,2,3];
auto b=[1,2,3];
これでどう?
681デフォルトの名無しさん:2009/11/24(火) 12:49:01
2年ほど離れてるうちに何かよく分からない言語になったっぽい
682デフォルトの名無しさん:2009/11/24(火) 18:10:55
void func(T)(T t){
auto file = new std.stream.File("hoge", FileMode.In);
/* ここでTの型によって様々な処理 */
file.read(t);
}

ここでTがenum型Hogeである時、下記のエラーがでます。
Error: function std.stream.Stream.read called with argument types:((Hoge))
matches both:
  std.stream.Stream.read(out int x)
and:
  std.stream.Stream.read(out dchar x)

std.traitsにenumを判別する物がなく、enumの時だけ処理を挟む事もできなくて困っています。
このオーバーロードのエラーを解決するにはどうすればいいのでしょうか?
683デフォルトの名無しさん:2009/11/24(火) 20:11:44
>>682
static if( is( T == enum) ) ...
とかで分岐して、
file.read(cast(int)t);
型を明示して呼び出せばとかなんとか
684デフォルトの名無しさん:2009/11/24(火) 20:28:02
>>683
ありがとうございます。
static if( is( T == enum) ) .と簡単に判別できたんですね。
685デフォルトの名無しさん:2009/11/24(火) 20:40:49
enumのベース型はintとは限らないから
static if( is(T X == enum) ) ...
とかするといいよ
686デフォルトの名無しさん:2009/11/24(火) 21:23:55
>>681
大丈夫、D1は変わってない


ごめんやっぱり大丈夫じゃない
687デフォルトの名無しさん:2009/11/25(水) 03:32:16
functional.d(176): Error: static assert "Bad binary function q{a == b}. You need to use a valid D expression using symbols a of type Hoge and b of type char[]."
このエラーの箇所はどうやって特定するのが効率的でしょうか?
コードを目で追って、述語を使う関数に実引数Hoge型変数とchar[]型変数を渡して呼び出しているところを探す方法しか思いつきません・・・。
688デフォルトの名無しさん:2009/11/25(水) 16:42:25
それしかないんじゃね
689デフォルトの名無しさん:2009/11/25(水) 18:21:06
>>688
それしかないですか・・・。
実引数の型名は分かってもインスタンス名は分からないし、"a == b"もデフォルトだから省略して書いてるだろうし、検索できないのがつらい・・・。
690デフォルトの名無しさん:2009/11/25(水) 19:19:39
-vオプションつけてコンパイルしてみるとか
どこまでコンパイルが進んでからエラーになったか確認すれば
どこがおかしいか分かるかもしれない
691デフォルトの名無しさん:2009/11/25(水) 19:43:08
初心者はとかくデバッグが出来ないからなぁ
692デフォルトの名無しさん:2009/11/25(水) 20:40:06
劣悪な環境が当たり前になるのも考えものだけどな
693デフォルトの名無しさん:2009/11/25(水) 20:53:26
ちゅーか,conceptが欲しいって言ってるのに等しいから初心者かどうかは関係なかと
694デフォルトの名無しさん:2009/11/25(水) 20:58:11
至る所にstatic assert埋め込めばいい
695デフォルトの名無しさん:2009/11/25(水) 21:02:57
そして行方不明になるassertion失敗の原因箇所
696デフォルトの名無しさん:2009/11/25(水) 21:05:17
>>693
VCならインスタンス化したとことエラーになったとこの両方を出してくれる
697デフォルトの名無しさん:2009/11/25(水) 21:06:44
pragma(msg)がもう少し高機能にならないかなー
型を渡したら型名出してくれるとか
698デフォルトの名無しさん:2009/11/25(水) 21:19:48
>>697
stringof
699デフォルトの名無しさん:2009/11/25(水) 21:31:54
>>698
でも
template Te(T) { pragma (msg, T.stringof); }
mixin Te!(int);
とやっても"int"とは出………るじゃないか

"T"って出て途方に暮れたような記憶があるがさてはスタンド攻撃か
700デフォルトの名無しさん:2009/11/25(水) 21:42:59
>>699
それいつの間にか直ってたね
俺もこないだ気づいた。
701デフォルトの名無しさん:2009/11/26(木) 00:45:09
いつの間にw
702デフォルトの名無しさん:2009/11/26(木) 13:15:54
こうして調教されていくね。劣悪な環境に変わりはないんだけどw
703デフォルトの名無しさん:2009/11/28(土) 02:28:18
public enum OpenMode: string
{
 In   = "r", /// 読込用
 OutNew = "w", /// 書込用
 Append = "a", /// 追記用
}

Error: Integer constant expression expected instead of "r"
Error: Integer constant expression expected instead of "w"
Error: Integer constant expression expected instead of "a"
Error: Integer constant expression expected instead of "r"
Error: Integer constant expression expected instead of "w"
Error: Integer constant expression expected instead of "a"

どこが不正なのでしょう?
704デフォルトの名無しさん:2009/11/28(土) 03:14:28
コンパイラのバグ
705デフォルトの名無しさん:2009/11/28(土) 03:20:18
文字もいけるのか
なんかenumおかしいな
706デフォルトの名無しさん:2009/11/28(土) 05:32:57
ん?Dって文字列を<で比較できたっけ
707デフォルトの名無しさん:2009/11/28(土) 08:41:13
なんか言い出したぞ

"dynamic classes and duck typing" - Walter

One thing Java and Python, Ruby, etc., still hold over D is dynamic classes, i.e. classes that are only known at runtime, not compile time. In D, this:

s.foo(3);

could be emulated with:

s.dynamicMethod("foo", 3);

Unfortunately, that makes it impossible to use s with generic code (besides looking unappealing). But with a small feature, we can make this work:

struct S
{
...
T opDynamic(s : string)(args...);
}

and then s.foo(3), if foo is not a compile time member of s, is rewritten as:

s.opDynamic!("foo")(3);

and opDynamic defers all the nuts-and-bolts of making this work out of the language and into the library.

In particular, opDynamic's parameter and return types should all be instances of std.variant.

(This has come up in various forms in this n.g. before, but I don't have any references handy.)
708デフォルトの名無しさん:2009/11/28(土) 08:59:06
えええええ
709デフォルトの名無しさん:2009/11/28(土) 09:32:47
std.xmlが最初の実験台に
710デフォルトの名無しさん:2009/11/28(土) 10:10:15
まーたウォルたんの思いつきが始まったよ。いいぞもっとやれ
711デフォルトの名無しさん:2009/11/28(土) 10:16:38
そういうのやるならシンボル型入れてくんねーかな
712デフォルトの名無しさん:2009/11/28(土) 11:11:52
>>711
文字列でいいだろ
713デフォルトの名無しさん:2009/11/28(土) 12:03:51
>>707
読むのが怖いので誰か翻訳コンニャクを
714デフォルトの名無しさん:2009/11/28(土) 13:03:18
>>709
E4X級の離れ業ができればともかく、要素名で参照できる程度じゃあまり役に立ちそうにないな
715デフォルトの名無しさん:2009/11/28(土) 18:19:18
斜め読みだけどC#4.0のdynamic classと同じような機能?
716デフォルトの名無しさん:2009/11/29(日) 06:03:26
>>715
違うな。
C#はランタイムリフレクションを使うが、あくまでDはコンパイルに決定される
717デフォルトの名無しさん:2009/11/29(日) 11:24:07
hoge(p) { return p; } とかで
T hoge(T)(T p){ return p; } まで推論してくれないかなあ
718デフォルトの名無しさん:2009/11/29(日) 11:35:52
>>717
パースするのに都合が悪いな

auto hoge(auto p) { return p; }

ぐらいならできるだろうが
719デフォルトの名無しさん:2009/11/29(日) 12:18:49
opApplyで受け取ったデリゲートを外に逃がすとやっぱまずい?
継続みたいなちょっと面白そうな気がしたんだけど
720デフォルトの名無しさん:2009/11/29(日) 15:22:12
>>719
外へ出すのはかまわないだろうが、opApplyから帰った後に呼ぶのはまずそう
721デフォルトの名無しさん:2009/11/29(日) 15:45:47
opDispatchと累乗演算子が追加されたようです (DMDのtrunkより
そんなことよりD2の安定化はまだですか…?
722デフォルトの名無しさん:2009/11/29(日) 15:48:27
来年の10月です
723デフォルトの名無しさん:2009/11/29(日) 16:51:26
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
724デフォルトの名無しさん:2009/11/29(日) 21:14:00
入門者の単純な質問で申し訳ないんだけど

Dで手っ取り早くコンソール(Windows)に日本語を出力しようと思ったら、
PhobosじゃなくてTangoを使ったほうがいいの?

writefln(toMBSz("日本語", 932));
とかやってもだめだったから、Tangoがこのへん頑張ってくれてるなら切り替えるつもり
725デフォルトの名無しさん:2009/11/29(日) 21:28:11
printf(toMBSz("日本語\n" ~ "\0"));

まあtangoの方がいいかも
しかし今時D1ってのもなぁ
726デフォルトの名無しさん:2009/11/29(日) 21:57:52
printf("%s", toMBSz("日本語"));

でいい
727デフォルトの名無しさん:2009/11/29(日) 22:00:35
wprintf("日本語"w);
728デフォルトの名無しさん:2009/11/29(日) 22:56:35
あ、toMBSz()で\0つくのか
お馬鹿さん!俺のお馬鹿さん!
729デフォルトの名無しさん:2009/11/30(月) 00:21:09
WindowsのコンソールがまともにUTF8に対応してくれればいいんだけど
730デフォルトの名無しさん:2009/11/30(月) 00:44:12
UTF-16なら対応してるよ
731デフォルトの名無しさん:2009/11/30(月) 09:16:53
| nkf -sjisを良く使う
.net嫌いじゃないならPowerShellもutf16
出力だけならput(wchar) {WriteConsole.. }でrange対応できるかもな
732デフォルトの名無しさん:2009/11/30(月) 09:42:34
import std.algorithm;
struct Con
{
import std.c.windows.windows;
void put(wchar a) { WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), &a, 1, null, null); }
}
void main()
{
copy("日本語"w, Con());
}
733デフォルトの名無しさん:2009/11/30(月) 10:44:40
import std.algorithm, std.range;
struct Con
{
import std.c.windows.windows;
void put(wchar a) { WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), &a, 1, null, null); }
wchar front() { return ib; }
private wchar ib;
bool empty()
{
if (ib == 26) return false;
DWORD rn;
ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &ib, 1, &rn, null);
return ib == 26; // eof
}
void popFront() {}
}
void main()
{
auto buffer = new wchar[10];
copy(take(10, Con()), buffer[]);
copy(buffer, Con());
}

入力にも対応した
734デフォルトの名無しさん:2009/11/30(月) 10:53:51
if (ib == 26) return true;
empty間違えてた
735デフォルトの名無しさん:2009/11/30(月) 17:09:41
ベースはそれでもいいけどwritefln/readlnくらいわかりやすいラッパーが欲しい
736デフォルトの名無しさん:2009/11/30(月) 18:57:58
void writeln(...)
{
void putc(dchar c) { Con().put(std.utf.toUTF16([c])[0]); }
std.format.doFormat(&putc, _arguments, _argptr);
}
737デフォルトの名無しさん:2009/11/30(月) 19:07:49
string readln() { return std.utf.toUTF8(array(until(Con(), cast(wchar)10))); }
738デフォルトの名無しさん:2009/11/30(月) 21:04:06
>>729
同意
739デフォルトの名無しさん:2009/11/30(月) 21:50:57
PowerShellが対応してないと知って顎外れたわ
740デフォルトの名無しさん:2009/12/01(火) 05:14:15
>>739
だってそれshellやん。コンソールが対応せな意味ない
741デフォルトの名無しさん:2009/12/01(火) 14:34:38
Shift_JISのファイルからstd.c.stdio.getcで日本語を読み込みたいのですが、
UTF-8のstringにうまく直せませんorz

s ~= std.windows.charset.fromMBSz( (std.conv.to!(string)( c ) ~ "\0").ptr );

何かいい方法はないでしょうか?
742デフォルトの名無しさん:2009/12/01(火) 17:58:53
そらで書いた
string s = fromMBSz(cast(immutable char*)read("hoge.txt"));
743741:2009/12/01(火) 20:41:01
1文字ではなくて文字列ごと変換したら出来ました!
やはりマルチバイト文字だと文字コードの途中なため、
うまく直せないのかな?
744デフォルトの名無しさん:2009/12/01(火) 22:04:56
>>743
そりゃ無理だろ。普通に考えて
745デフォルトの名無しさん:2009/12/02(水) 06:20:44
structのコンストラクタが引数をとれないのってなんか理由あるの?
std.randomのMTがfrontとpopFrontのなかで、
『ちゃんと初期化されてるかチェック』してるのが気持ち悪い(速度にも影響するだろうし)。
コンストラクタで初期化できれば必要なくなるのに……。
746デフォルトの名無しさん:2009/12/02(水) 09:13:31
引数はとれるだろ。引数を取らないコンストラクタを書けないだけで
747デフォルトの名無しさん:2009/12/02(水) 10:55:04
力のない人が std.random 見てきましたよ

初期化のチェックを省くのは class で作り直すか
言語の仕様変更がないと無理なんじゃないか?

あと多分 >746、 >745 は
 「コンストラクタが引数をとれない〜」は
 「引数を取れないコンストラクタが作れない〜」の
書き間違いの予感
std.random の MersenneTwisterEngine は引数ありの
コンストラクタが書いてあったので見てるはず

俺は書けない理由は分からないな
書きにくくしてあまり使われないようにしてるとかかな?
748747:2009/12/02(水) 11:05:37
色々間違ってると思うのでツッコミ宜しくお願いします

書きこむ前にアルゴリズムの勉強が必要だった予感がしてきた
749747:2009/12/02(水) 11:25:29
良く見て来た
俺のレスは全部なかった事に…orz

746もわかってあのツッコミだったのかな、スマヌ

でもチェック無くすにはstructじゃなくてclassなら出来るのと
今のstructの仕様だと引数無しのコンストラクタが書けても
front, popFront初期化チェックが省けないのは間違ってないよね?
コンストラクタ使わなくてもインスタンス化出来るんだし…
750745:2009/12/02(水) 14:40:42
>>747-749
いや、書き間違いです。全体的にその理解で合ってます申し訳ない。やっぱ人間寝ないと駄目だな……。
C++だと呼び出しなしのインスタンス化=引数無しのコンストラクタ呼び出しだったはずだから、そうなってないのは何でかなと。

POD型は"自明な"コンストラクタとデストラクタを持った型、らしいから、
そもそも構造体のコンストラクタは引数をそのままデータメンバに与えるような使い方しか想定してないってことかなあ。
751デフォルトの名無しさん:2009/12/03(木) 00:01:51
opDispatchとか使いこなせる自信ねえよw
752デフォルトの名無しさん:2009/12/04(金) 11:31:56
opDispatchはライブラリ作る人用のおもちゃだから気にしなくていいよ
753デフォルトの名無しさん:2009/12/05(土) 13:35:27
Version D 2.037 Dec 3, 2009
New/Changed Features

* Conditional expressions ?: can now be modifiable lvalues.
* The type inferred from an ArrayLiteral is now a dynamic array, not a static one.
* Added support for op= for array.length
* Array and associative array types are now determined by using ?: across all the elements, not just using the first one.
* Array concatenation with elements now allows implicit conversion of the elements to the array element type.
* No more comma operators allowed between [ ].
* ClassInfo now merged into TypeInfo_Class.
* Bugzilla 3379: [tdpl] Parameter names not visible in the if clause of a template
* Bugzilla 3380: [tdpl] typeid(obj) should return the dynamic type of the object
* Removed -safe command line switch, added -noboundscheck command line switch.
* Bugzilla 3481: PATCH: opPow(), x ^^ y as a power operator
* Added opDispatch
* properties can only have 0 or 1 arguments
* properties cannot be overloaded with non-properties
* std.math: Added FloatControl, IeeeFlags for enabling floating-point exceptions.
* std.math: Inverse trig functions are now pure nothrow.
754デフォルトの名無しさん:2009/12/05(土) 13:52:32
なんかいっぱい来たな
755デフォルトの名無しさん:2009/12/05(土) 13:53:19
>* Removed -safe command line switch, added -noboundscheck command line switch.
-safeがいつまで経ってもまともに使えるようにならないと思ったら
756デフォルトの名無しさん:2009/12/05(土) 16:49:23
Added support for op= for array.length
お、嬉しい。けどプロパティ全般じゃなくて、配列長だけなのか……。
757デフォルトの名無しさん:2009/12/05(土) 21:33:44
x ^^ y とか、ぶっ殺したくなる顔だな
758デフォルトの名無しさん:2009/12/05(土) 22:26:49
d ^^ b
759デフォルトの名無しさん:2009/12/05(土) 22:29:25
m ^^ m
760デフォルトの名無しさん:2009/12/05(土) 22:36:27
0^^0
761デフォルトの名無しさん:2009/12/05(土) 23:20:16
8^^8
762デフォルトの名無しさん:2009/12/05(土) 23:26:55
なんかこうヤマトタケル的な
763デフォルトの名無しさん:2009/12/06(日) 02:15:42
char[][] hoges;
char[] hoge;
hoges = remove!((char[] a){ return a == hoge; })(hoges);

Error: template instance remove is not a template declaration, it is a overloadset
2.037を入れたら既存のコードがコンパイルエラーになってしまいました。
どう修正すればいいのでしょうか?
764デフォルトの名無しさん:2009/12/06(日) 04:04:31
バグっぽいけど
765デフォルトの名無しさん:2009/12/06(日) 04:06:10
1つの関数removeに特定できないって言ってるのかな?
766デフォルトの名無しさん:2009/12/06(日) 07:56:05
これからも僕を応援して下さいね^^山崎渉
Unicodeシンボルって怖いよね
767デフォルトの名無しさん:2009/12/06(日) 08:00:31
opDispatch は仕様が書いてないからしばらくは名前だけの存在になるかなあ
768デフォルトの名無しさん:2009/12/06(日) 11:44:50
removeは以前からオーバーロードがややこしい事になってた気がする
片方removeAtとかにすればいいのに
769デフォルトの名無しさん:2009/12/06(日) 22:33:54
>>764,765,768
algorithm.dを見ても引数1つのremoveは1つしかないのに・・・と不思議に思います。
とりあえず古いverに戻す事にします。どうもでした。
770デフォルトの名無しさん:2009/12/06(日) 23:16:21
alias std.algorithm.remove remove;
とかしてもだめなの?
771デフォルトの名無しさん:2009/12/06(日) 23:44:49
>>770
モジュール間ではオーバーロードセットを形成できないから関係ないと思うよ
772デフォルトの名無しさん:2009/12/07(月) 00:11:27
>>770
thx
それをやったらエラーが出なくなりました。

そしてもう1つ、2.036から2.037にした事によって出るエラーが・・・。
Error 42: Symbol Undefined _D9ClassInfo6__vtblZ
原因がわからないのでやっぱり2.036に戻すことにします。
773デフォルトの名無しさん:2009/12/07(月) 00:48:21
ClassInfo now merged into TypeInfo_Class.が関係ありそうな。
774デフォルトの名無しさん:2009/12/07(月) 00:51:42
>>772
ChangeLogにあるけど,ClassInfoはTypeInfoにマージされたからそれの影響かと
775デフォルトの名無しさん:2009/12/07(月) 12:13:50
>>771 え?そのためのaliasでしょ?
776デフォルトの名無しさん:2009/12/07(月) 12:54:21
だとするとエラーメッセージが間違ってるのか
777デフォルトの名無しさん:2009/12/08(火) 05:20:20
struct Hoge{...}
void foo(ref Hoge hoge){...}

void main(){
Hoge hoge;
hoge.foo();
}

D言語って関数をメンバ関数風に呼び出す事ってできませんでしたっけ?
エラーが出てしまいます。
Error: no property 'foo' for type 'Hoge'
Error: function expected before (), not __error of type int
778デフォルトの名無しさん:2009/12/08(火) 05:29:01
>>777
配列だけじゃない?
779デフォルトの名無しさん:2009/12/08(火) 06:05:41
>>778
どうもです。
配列だけかー。
780デフォルトの名無しさん:2009/12/09(水) 03:52:04
bugzillaってsummaryが英語で書けなくてバグ報告自体を挫折するよね
781デフォルトの名無しさん:2009/12/09(水) 04:03:20
>>780
サマリなんて後からでも書き直せるし正直適当でいい
"Foo is wrong"みたいなのでも全然おk
782デフォルトの名無しさん:2009/12/09(水) 04:28:39
bugzillaって既出と言われるのが怖くてバグ報告自体を挫折するよね
783デフォルトの名無しさん:2009/12/09(水) 04:47:51
>>782
重複なんて後からduplicateとしてマークできるから正直適当でいい
むしろ何個も重複してる方がぱっと見て重要だとわかるから全然おk
784デフォルトの名無しさん:2009/12/09(水) 05:40:04
struct Hoge{
int x;
void foo(int y){
x = y;
}
}

void main(){
Hoge hoge;
int n = 10;
static if (is(hoge.foo(n))){
hoge.foo(n);
}else{
assert(0);
}
}

hogeが「int型の引数を1つ取るメンバ関数foo」を持っているかどうかで分岐(ダックタイピング?)をしたいんですが、
この例ではassert(0)の方を実行して止まってしまいます。
どのように書けばいいのでしょうか?
785デフォルトの名無しさん:2009/12/09(水) 05:56:54
static if (is(typeof((){hoge.foo(n);}())))
786デフォルトの名無しさん:2009/12/09(水) 06:13:55
static if (is(typeof({hoge.foo(n);}())))

でいいよ
787デフォルトの名無しさん:2009/12/09(水) 06:41:57
>>785-786
ありがとうございます。
関数リテラルに入れてそれを呼び出して戻り値の型を取得してis式で判定という流れになるのでしょうか。
結構ややこしいですね。
788デフォルトの名無しさん:2009/12/09(水) 07:21:39
static if (is(typeof(hoge.foo(n))))

でいいんじゃない?
戻り値のvoid型をisでtrueにしてくれた気がする
後ろの括弧の数がこんがらがってきた
789デフォルトの名無しさん:2009/12/10(木) 10:14:18
>>788
なるほど。存在するか調べる物が1つだけなら関数リテラルに入れる必要はないんですね。
790デフォルトの名無しさん:2009/12/11(金) 21:22:06
static import推奨のモジュールの名前だけ先頭大文字にするっていうの考えたんだけどどうだろう
791デフォルトの名無しさん:2009/12/11(金) 21:31:37
すでに先頭大文字のライブラリがゴロゴロあるからなあ

全部小文字が望ましいとか書いてあるの総スルーww
792デフォルトの名無しさん:2009/12/11(金) 21:54:29
そんなのコンパイルエラーにしちゃえばいいんだよ
793デフォルトの名無しさん:2009/12/12(土) 05:32:31
Rubyじゃねぇんだからw
794デフォルトの名無しさん:2009/12/12(土) 14:41:55
>>790
モジュールスコープに識別子ばらまきたくなかったら全部structに放り込めばいいよ
795デフォルトの名無しさん:2009/12/12(土) 15:34:28
っていうか曖昧だったらコンパイル時にエラーになるんだし、
static importとかの対処はユーザ任せのほうが……。

命名に大文字入ってるのは気持ち悪いから、識別子とか関係なくコンパイルエラーにしようぜ、って話ならもうこのさい賛成。
796デフォルトの名無しさん:2009/12/12(土) 16:25:17
>>790
static import推奨でないといけない理由がわからない
797デフォルトの名無しさん:2009/12/13(日) 23:17:12
超今更だけど、Dってクラスのインスタンスをスタックに配置できたんだね。
http://www.digitalmars.com/d/2.0/memory.html#stackclass
Dにむらむらしてきた。
何年も遅れててごめんw
798デフォルトの名無しさん:2009/12/14(月) 01:09:08
>>797
ただし実装されてな(ゲフンゲフン
799デフォルトの名無しさん:2009/12/14(月) 01:21:34
>>798
いや、実装されてるっぽいよ?
// 検証コード
import std.stdio;
class C{int[50] a;}
void main(){
int a;
int b;
scope c = new C;
int d;
writeln(&a);
writeln("\t", cast(ubyte*)&b - cast(ubyte*)&a);
writeln(&b);
writeln("\t", cast(ubyte*)c - cast(ubyte*)&b);
writeln(cast(void*)c);
writeln("\t", cast(ubyte*)&d - cast(ubyte*)c);
writeln(&d);
}
800デフォルトの名無しさん:2009/12/14(月) 07:57:09
連想配列の使い方について質問です。

struct Hoge { int x, y, z; }
Hoge[char[]] hoges;
hoges["aaa"].x = 1;
hoges["aaa"].y = 2;
hoges["aaa"].z = 3;

Hogeの各メンバ変数に代入したいのですが、キー"aaa"が3回探索されて効率が悪そうです。
どのように書けばいいのでしょうか?
801デフォルトの名無しさん:2009/12/14(月) 07:59:11
>>800
それはぬるぽだろう
802デフォルトの名無しさん:2009/12/14(月) 08:16:49
>>800
hoges["aaa"] = Hoge(1, 2, 3);

あるいは

hoges["aaa"] = Hoge.init;
with(hoges["aaa"]) {
x = 1; y = 2; z = 3;
}

とかでいいんじゃないか
803デフォルトの名無しさん:2009/12/14(月) 08:33:08
>>802
with文は初めて知りました。
ありがとうございました。
804デフォルトの名無しさん:2009/12/14(月) 21:39:58
>>801
構造体だからいいんじゃないの?
withって単純に書き換えるわけじゃなくてちゃんとインスタンスを参照するのね
805デフォルトの名無しさん:2009/12/14(月) 21:56:38
ぬるぽっていうか、RangeErrorが飛ぶはずだろう
806デフォルトの名無しさん:2009/12/14(月) 22:10:51
fromMBSzがコピーしてないようなんだけど…

import std.c.windows.windows, std.windows.charset, std.cstream;

string foo() {
char[260] buf;
GetModuleFileNameA(GetModuleHandleA(null), buf.ptr, buf.length);
printf("%08x\n", cast(int)buf.ptr);
return fromMBSz(buf.ptr)//.dup;
}

void main() {
string a = foo();
printf("%08x\n", cast(int)a.ptr);
dout.writeLine(a);
}
807デフォルトの名無しさん:2009/12/14(月) 22:28:54
806はD1です

あとbufが使いまわされた場合も危険

const string text;

static this() {
char[260] buf;
GetModuleFileNameA(GetModuleHandleA(null), buf.ptr, buf.length);
text = fromMBSz(buf.ptr);//.dup;
buf[5] = '\0';

derr.writeLine(text);
}
808デフォルトの名無しさん:2009/12/14(月) 22:45:33
>>806-807
fromMBSzは文字列が全部ASCIIの場合、引数をそのまま返す。
D2なら第1引数はimmutable型になってるはず
809デフォルトの名無しさん:2009/12/14(月) 22:57:03
ありがとう。バグではなく仕様ですね、気をつけて使います。
Copy-on-Writeはポインタを渡しているので関係ないかと、思っただけです。
810デフォルトの名無しさん:2009/12/14(月) 23:11:21
toMBSzで戻ってきたポインタをインクリメントしながらBufferedFileで1文字ずつ出力してたら
途中でGCに回収されて落ちた思い出
811デフォルトの名無しさん:2009/12/18(金) 00:14:50
以下のサンプルをD1+Tangoでビルドして実行しましたが、終了しません。なぜでしょうか…

private import tango.io.Console;
private import tango.net.http.HttpGet;

void main (char[][] args)
{
char[] url = (args.length is 2) ? args[1] : "http://www.digitalmars.com/d/intro.html";

// open a web-page for reading (see HttpPost for writing)
auto page = new HttpGet (url);

// retrieve and flush display content
Cout (cast(char[]) page.read) ();
}
812デフォルトの名無しさん:2009/12/18(金) 00:43:14
>>811
trunk最新版だからか、普通に正常動作しました。
HttpGetは5月に一度read関数の中身に修正が入っています。
(fixed bug related to missing Content-Length header)
以下のようにして表示できたらこのせいかと。

// open a web-page for reading (see HttpPost for writing)
auto page = new HttpGet (url);

// retrieve and flush display content
auto buf = page.open();
scope (exit) buf.close;
buf.load(page.getResponseHeaders.getInt(HttpHeader.ContentLength));
Cout(cast(char[])buf.slice)();
813デフォルトの名無しさん:2009/12/18(金) 01:08:55
>>812
ありがとうございます。
修正してみましたが、やはり終了できません。
Coutで正常にDLしてきたデータが表示されるのですが、その後反応しなくなり、強制終了が必要になります。
page.close;なども試してみたのですが、やはり上手くいきませんでした。
私の環境がおかしいのでしょうか…
814デフォルトの名無しさん:2009/12/18(金) 01:32:52
>>813
特にバージョンにこだわる理由がないのなら、dmdを最新にして、
Tangoもtrunkを試してみるといいと思うよ。
ソース: ttp://www.dsource.org/projects/tango/browser/trunk
インストール方法: ttp://www.dsource.org/projects/tango/wiki/CombineBuildInstructions
815デフォルトの名無しさん:2009/12/18(金) 04:04:55
おそらくデータの終わりを検出できなくて、ソケットを待ってる状態が続いてるんだろう
816デフォルトの名無しさん:2009/12/18(金) 04:13:47
Content-Lengthがないときは終わりを検出できないってやつか。
バージョンアップしてもダメなら、Connection: close送るようにすれば
817デフォルトの名無しさん:2009/12/18(金) 10:40:43
>>815
なるほどなるほどなるほど
818デフォルトの名無しさん:2009/12/19(土) 01:36:37
import()文って、-Jつけてないと使えなくて微妙なんだけど、なんとかならないのかな?
819デフォルトの名無しさん:2009/12/19(土) 05:09:43
元々なかった気がするがな
必要があってJを付けたんじゃないか
820デフォルトの名無しさん:2009/12/19(土) 11:31:44
意図せず変なファイルがimportされるのを防ぐためだろ
めんどくさかったら応答ファイルに-J.とか書いとけばいいんじゃね
821デフォルトの名無しさん:2009/12/20(日) 01:39:23
皆さんIDEは使ってますか?
DescentもCBも微妙だったので…。
822デフォルトの名無しさん:2009/12/20(日) 02:38:49
結局普通のテキストエディタに落ち着いた
たまに他の言語でIDE使うと涙が止まらなくなる
823デフォルトの名無しさん:2009/12/20(日) 02:53:11
俺も普通のテキストエディタだな……
VisualStudioか……何もかも皆懐かしい……
824デフォルトの名無しさん:2009/12/20(日) 09:49:22
これだから貧乏人は
825デフォルトの名無しさん:2009/12/20(日) 17:28:26
貧乏ですいません
826821:2009/12/20(日) 17:44:07
いいIDEが無いとやる気が出ません。
827デフォルトの名無しさん:2009/12/20(日) 17:57:20
CodePoetに期待しよう
828デフォルトの名無しさん:2009/12/20(日) 19:45:57
>>826
よし、自分でIDEを作るんだ

そのためのやる気を出してもらうために誰か>>826にIDEを
829デフォルトの名無しさん:2009/12/20(日) 19:51:27
VSやXcodeのプラグイン無かったっけ……
830デフォルトの名無しさん:2009/12/20(日) 21:28:41
その時IDEが発動した。
831デフォルトの名無しさん:2009/12/20(日) 22:17:31
(詠唱)……出でよ!
832デフォルトの名無しさん:2009/12/20(日) 23:55:07
VSのデバッガってそうそう落ちないからデバッガってそういうものだと思っていたけど
同梱のwindbgがことある毎に落ちるのでMSは流石だと思った
833デフォルトの名無しさん:2009/12/21(月) 00:22:09
どっちかっていうとMS品質のが異端なんだけど、
それを加味してもPC上のツールとしてはDのツール周りは
アッドホックすぎるきらいがある
834デフォルトの名無しさん:2009/12/21(月) 01:18:45
string型って、char[]のエイリアス?
835デフォルトの名無しさん:2009/12/21(月) 01:47:10
immutable(char)[] のエイリアスだったような
836デフォルトの名無しさん:2009/12/21(月) 03:03:03
おまえら普通のエディタとか言ってるけど、
D言語を普通にインデントできるエディタがあったら教えて欲しい
WindowsでもLinuxでもかまわない
837デフォルトの名無しさん:2009/12/21(月) 03:06:40
オートインデントってことかい?
gVimは対応してたよ。
838836:2009/12/21(月) 03:15:21
ごめん、emacs派なのでvimだけは無理。

d-mode.elはin/out/bodyでインデントがおかしくなってしまった。
839デフォルトの名無しさん:2009/12/21(月) 03:47:33
どの程度のオートインデントを期待しているんだ…?
前の行と同じインデントになるってのだったらいくらでもあるだろう。
普通のテキストエディタの強みは、動作が単純なことにあるとおもうよ。

ところで、in/out/bodyってどんなインデントにしたらキレイに見えるんだ?
840デフォルトの名無しさん:2009/12/21(月) 04:04:15
>>839
前の行のインデントを覚えるのは当然として、
少なくとも{で一個インデントされて、}で一個デインデントされるのを期待してる。
それから文字列とコメントを正しく認識してほしい。

まあ、普通のプログラミング用のエディタならできそうなもんなんだけど、
汎用エディタでDの文法に完全に対応してるのは見たことない。

in/out/bodyは俺ならこんな感じで書くかな:

auto func()
→in {
→→//
→} out {
→→//
→} body {
→→//
→}
841デフォルトの名無しさん:2009/12/21(月) 04:29:38
>>840
俺はこう書いてる
auto func()
in
{
// do stuff
}
out(result)
{
// do stuff
}
body
{
// do stuff
}
842デフォルトの名無しさん:2009/12/21(月) 04:49:58
公式(Phobosのコード)では>>841を採用してるっぽいね。一部例外があるけど。
in/out/body以外にも、concept-ifとかも困るよね。
843デフォルトの名無しさん:2009/12/21(月) 06:05:13
bodyは曖昧だから嫌いだ・・
いっそbodyと書くことを強要してくれれば納得できるのに
844デフォルトの名無しさん:2009/12/21(月) 06:27:26
inは関数の頭に書いて、outはscope(exit)とかで書けば、ぶっちゃけin/out/bodyいらないよな
ドキュメントに自動で反映させるとかしないことには。
845デフォルトの名無しさん:2009/12/21(月) 07:04:43
>>844
知ってるか、overrideというものがあるんだぜ
846デフォルトの名無しさん:2009/12/21(月) 07:53:25
>>845
そういえばそんなものがあったな。
恩恵に預かったことがないから忘れていた。
847デフォルトの名無しさん:2009/12/21(月) 08:30:24
>>841
}
else
{

とか見るとぶち殺したくなるんだが、
このコーディングスタイルって一体何が嬉しいんだ?
848デフォルトの名無しさん:2009/12/21(月) 08:48:13
コーディングスタイルは半分宗教論争
void func()
{
}
形式は.hと.cを行き来するのに楽なのでC書くときはよく使う
でもelseは
} else {
849デフォルトの名無しさん:2009/12/21(月) 09:26:23
>>847
ttp://ja.wikipedia.org/wiki/%E5%AD%97%E4%B8%8B%E3%81%92%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB
>>841のようなスタイルはおそらく BSD/オールマンのスタイル
制御文とブロックを分離することで可読性を向上させることを目的としている。
>>848 のようなスタイルはおそらく K&Rのスタイル。
一度に表示できる量が多いので書籍や昔の端末画面、ネットの掲示板などでは有利か。

最近のコード(D含む)はどちらかというとオールマンスタイルをとることが多いように見える。
あくまで慣れの問題なので、プロジェクトで一貫していればどちらでも良しってのが定説。
850デフォルトの名無しさん:2009/12/21(月) 10:47:06
if(1)
{←←←←←←←←←←←←←←ここに空行があるから構造が見渡しやすい
  // hoge
}←←←←←←←←←←←←←←ここに空行があるから構造が見渡しやすい
else
{←←←←←←←←←←←←←←ここに空行があるから構造が見渡しやすい
  // hoge
}←←←←←←←←←←←←←←ここに空行があるから構造が見渡しやすい
だぜ
851841:2009/12/21(月) 11:47:24
>>847
in/out/bodyは関数に合わせて上のように書いてるけど,ifとかは
if (cond) {
// do stuff
} else {
// do stuff
}
で書いてるよ
852デフォルトの名無しさん:2009/12/21(月) 14:14:59
if (xxx){
//
}
else{
//
}
は、異端児ですか?
853デフォルトの名無しさん:2009/12/21(月) 15:18:58
その辺のスタイルはほんと宗教だからなあw
854デフォルトの名無しさん:2009/12/21(月) 15:27:53
>>850
対応する括弧が同じカラムにある事が重要

if (ながーい
&& 複数行の条件) {

hoge();
}

の場合。} から対応する { を探す時、if を探して、ifの条件の終りを探して次の { とかですごく面倒。

if (ながーい
&& 複数行の条件)
{
hoge();
}

これなら上を見ていって同じカラムの { を探すだけ。
855デフォルトの名無しさん:2009/12/21(月) 15:45:25
一行だと

if(...){
 ...
}else{

だけど、条件が複数行に渡る時は

if(... &&
 ...)
{
 ...
}else{

にしてるな。一回インデントが戻るのが重要ということで。
856デフォルトの名無しさん:2009/12/21(月) 15:48:28
>>855
ナカーマ
857デフォルトの名無しさん:2009/12/21(月) 15:51:19
完璧に一貫性のあるフォーマットにしたければ
自動フォーマットツールを作ればいい
可読性高めたければリファクタリングすればいい
でもemacs vim
おまえらだけはだめだ
858デフォルトの名無しさん:2009/12/21(月) 16:33:31
宗教論争だからin/out/bodyもどうしようもないなあ
859デフォルトの名無しさん:2009/12/21(月) 17:15:08
>>852
ナカーマ
860デフォルトの名無しさん:2009/12/21(月) 18:37:21
(´・ω・`)ぶるっちょぽかぽかだお
861デフォルトの名無しさん:2009/12/21(月) 19:57:27
伸びてると思ったらスタイル論争かよ何て時代だ

if()
{
}
else
{
}

みたいなのは制御文をコメントアウトしたときに
ブロックをそのまま活かせるから、とかいう理由を聞いたことがある
862デフォルトの名無しさん:2009/12/21(月) 20:25:53
誰かがDindentを作れば解決
863デフォルトの名無しさん:2009/12/21(月) 20:29:30
なるほどね
864デフォルトの名無しさん:2009/12/22(火) 22:32:01
>>861
次のお題はmallocしたメモリは終了時にfreeしなくてはならないかどうかね
865デフォルトの名無しさん:2009/12/22(火) 22:43:56
そんなことよりD言語の話しようぜ
866デフォルトの名無しさん:2009/12/22(火) 22:48:02
>>864
それはしなくて大丈夫だろうけど…
というわけでデストラクタが呼ばれないかもしれない云々の話に突入だね。
867デフォルトの名無しさん:2009/12/22(火) 23:05:51
「Dではデストラクタを使ったRAIIをしてはいけない」んだっけ?
868デフォルトの名無しさん:2009/12/22(火) 23:07:17
auto classだけ?
869デフォルトの名無しさん:2009/12/22(火) 23:18:05
>>867
そういうわけではないのだけど、newされたままどこからも参照されなくなって放置された
オブジェクトが必ずGCによって回収されるという保証が仕様のどこにも書いてないから、
たとえばロックファイルとか、グローバルアトムみたいな、プロセスと関係なく存続する状態を
使った場合の後処理をデストラクタで行うことはできない。
(実際のdmdではちゃんとプロセスの最後にデストラクタを呼ぶみたいだけど。)
870デフォルトの名無しさん:2009/12/22(火) 23:23:42
じゃあ書いていないけど、
書いていないだけで、
実際は心配ないってことでいいんかね

あとauto classじゃなくてscope classね

scope classをメンバに持つことができるのかどうかやってみなくちゃ
871デフォルトの名無しさん:2009/12/22(火) 23:30:58
>>870
できないんじゃなかったっけ。個人的には一番欲しい機能の一つなんだけど。
RAIIで書きたいシーンが意外と多い。

正直、メモリ周りはC++とshared_ptrのほうが気楽なんだよなー。
SDLとか使ってるとGC外からがっつりメモリ持ってくることも多いし、
解放をデストラクタ任せにできないのがちょっと辛い。
というか、デストラクタに解放処理書いて、んで明示的にdelete、みたいな感じにしてるけどめんどい。
872デフォルトの名無しさん:2009/12/22(火) 23:33:57
scope(exit)が無かったらイライラのあまり電柱に頭ぶつけて死んでた
873デフォルトの名無しさん:2009/12/22(火) 23:51:29
>>871 に同意過ぎて涙出る。
scopeメンバ変数とか、newsgroupで昔見かけたけどあまり盛り上がらずにスルーだったな…
874デフォルトの名無しさん:2009/12/23(水) 00:18:17
Dで使えるHTMLパーサーって無いですか?
875デフォルトの名無しさん:2009/12/23(水) 05:40:29
有る可能性が高いかもしれない
876デフォルトの名無しさん:2009/12/23(水) 06:41:56
D言語でmallocしてinitializeしてdisposeしてfreeする作業につかれたお・・・
877デフォルトの名無しさん:2009/12/23(水) 17:45:18
Dって、内部表現はUTF-8にするのが基本なんですかね?
WindowsのAPIを呼ぶときには、UTF-16に変換したりするんでしょうか。
878デフォルトの名無しさん:2009/12/23(水) 18:05:44
変換は簡単だから時と場合によって使い分ければいいんじゃないかな
879877:2009/12/23(水) 18:33:53
>>878
なるほど。
char型のほうがDのライブラリでは便利そうなので、それを基本にしてみます。

ところで、GCによる再配置を防ぐもの(C#で言うfixed)はありますか?
そもそも、再配置するんでしょうか。
880デフォルトの名無しさん:2009/12/23(水) 18:40:12
>>879
GCのコンパクションのこと?まだ実装されてない
881デフォルトの名無しさん:2009/12/23(水) 19:15:36
Dは日曜プログラマにはやはりありがたい
デフォルト初期化子と疑似プロパティ(括弧の省略)とデリゲートは安心だわ

しかしメモリ使用の保守方法としてRAIIとCGはまだまだ関係が詰め切れてないんか……
クラスローカルのカスタムnewが活用できればいいんだが
882877:2009/12/23(水) 19:19:27
>>880
じゃあ今のところは気にしなくても良さそうってことですね。
Dの言語仕様的には、C#のfixedみたいなものは無いようなので
GCが管理しているメモリのポインタは使うなってことでしょうか。

http://www.digitalmars.com/d/2.0/type.html
この辺見てると、
Casting pointers to non-pointers and vice versa is allowed in D, however, do not do this for any pointers that point to data allocated by the garbage collector.
と書いてあるので、そう読み取れるんですが。
883デフォルトの名無しさん:2009/12/23(水) 21:38:00
>>882
> C#のfixedみたいなものは無いようなので
fixedが必要になるのはunsafeのコードとC#の環境の相性が悪いからで,
そもそもがunsafeなD言語だといらないんじゃないかと

キャストに関してはポインタの値を整数で持つとかあるけど
GCによって指してるオブジェクトが削除されるかもしれないから
「仕様上許可してるけど何が起きても知らんよ」ってことかな

今のdmdとかの実装だとコンパクション(や移動を伴うGC)は当分入らないだろうけど
いつかは実装されるかもしれないので,GCの隙間をつくようなコードは書かない方がいいかも
884877:2009/12/24(木) 00:15:34
>>883
C#のfixedは、オブジェクトの再配置を防ぐ目的だったと思うので、
オブジェクトがメモリ上で移動する可能性があるなら、D言語でも必要だと思いますが…。
まあ、結局DではGCに管理されているオブジェクトへのポインタを使うのは
やめておいたほうが良さそうということですね。

なんかいまいちGCのメリットが…
885デフォルトの名無しさん:2009/12/24(木) 00:22:42
そもそもポインタが登場するような書き方はDの思想と違うってことだろ
API使うとかのためにやむをえず登場するときだけで
886デフォルトの名無しさん:2009/12/24(木) 01:37:58
>>884

> オブジェクトがメモリ上で移動する可能性があるなら、D言語でも必要だと思いますが…。

GCを実装する時,言語の設計をちゃんと考慮するならそうでもない(コピーGCとか採用してる言語でそんなの大抵気にしない)

C#の実装においてunsafeな環境でのポインタが,GCの影響を受けないからfixedが必要だと思ってるんだけども

D言語でも参照とオブジェクトの間にテーブルを用意すれば,fixedみたいなのはいらないだろうし(他にもやりようはあるけど)

> 結局DではGCに管理されているオブジェクトへのポインタを使うのは

D言語だとオブジェクトとかは参照使って普通にアクセスできるんだけど,わざわざポインタを使うのは何故?

>>885にあるように外部のAPIとか使おうとしてるの?
887877:2009/12/24(木) 02:04:58
>>886
ポインタを使う理由は、WindowsのAPIを呼ぶためです。
正確に言うと、クラスのメンバ変数としてAPIで使うための構造体を持った場合に
・そのメンバ変数へのポインタを直接APIへ渡すとまずいのか
・まずい場合、メモリ上に固定させることは可能か
という点を確認したかったわけです。

>C#の実装においてunsafeな環境でのポインタが,GCの影響を受けないからfixedが必要だと思ってるんだけども
違います。
http://msdn.microsoft.com/ja-jp/library/f58wzh21%28VS.80%29.aspx
888デフォルトの名無しさん:2009/12/24(木) 03:48:43
>>887
>正確に言うと、クラスのメンバ変数としてAPIで使うための構造体を持った場合に
>・そのメンバ変数へのポインタを直接APIへ渡すとまずいのか
>・まずい場合、メモリ上に固定させることは可能か
>という点を確認したかったわけです。
メンバをD言語側でずっと持ってるのであれば回収されることもないだろうし
今は問題ないかと(自信がないのでWin32 APIとか詳しい人のレス待ち)
コンパクションなどが実装されたら固定させる手段は提供されると思う

>違います。
>http://msdn.microsoft.com/ja-jp/library/f58wzh21%28VS.80%29.aspx
どこか違う?GCがポインタも考慮しているのであれば,fixedを使うまでもなく
ポインタは移動前も移動後もずっと同じオブジェクトを指してるよね(通常のC#の参照はそう)
勿論C#のオブジェクトを上で述べるように外部に渡すのであれば,その時はfixedは必須だと思う
889デフォルトの名無しさん:2009/12/24(木) 09:14:19
DのGCはライブラリなんだから、再配置GCが実装されればライブラリがピニングする方法を提供するよ
890デフォルトの名無しさん:2009/12/24(木) 10:23:39
そんなことはない
891デフォルトの名無しさん:2009/12/24(木) 14:22:03
BlkAttrにNO_MOVEっていうのがあるから,NO_MOVEを指定する方法になるかも(まだ未実装だけど)
892デフォルトの名無しさん:2009/12/24(木) 21:13:31
>>887
>そのメンバ変数へのポインタを直接APIへ渡すとまずいのか
仕様上、再配置される可能性があるので、マズい

>・まずい場合、メモリ上に固定させることは可能か
今のところは、アロケータ・デアロケータを自前で書くとか、GC管理外のメモリ領域を使う方向になる

現実的には、>>889の方向性かな。
893デフォルトの名無しさん:2009/12/27(日) 12:09:00
今後の予定ってどうなってんの?
スケジュールとか
DIPは何が何なのかよくわからん・・・
894デフォルトの名無しさん:2009/12/27(日) 15:15:37
class A {
  void foo()
  in { assert(bar()); }
  body {}

  bool bar() { return true; }
}

class B: A { void foo() {} }

void main() { (new B).foo(); }

B.foo() を呼ぶと A.foo() の in で bar() を呼んだときに Access Violation
2.036と2.037で確認、2.030では起きない
895デフォルトの名無しさん:2009/12/27(日) 15:20:40
継承が絡むとオーバーロードが滅茶苦茶になったりしてどうもやり辛い
896デフォルトの名無しさん:2009/12/27(日) 20:24:27
>>893
# Operator overloading: opBinary!("+"), opUnary!("--"), opIndexAssign!("*").
演算子オーバーロードをopBinaryとopUnaryのテンプレートでやろうという話
# opDollar (bugzilla 3474).
Rangeのスライスで$使えない事に対する対応策として、$演算子をオーバーロードできるようにしようというもの。すでにDonさんのパッチが出てると思った。
# Move complex and imaginary types from language into std.complex.
複素数型を取り除いてstd.complexにまとめようという話
# Fix the array stomping issue (T[new] was one proposal for this).
(なんだろう、これだけ良くわからない。たしかnewsgroupでそんな話題があった機がするけど…)
# Remove C-style declarations.
int a[10]; みたいな定義の仕方をできないようにするという案
# Remove typedef.
alias thisとかあるし、typedefイラネって案
# Remove struct initializers.
static A a = {10, 20}; みたいな構造体の初期化の仕方やめようっていう案。多分次回の更新で来る。
# Remove floating point NCEG operators
!<>= みたいな演算子覚えにくいし滅多に使わないからやめようって案
# Remove "length" from array index expressions (bugzilla 3474).
a[0..length-3]; みたいな配列の添字とかスライスの中でlength使えないようにして、$に統一しようっていう案(Rangeの$と併せて)
897デフォルトの名無しさん:2009/12/27(日) 23:52:17
>>896
おお…もう…
898デフォルトの名無しさん:2009/12/28(月) 00:00:17
alias thisはtypedef並のタイプ数で書けるなら認めてやる
899デフォルトの名無しさん:2009/12/28(月) 00:05:54
typedefは初期化の指定が便利なんだが
配列作るときなんか特に
900デフォルトの名無しさん:2009/12/28(月) 08:58:56
複素数型を取り除くのだけは納得いかねえw
あれだけ言っておいて・・・
901デフォルトの名無しさん:2009/12/28(月) 08:59:52
# Fix the array stomping issue (T[new] was one proposal for this).
スライスと動的配列の構文を分けようってやつではなかったか
902デフォルトの名無しさん:2009/12/28(月) 17:44:55
むしろ、複素数にデフォルトで対応しているくらいなら、
もっと利用の幅が広い行列使った線形代数の計算に対応していてくれた方がありがたいな。
これをやると別物になりそうな気はするが
903デフォルトの名無しさん:2009/12/28(月) 20:20:17
Error: function hoge cannot get frame pointer to count
このエラーはどういう意味なのでしょうか?
-debug -g -unittestでコンパイルすれば通るのですが、
-O -release -inlineでコンパイルすると上記のエラーになります。
904デフォルトの名無しさん:2009/12/28(月) 23:13:14
>>902
確かに行列の計算に対応してくれるとありがたい
905デフォルトの名無しさん:2009/12/28(月) 23:53:48
行列リテラルとか?w
906デフォルトの名無しさん:2009/12/29(火) 01:01:49
exp(iθ)の計算とか、簡単な四則演算以外の複素数の計算まで
言語レベルでサポートされていればいいんだけど、わざわざ
複素数を基本の型に入れた割りに、中途半端な感じがするな。

でもなによりも、これだけ時間がたっているのに、基本の型を
変更するというdrasticな修正がされる可能性がある、というのが
さすがというか、なんというか・・・
907デフォルトの名無しさん:2009/12/29(火) 01:45:38
exp(iθ)は(cosθ,isinθ)だから特に用意されてなくても問題無いんじゃないかね?
908デフォルトの名無しさん:2009/12/29(火) 02:11:11
うん、exp(iθ)なんかはあくまでも例で、言語で複素数をサポートするなら、
複素数の需要が多そうな、数学関連も強化した方がよかったのでは?
という話。

四則演算くらいしかサポートしないなら、結局複素数を扱う数学ライブラリを
使うことになるし、それなら複素数クラスも数学ライブラリで定義すればって
ことになるかと。

言語レベルのサポートだと自然な形で表示しやすいってメリットは
あると思うけど。
909デフォルトの名無しさん:2009/12/29(火) 12:36:19
>>905
行列リテラルはいらねw
E3 = [
 [1,0,0],
 [0,1,0],
 [0,0,1]
];
配列リテラルで十分だろう
910デフォルトの名無しさん:2009/12/29(火) 12:38:45
あれ?前から typeid( expression ) ってできた?
ずっと typeid(typeof( expression )) ってしてたよ・・・
911デフォルトの名無しさん:2009/12/29(火) 13:11:12
しかし演算子オーバーロードのテンプレート化って、
みんな大好きユーザー定義演算子(もどき)を作りたいという下地なのか?
コンパイラを楽に書けるシステムと両立できるのか?
912デフォルトの名無しさん:2009/12/31(木) 01:53:11
何のメリットがあるんだそれ
913デフォルトの名無しさん:2009/12/31(木) 04:55:25
そんなんよりもinlineがほしい
MAKEWORDだのOPENFILENAMEだのをimportだけで使いたい
914デフォルトの名無しさん:2009/12/31(木) 07:07:28
>>913
その程度の短い関数はdiのほうに残るからimportだけで使えるはずだが
915デフォルトの名無しさん:2009/12/31(木) 07:12:01
使えるはずだな
916デフォルトの名無しさん:2010/01/01(金) 00:27:42
今年中にはD3出るかな
917デフォルトの名無しさん:2010/01/01(金) 05:11:17
出るかもしれない気がしてきた気がしなくもない
918デフォルトの名無しさん:2010/01/01(金) 05:18:28
http://www.kmonos.net/alang/d/1.0/phobos/phobos.html
phobosの一覧見辛くて困るのですがなんとかなりませんか?
Java Docのように階層化して欲しいです。
Streamにどんなクラスがあってどんなメソッドがあるのか、
スクロールして下まで見ないとそれすらも分かりません。
ちょっと心が折れそうです。
919デフォルトの名無しさん:2010/01/01(金) 06:42:32
>>918
CandyDocつかったら?
ほかにもdilとかでもできるのかな?

それと新しいバージョン来てるよ
Version D 2.038 Dec 30, 2009
New/Changed Features
* Added core.cpuid in Druntime
* Bugzilla 3514: opApply should be the first-choice foreach iteration method.
* Bugzilla 3577: Wrong precedence for opPow
* Added auto ref functions
* Added function template auto ref parameters
* Added isRef, isOut and isLazy to __traits
* Transporting return type from args to return type, see DIP2
920デフォルトの名無しさん:2010/01/01(金) 06:49:09
> * Added isRef, isOut and isLazy to __traits
おお、これは嬉しい

…今年の11月にD3が出るんだっけ?
921デフォルトの名無しさん:2010/01/01(金) 07:22:36
出ねえよ。なれなれしいんだよw
922デフォルトの名無しさん:2010/01/01(金) 11:34:20
引数にvoid書くと怒られて困る
void hoge( void )
{
}
って書きたいのに
以外に融通利かないな
923デフォルトの名無しさん:2010/01/01(金) 12:21:15
Cの可変個引数とこんがらがりそうだから敢えてダメにしてるんだろうな
switchをそのまま取り入れた時の思想と矛盾するわけだが
924デフォルトの名無しさん:2010/01/01(金) 12:27:41
C式の変数宣言も消える方向らしいしそのうちswitchも消えるか自動breakになるかするんじゃね?
俺的にはmatchとか入れて欲しいけど・・
925デフォルトの名無しさん:2010/01/01(金) 14:53:29
>>924
そうなって欲しいと思ってるのは君だけやがな。
926デフォルトの名無しさん:2010/01/02(土) 23:11:31
俺もmatchは欲しい
927デフォルトの名無しさん:2010/01/03(日) 21:36:17
dmd 2.039 release
928デフォルトの名無しさん:2010/01/03(日) 22:03:08
はえーよ
929デフォルトの名無しさん:2010/01/03(日) 23:26:10
まあちょいバグの修正のみですから
930デフォルトの名無しさん:2010/01/06(水) 19:59:41
TLS ctor/dtorくるね
931デフォルトの名無しさん:2010/01/10(日) 18:19:54
D2ならもうTangoでFA?
932デフォルトの名無しさん:2010/01/10(日) 18:52:56
D1の間違い?
933デフォルトの名無しさん:2010/01/11(月) 23:30:56
>>730
うん、他のUnicode APIと同様にWriteConsoleWを使えばいいだけの話だと
思うんだけど。UTF-8→UTF-16の変換はDが勝手にやってくれるよね?
934デフォルトの名無しさん:2010/01/15(金) 00:22:18
やってくれないかと
935デフォルトの名無しさん:2010/01/15(金) 14:26:47
Phobosにコンテナが入る予定ってないんですかね?
面倒くさいけど自分で書くしかないのかなぁ・・・。
936デフォルトの名無しさん:2010/01/15(金) 15:10:55
動的配列と連想配列(集合としても利用可)はあるし、あと欲しいのってリンクリストぐらいのよーな。
937デフォルトの名無しさん:2010/01/15(金) 16:22:02
RBTreeがほしい
938デフォルトの名無しさん:2010/01/15(金) 16:41:29
>>936
push_backなどの操作が・・・と思ったけど、std.arrayを使えばいいのかー。
939デフォルトの名無しさん:2010/01/15(金) 16:53:02
>>937
Dは実装が簡単な言語(ただしC++比)らしいので、連想配列の中身がRBTreeなDコンパイラを937が作ればOK
940デフォルトの名無しさん:2010/01/15(金) 19:10:37
>>939
作ってくれ
941デフォルトの名無しさん:2010/01/15(金) 20:56:40
RBTreeならTangoやdcollectionsとかにあるから最新のバージョンに適応させて
http://www.dsource.org/projects/aa
にコミットすればOK
942デフォルトの名無しさん:2010/01/15(金) 21:05:39
http://www.dsource.org/projects/dcollections/browser/branches/d2
dcollectionsはD2に移植する気満々っぽいよ。
ライセンスもTangoのBSDライセンスと違ってPhobosと同じBoostライセンスにしたようだ。
もし作ったらチケット発行してパッチ投稿したら良いんじゃないかな?
943デフォルトの名無しさん:2010/01/16(土) 05:03:17
>dcollections
これ確か前MLで流れてたよね
「コレクションいる?」->「dcollectionsがあるじゃん」的な感じで
実装が進んでないのは,classのrangeとかshared辺りの問題なのかな?
変更がコミットされてないだけなのか分からないけど,D2中に入って欲しいなぁ
944デフォルトの名無しさん:2010/01/16(土) 13:07:25
「コレクションいる?」->「dcollectionsがあるじゃん」->「じゃあいいか」

おいおいメンテナンスされてないってえええ、みたいな
945デフォルトの名無しさん:2010/01/16(土) 13:13:47
Graph,集合,統計のライブラリが標準にあったら嬉しいなあ
946デフォルトの名無しさん:2010/01/16(土) 13:30:12
どうせphobosのパッケージなんかごった煮でこんがらがってる上
出たり消えたりするんだから適当にぶちこめばいいのに
947デフォルトの名無しさん:2010/01/19(火) 02:07:19
to!string(int)がCTFEに対応したらしい
948デフォルトの名無しさん:2010/01/19(火) 20:19:19
stringに格納されている文字列がUTF-8であるかどうか調べるにはどうしたらいいですか?
949デフォルトの名無しさん:2010/01/19(火) 20:36:12
utfにそういうのなかったっけ
950デフォルトの名無しさん:2010/01/19(火) 20:39:44
validate?
951デフォルトの名無しさん:2010/01/19(火) 20:49:52
>>949,950
どうもです。
UTF-8 or UTF-16 or UTF-32であるかチェックということになるんですかね。
boolじゃなくて例外なところがちょっと使いづらいなぁ。
952デフォルトの名無しさん:2010/01/19(火) 20:51:44
それはDの思想的なものだと思うけど
いやならtry〜catchでラッピングした関数を作るまでじゃね
953デフォルトの名無しさん:2010/01/19(火) 20:55:30
それならstd.contracts.collectExceptionおぬぬめ
954デフォルトの名無しさん:2010/01/20(水) 00:09:08
Dに未来はある?
955デフォルトの名無しさん:2010/01/20(水) 00:12:34
未だ来てない機能はたくさん
956デフォルトの名無しさん:2010/01/20(水) 00:17:00
見切り発車で発進することすら出来ない
957デフォルトの名無しさん:2010/01/20(水) 03:40:16
>>952,953
std.encodingにboolで返すisValidがありました。
958957:2010/01/20(水) 11:46:11
isValidはUTFに限定されてなかったorz
959デフォルトの名無しさん:2010/01/20(水) 18:25:55
そういや窓の杜にコンソールでUTF-8使う方法が紹介されてたな
960デフォルトの名無しさん:2010/01/21(木) 02:22:19
pythonと同程度には普及の見込みがあるのではないか
961デフォルトの名無しさん:2010/01/21(木) 15:55:07
>>959
外部ツール使えばそこそこ見栄えがする表示はできるけど、
Windowsはそもそも端末エミュレータを変えられるようにできてないから、
実用に堪える環境じゃない。
962デフォルトの名無しさん:2010/01/21(木) 19:21:55
>>954
Dに関してははっきり「ない」と言える
963デフォルトの名無しさん:2010/01/21(木) 19:59:47
Pythonを知ってるプログラマが100人いるとすればDは0.02人くらい
964デフォルトの名無しさん:2010/01/21(木) 23:18:39
pythonと比べるなんてpythonをバカにしているとしか思えない
965デフォルトの名無しさん:2010/01/21(木) 23:26:03
Python を 100 とすると

VB 1000000
PHP 500000
C/C++ 100000
Java 50000
Ruby 1000
D 0.02
966デフォルトの名無しさん:2010/01/22(金) 00:05:40
なに!カカロットの戦闘力がVBだと!?
No.1はこの俺様だあああ!!
967デフォルトの名無しさん:2010/01/22(金) 00:14:15
やあ、HSPさん
968デフォルトの名無しさん:2010/01/22(金) 03:16:14
D弱杉www
969デフォルトの名無しさん:2010/01/22(金) 23:38:53
Dは永遠に迷走し続ける
970デフォルトの名無しさん:2010/01/22(金) 23:54:13
俺たちの戦いはこれからだ!
971デフォルトの名無しさん:2010/01/23(土) 00:37:56
>>966
強引すぎるベジータβさんの戦いは今日も続く・・・
972デフォルトの名無しさん:2010/01/23(土) 02:04:31
http://alexanderbothe.com/?id=27
なんかNGみてたらD-IDEとかあったけど、これってどうなんだろう?
973デフォルトの名無しさん:2010/01/23(土) 10:00:10
>>972
レビューよろ
974デフォルトの名無しさん:2010/01/23(土) 20:28:43
>>973
俺の環境だとバグだらけで使い物にならなかった
975デフォルトの名無しさん:2010/01/23(土) 20:44:42
待て、それだとdmdが使い物にならないってことになるぞ
976デフォルトの名無しさん:2010/01/23(土) 20:46:23
>>975
g++のバグが5000以上放置されているのに対してdmdは1000程度だとのこと(Walter曰く
977デフォルトの名無しさん:2010/01/23(土) 21:24:09
バグ報告に繋がるユーザーの母数が(ry
978デフォルトの名無しさん:2010/01/23(土) 22:07:44
C++の複雑さはDの十倍って触れ込みだから理論上はdmdの圧勝
979デフォルトの名無しさん:2010/01/23(土) 22:16:35
なんかWindowsはバグが多いみたいな話だな
980デフォルトの名無しさん:2010/01/24(日) 03:56:13
あんまり流行るとは思えないな
981デフォルトの名無しさん:2010/01/24(日) 09:05:57
流行らなくてもいいからバグはとってほしい…
982デフォルトの名無しさん:2010/01/24(日) 14:27:10
次回テンプレ 追加と削除の希望。

■参考URL
+ ttp://dusers.dip.jp (D言語友の会)
+ ttp://www.wish.sakura.ne.jp/desuno/game/Drawing (PrincessDrawing! D言語で作られた横スクロールSTG)

■ IDE
- ttp://dronten.googlepages.com/dscite (DSciTE ※404)
+ ttp://alexanderbothe.com/?id=27 (D-IDE)
+ ttp://codepoet.sourceforge.net (CodePoet ※計画中)

D言語研究は賞味期限切れかな?書き込めないけど。
983デフォルトの名無しさん
D言語研究が書き込めなくなってるのか
もう整備されてないんだよな
あれsakuraiさんだっけ?