- 1 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 01:09:54 ]
- プログラミング言語 D について語るスレッドです。
過去スレは >>2 ■本家 ttp://www.digitalmars.com/d/ ttp://www.kmonos.net/alang/d/ (和訳) ■コンパイラ ttp://www.digitalmars.com/d/dcompiler.html (DMD, 本家) ttp://dgcc.sourceforge.net/ (GDC, gccフロントエンド) ttp://gdcmac.sourceforge.net/ (GDCのmac用バイナリ) ■参考URL ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究) ttp://dsource.org/ (dsource)
- 113 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:55:15 ]
- 普通のプロパティならイケるね。
import std.stdio; struct IntEx { int value; void times(void delegate(int) yield) { for(int i = 0; i < value; ++i) { yield(i); } } } IntEx ex(int value) { IntEx ex; ex.value = value; return ex; } void main() { ex(5).times = (int n){ writefln("%d", n); }; }
- 114 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:03:42 ]
- >>112
あ、なるほど……。代入すると見せかけて、受け取ったdelegateを呼び出すのか。 わーい、超バッドノウハウ。でもそれがグッドな言語仕様に化けてくれれば儲けモノかな。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:06:56 ]
- struct Times {
int n, m, s; static Times opCall(int n) { return Times(0, n); } static Times opCall(int n, int m, int s=1) { Times t; t.n = n; t.m = m; t.s = s; return t; } void opShr(void delegate(int) dg) { for(int i=n; i < m; i+=s) dg(i); } alias opShr opShl_r; } void main() { Times(5) >> (int i) { writefln("%d", i); }; (int i) { writefln("%d", i); } << Times(10, 15); } 自分でワロてしまった
- 116 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:08:40 ]
- ああ、static opCall ってそういう事か。
- 117 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:09:17 ]
- つか、後置www
- 118 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:14:49 ]
- import std.stdio;
struct If { bool b; static If opCall(bool b) { If i; i.b = b; return i; } void opShl_r(lazy void yield) { if(b) yield; } } void main() { writefln("false") << If(false); writefln("true") << If(true); } キモイヨー
- 119 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:16:11 ]
- >>105
書けはするんだ……でもarray[10..20]を評価した時点で 10と20の値は忘れられちゃうもんなぁ。 ああ、この堪らないなもどかしさ。Walterはやはり焦らしプレイの天才なのか。
- 120 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:17:39 ]
- opIn_r で
writefln("true") in If(true); とか 余計キモイか
- 121 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:18:48 ]
- 演算子オーバーロードってこんなに面白いかったのか。
- 122 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:20:46 ]
- イテレータ風の記述をするには、要するに、
最後に置いた delegate を呼ぶための演算子があればいいんだよね。 上がってる候補は : だったり = だったりなんだが、 Walter タンのこだわってる解析の楽さ的には : はラベルかどうかのチェックが必要になる場合がありそうだから無理そうだな。 = はプロパティあたりをいじくればできそうだけど、どうなんだろうか。 do はアリかも。キーワード追加しなくていいし。
- 123 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:27:09 ]
- 後置ifはRubyにもあるし、普通に使いどころはあるかも……。
しかし、何となくフォースの暗黒面に囚われかけてる感覚があるw 演算子オーバーロードは原則、元の意味から逸脱しない範囲で行うこと。 悪い子のみんな、Walterとの約束だ!
- 124 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:29:23 ]
- >>122
いや、必ず括弧を書く必要があれば、 ラベルとの混同はなしでいけるか。 Ruby やプロパティの癖で括弧無しで考えてしまった。 >>123 実用はしたくないけど、遊びで使う分には面白すぎるw これはヤバいね。
- 125 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:29:31 ]
- 個人的には
times(5)~(int i){ hoge(i); }; な感じが好きだな。
- 126 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:33:27 ]
- -, *, /, |, & とかも良さげ。
良さげなのがありすぎて、 逆に危険な香りがプンプン匂ってくるw
- 127 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:33:31 ]
- times(5) (int i){ hoge(i); };
いっそ記号無しは……無理、か? 読みづらいか。
- 128 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:33:50 ]
- >>123 IODCCで広く使われることでしょう
- 129 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:37:35 ]
- >>128 D言語ダークサイド友の会じゃねーかw
- 130 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:37:48 ]
- そういや、opAssign なんてのがあったんだっけ。
これ使えば = もいけるな・・・。
- 131 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:47:32 ]
- 笑えるソースの見せ合いで大会とか開いたりして
- 132 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:50:24 ]
- >>120
in 使うなら If じゃなくて case にしたら良さげだなw
- 133 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 12:59:46 ]
- import std.stdio;
struct case_that { bool b; static case_that opCall(bool b) { case_that i; i.b = b; return i; } void opIn_r(lazy void yield) { if(b) yield; } } void main() { writefln("false") in case_that(false); writefln("true") in case_that(true); } おおお。これくらいは使っていいんじゃという誘惑に駆られそうだ。
- 134 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:06:04 ]
- import std.stdio;
struct Times { static int index; static void opSliceAssign(lazy void v, size_t x, size_t y){ for(index=x; index < y; index++) v(); } } void main() { Times[10..20]=( writefln(Times.index), writefln(Times.index*2) ); } 良く解らないけど、とても気持ち悪いです。はい。
- 135 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:07:19 ]
- opSliceAssign www
- 136 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:10:40 ]
- どうせなら __dollar 使おうぜ
- 137 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:19:29 ]
- >>122
doはキーワード増やさない点、あとRubyと同じだという点もナイスだけど、 場所によってキーワードの意味が違う、となるとちょいと嫌だな。 かつてのautoとscopeのようなことにならなきゃいいが。 でも案外、do-whileのdoと似てると解釈も出来るか……?
- 138 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:22:38 ]
- import std.stdio;
struct range { static void opSliceAssign(void delegate(size_t i) yield, size_t x, size_t y) { for(size_t i = x; i < y; ++i) yield(i); } } struct times { static void opIndexAssign(void delegate(size_t i) yield, size_t n) { for(size_t i = 0; i < n; ++i) yield(i); } } void main() { range[3..10] = (size_t i) { writefln(i); }; times[5] = (size_t i) { writefln(i); }; } そういや、continue は return で代用できるとして、break が使えないや。 何か値を返すようにするのも面倒だし、限界はあるやね。 >>137 一応「イテレータ」を指向するという名目なら、 ループするということで do は意味的にオーケー? まあ、Ruby のイテレータよろしく、 結局そこから逸脱した使われ方もされるだろうけど。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:30:51 ]
- >>138
do-whileで「ループ」のニュアンス持ってるのはwhileの方だから、 doだけならループに使われなくても問題無いんじゃないかな。 直訳したって「する」でしかないんだし。
- 140 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:45:40 ]
- >>138
>そういや、continue は return で代用できるとして、break が使えないや。 break用の例外を投げるという荒業はどうだろう。気持ち悪いと言えばそれまでだけど。
- 141 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 13:46:19 ]
- そういやそうね。
つまり、こんな妄想が・・・ import std.stdio; void times(size_t n, int delegate(size_t i) yield) { for(size_t i = 0; i < n; ++i) { int res = yield(i); if(res != 0) return; } } void main() { times(5) do (size_t i) { writefln(i); } } まあ、{ } 内で break, continue, return の意味が変わるというあたり、 どう実装するのかというのが気になるところか。
- 142 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 14:21:09 ]
- returnはreturnでcollectメソッドとかに使いたいので、
他の代用にされてしまうと困るかも。 char[][] titles = books.collect() do (Book book){ return book.title; }; opApplyはbreakとかサポートするために、 どうにも妙な作りになっちゃってるんだよね・・。 正直、Exception使ったほうがマシだった気がする。 Rubyじゃどう解決してたか、詳しい人いる?
- 143 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 14:27:02 ]
- こうできてほしいな。
times(size_t i;5){ writefln(i); } んでopApplyと同様にopStatementに対応して欲しい。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 14:40:29 ]
- >>142
delegate じゃなくて yield という特別なキーワード使ってるから Ruby だとそこんところどうにでもなる。
- 145 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 14:45:41 ]
- 言語仕様としてマイクロスレッドが欲しいよ。
C#でいうとyieldね。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:02:46 ]
- python の yield みたいな外部イテレータも面白い。
マイクロスレッドの代わりにもなる?
- 147 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:04:06 ]
- くだらないことでスレ延ばしてる香具師は自演厨か?
- 148 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:44:05 ]
- >>146
それマイクロスレッド。
- 149 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 16:12:31 ]
- てかもう、ステートメント自体を記述できるようにするのはどうだ?
statement LinkedForeach{ private int i; private Collection src; private Collection dest; public LinkedForeach(Collection src, Collection dest) { this.src = src; this.dest = dest; } public bool next(out Items items) { this.i++; if(this.src.length < this.i && this.dest.length < this.i) { items = new Items(this.src[this.i], this.dest[this.i]); return true; // 継続 }else { return false; // 終了 } } } ----- void functionX(Collection c, Collection d){ LinkedForeach(Items items; c, d) { // c, dのi番要素への操作が繰り返しで可能 } }
- 150 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 16:14:10 ]
- ちなみにstatementはステートメントとして使える + ステートメント終了時に自動で破棄(=auto)的なclassの仮想構文ね。
- 151 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 17:51:14 ]
- はいはいわろすわろす
- 152 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 17:51:33 ]
- delegateの構文としてdoを採用するんだったらこうなるわけか。
hoge(x, y, z) do|int x, int y| ... end どうみてもRubyです。 しかし盛り上がりすぎワロタw
|

|