D言語 Part23
- 1 :デフォルトの名無しさん:2009/09/20(日) 19:48:04
- プログラミング言語 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
- ttp://www.astoriaseminar.com/images/walter.gif
- 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
- ttp://www.ustream.tv/recorded/2207138 1h30mあたりから
- 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);
}
- 48 :46:2009/09/26(土) 06:25:04
- >>47
D2 ならできるんかな。
D1 はムリだった。
- 49 :デフォルトの名無しさん:2009/09/26(土) 15:29:54
- D言語で、自分自身の関数ポインタまたはデリゲートを返す関数って書けたっけ?
- 50 :デフォルトの名無しさん:2009/09/26(土) 15:46:53
- 関数名とかが明確に分かってるなら普通に書けばいいと思うけど
分からない場合ってあるのかな
- 51 :49:2009/09/26(土) 16:55:35
- http://codepad.org/bitaKSKg
これをもっとスマートにできないかなぁということ。
- 52 :デフォルトの名無しさん:2009/09/26(土) 17:52:32
- >>49
昔は出来た。ある時から出来なくなった。
- 53 :49: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;
のほうがよかったかも。
- 61 :49: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関数はかならずスレッドセーフにしなければいけないってのもなぁ…
- 103 :99=101:2009/09/30(水) 19:55:34
- >const関数はかならずスレッドセーフにしなければいけない
そんなことないはず。
スレッドセーフになってるものをスレッドセーフとして扱わない(shared→const)って話で。
- 104 :99=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
- http://www.boost.org/LICENSE_1_0.txt
- 151 :デフォルトの名無しさん:2009/10/05(月) 17:17:52
- 2.033出た。
「gdbでスタックトレイスが動くようになった」とあるけど、
私の環境ではそもそも行番号が取れないんだよ... orz
- 152 :デフォルトの名無しさん:2009/10/05(月) 17:39:49
- きたああああ
http://twitter.com/WalterBright/status/4623634220
- 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
- 178 :177: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とか嫌な香りがぷんぷんするぜ…
- 180 :177: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
- 性的構築が必要なモジュールを循環インポートで実行時例外が出るのはまだいい
だがその例外でどこが循環してるのかわからないのはどういうことだ
- 191 :189:2009/10/08(木) 23:25:31
- dmd1.047->1.048 の更新で
flectioned をインポートするとクラッシュするように
なってしまった。。。
ひとまず外しておくか。
だいぶ時間を無駄にしてしまった・・・。
- 192 :デフォルトの名無しさん:2009/10/08(木) 23:39:53
- dmd1系を使ってるんだったら、Tangoの次のバージョンにスタックトレースが含まれるからそれを待った方がいいと思うよ。
svnのリポジトリではもう使えるようになってるみたい
- 193 :189:2009/10/09(金) 00:00:02
- >>192
マジスカ。いいなぁ、Tango。
しかしもう Phobos 使いまくりで、
Phobos 無しでは生きて行けない体に・・・!
- 194 :デフォルトの名無しさん:2009/10/09(金) 00:13:29
- D1のPhobosなら、Tango+Tangobos入れればそのまま動くんじゃない?
- 195 :189: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(){}
などと定義される感じです。
- 212 :211:2009/10/11(日) 11:16:23
- 上記のさらに先の意図としては、関数を使う際に
doFunc!("Hogee");
と書くとコンパイラさんに
HogeeFunc なんてねぇよ! HogeFunc, HugaFunc, TestFunc の
どれかを使ってくれ!
と手取り足取り教えてもらえるようにできないかなぁと
思ってます。
こうすると定義したソースをいちいち見に行かなくても
使える関数が分かるので楽かなと・・・。
- 213 :デフォルトの名無しさん:2009/10/11(日) 12:00:33
- >>212
doFuncを特殊化(あるいは,static ifで分岐)するのじゃいかんの。
- 214 :211: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にはよくあること
- 221 :211: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
- 誤爆しましたごめんなさい
- 224 :211: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,
}
- 246 :241: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
- 247 :241: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
- まさかの2.035リリース
http://www.digitalmars.com/d/2.0/changelog.html#new2_035
- 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
- >>285
http://lists.puremagic.com/pipermail/digitalmars-d-announce/2009-October/014214.html
現状はmodule必須だよ.
- 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);
にしとくべきだと思うが。
- 370 :369: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関数じゃ駄目なの?
それとも更に構文糖が欲しいってこと?
- 374 :369: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)
- 386 :385: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
それと単にこのコード吐き出しゃ良い気もする
- 395 :387: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
- 414 :410=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が通らないのはたぶんバグ
- 416 :414: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が返す型を記述しないといけなくなるのがなんだかなーといった感じです。
うまい方法はないでしょうか?
- 428 :427: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なら、一見動いてても意味不明のアクセス違反が発生しまくる事があった気がする
- 471 :468: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を受け取れないという問題も発生します。
どういうスタイルで書けばいいのでしょう?
- 481 :477: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
だから動的配列は長さとポインタのペアだって言ってるがな……
- 490 :468: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が動き始めるときにスレッドの初期化は終わってるはずだから、それは心配しなくていいと思う。
- 494 :468:2009/11/05(木) 20:59:56
- >>492
20回程度ためしてみたら問題ありませんでした^^
どうやらstatic this()がマズかったようですね・・・
回答ありがとうございました!
- 495 :480: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つのオーバーロードを用意する必要があるはず
- 532 :531: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); }
}
- 537 :528: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
タイムゾーンの設定してるか?
- 560 :477: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
- >>554
std.datebaseをimportすればよいかと。
http://www.digitalmars.com/d/archives/digitalmars/D/learn/D2_phobos_std.date_question_17086.html
- 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
- Goだって。
ttp://www.atmarkit.co.jp/news/200911/11/go.html
- 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
- w
やっぱり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
- >>591
http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=100642
- 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
- w
- 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
- なんということヲ…
155 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
■ おすすめ2ちゃんねる 開発中。。。 by FOX ★
このスレを見ている人はこんなスレも見ています。(ver 0.20)
ブラウザ三国志 質問スレPart12【テンプレ必読】 [ブラウザゲーム]
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.8 2008/11/13 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)