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)
72 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 02:29:13 ] opApply との整合性も考慮する必要があるんだよな。 範囲指定があると、その範囲を引数に追加・・・という事になるんだろうけど、 int opApply(int delegate(inout size_t i, inout T n) dg, range rng) { ... } この range がどちらの引数と対応しているかって問題がある。 先頭から対応させていくという制限をかければ、 rng は i と対応することになる。 そうすれば >>71 みたいなことが実現できそうだ。 class T[] { // 内部実装のイメージとして捉えて int opApply(int delegate(inout size_t, inout T) dg, range rng) { for(size_t i = rng.first; i <= rng.last; ++i) { int res = dg(i, elems[i]); if(res != 0) return res; } return 0; } } n 次元の場合は foreach(i : 0..5, j : 0..10) ... としたのでいい気がする。
73 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 03:00:02 ] forくらい使いこなせよ・・・
74 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 03:03:07 ] そういう問題じゃないだろ・・・
75 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:11:59 ] for(int i; range(0, 10)){ } int[] range(int a, int b){ int[] hoge = new int[b - a + 1]; for(int i = 0; i < hoge.length; i++){ hoge[i] = a + i; } return hoge; }
76 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:24:52 ] ループの予感。色んな意味で。
77 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:39:34 ] 最適化とかよくわからないんだけど たとえば上で言ってるみたいに foreach(i : 5..10, j : 3..5) { ... } こういう構文があったとしてそれを使った場合と for(int i = 5; i < 10; i++) for(int j = 3; j < 5; j++) { ... } という風に書いたのではやっぱり前者のほうがより効果的な最適化を期待できるの?
78 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:47:52 ] 前者が後者に最適化されればそれで十分。 あとは読みやすさや書きやすさ、学習しやすさや保守しやすさ等の問題。 for だと何度も同じ変数が出てきて、変数名変えるの面倒だとか、 初心者に意味を教えるのが面倒だとか、直感的じゃないとか、 まあ色々不満があるから、それを解消できればいいな、と。
79 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:52:34 ] foreach(int i; range(0, 10)){ : } int[] range(int start, int end, int step = 1){ int[] array = new int[(end - start) / step + 1]; for(int i = 0; i < array.length; i++){ array[i] = start + i * step; } return array; }
80 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 07:54:39 ] 配列の生成は超遅いんで、 opApply を持ったオブジェクトを返す実装にした方がいいけど、 それでも for には負ける。
81 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:05:52 ] よくわからんなぁ。 BASIC風の FOR I = 1 TO 10 STEP 2 のほうがC式よりマシってことか? 効率面で言えば、ループの度に関数呼び出しが発生するような 方式は遅くて当たり前だろ。話にならない。 C式のforループなら比較、インクリメント、ジャンプしかしないし ループカウンタがレジスタに乗ることが期待できるからな。 学習しやすさ分かりにくさってのは正直疑問なんだが。 Cのシンタクスが美的であるかどうかはともかく、Cの後継言語は 現実問題としてありふれてるし、皆使い慣れてるだろ。 別に言うほど分かりにくいわけでもないしな。
82 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:13:16 ] #define range(a, b, c) int i = a; i <= b; i +=c for(range(0, 10, 2)){ }
83 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:13:43 ] Dのコンパイラは短い関数のインライン化はしてくれないんだっけ?
84 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:30:53 ] >>81 マシってこと。 効率面に関して話にならないのは当たり前じゃなくて、 opApply を使った方法が最大限 inline 化されて最大限最適化されれば for ループと同じとこまで最適化される可能性はあると思う。 ただ、現状ではそこまで最適化されないようだし、 だからこそ「言語的に」サポートされて欲しいなあ、と。 あと、for 文がそんなにスバラシイんだったら foreach 文なんて誰も同時に採用しない。 for 文がなくてもいいとは言わんが、 「もっと便利な方法考えられるけど、 使い慣れてるから使いにくくてもオーケー」 というのは、ガンガン機能アップしていこうぜ的な D 言語の雰囲気と反するんじゃないかね。
85 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:32:56 ] 引数付きマクロがDにあればいいんだろ?
86 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:33:56 ] マクロはダメだろう。 常識的に考えて。
87 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:41:57 ] writefln = "aaa"; まじでコレ通るじゃん ええんか?
88 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 08:49:42 ] 987 名前:デフォルトの名無しさん [sage] :2007/02/10(土) 01:14:43 int foo(int hoge) { ... } foo = 2; // foo(2); になる プロパティじゃなくてもこうなるんだけど、 正直これってどうなんだろうな。 988 名前:デフォルトの名無しさん [sage] :2007/02/10(土) 01:33:11 プロパティとの明確な区別が無いから今のところはしょうがない ということらしい。 ええんか?
89 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:12:46 ] 良いんじゃない? あえてそのコードを書く必要性もないわけだし
90 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:20:37 ] でもキモイヨー。 そういや、Ruby の attr_accessor みたいに プロパティを自動的に作ってくれるようなものはあるの?
91 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:30:31 ] だから property int x(){ } とかにしろと
92 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:34:41 ] キーワードが増えるのがお気に召さないんだろうかね。
93 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:34:50 ] 仕様いじくりまわして使えなくしてしまおうという スパイの陰謀にしか思えない
94 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:53:19 ] どこのスパイだ
95 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 09:57:16 ] Microsoft
96 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 10:04:30 ] Jで始まる言語に関わる会社だな。
97 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 10:17:55 ] やっぱ問題は速度じゃ無いよなぁ。>>81 の言うとおりだし。 可読性とか重複の排除とかそういう点を追求したい。 速度なんてユーザが違和感を感じなきゃそれでイイ、って分野では、ね。 >>57 遅いのは仕方ない。スピード追求したけりゃ可読性を犠牲にして普通のfor使おう。 まぁ、気にするほど可読性落ちやしないさ。for文にはCから引き継いだ「慣れ」があるし。 あと、>>39 は確かに可読性はイイが、文法を拡張するとなると、そこまでは……と思う。 というか、みんなforeachステートメント前提に考えすぎじゃないか? foreachの基礎になってるのはdelegateのパラメータ渡しなんだから、 その際に利用者にdelegateキーワードを見せない、って方向の方がいい。 Let's言語拡張妄想。 Range[2004..3000].step(4) : (int year){ // Rangeオブジェクトは>>46 を拝借 orimpicPlaceTable[year].doOrimpic(); } class Range{ void step(int stepValue, void delegate(int) yield){ /* 実装略 */ } // いっそ void step(int stepValue) : (void delegate(int) yield){ /* */ } てのも…… }
98 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 10:29:28 ] 可読性で気になるのは、 こっちでは foreach 使って、 こっちでは似た処理だけど foreach 使えないから for 使って、 っていう風な場合もかな。 統一性がないというか何というか。 使い分けに深い意味があるのかと思いきや、 言語的な制限から仕方なく、とかなるのがね。 >foreach前提 単なる回数ループだと foreach にする必然性はないかもしれないけど、 配列の一部だけ foreach したい場合とかは foreach にする必然性はあるね。 別のものをもってくると、可読性が落ちるけど、 かといって現状の foreach だとスライスするしかなくて、 それだと 0 からスライスする場合でないとインデックスがずれてしまって・・・と。
99 名前:97 mailto:sage [2007/02/13(火) 10:42:13 ] アレ? 文章考えてる間にだいぶ進んでた罠。 >>84 私ゃコンパイラの最適化実装なんてさっぱりなんですが、 ホントに最大限のinline化とか期待できるんでしょか。 onApplyが受け取るのがdelegateである以上 delegateをinline展開せにゃならんってことだと思うのだけど、 何となく、それは難しい事だと思ってたんですが。 # それでも、Walterならきっと何とかしてくれる……! とかちょっと期待も。
100 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 10:45:58 ] んまあ、あくまで最大限の最適化ってことで・・・。 そして、それを要求するよりは、言語的に実装する方が楽そうだ、と。
101 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:00:56 ] Range[2004..3000].step(4) = (int year){ orimpicPlaceTable[year].doOrimpic(); }; ってね。 できなくもなさそう。テストはしてない。 要はdelegateを渡すのに func({ Statement; }); こんな{}のが邪魔なだけだと思った。
102 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:01:50 ] >>98 rubyだとArrayのeachとeach_indexが微妙に統一感がない。each_with_indexとかさらに。
103 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:20:47 ] >>101 何か Ruby のイテレータっぽいね。 類する文法は作れそうな予感。 今でも似た事は無理矢理できそうだけど。 >>102 まあ、Ruby は動的型言語で オーバーロードできないからね・・・。 そのあたりは仕方がない気がする。 まあ、引数の個数で呼び分けくらいはして欲しいんだけど。
104 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:25:51 ] foreach(int sliceIndex, int num; array[10..20])みたいに書けなかった……よね。 10..20の部分、やはりrange型か何かに切り出して欲しいな。組み込み型として。 範囲を表すのに直感的でいい記法なのに、配列のインデックスにしか使えないのは勿体ない。 あと>>67 も含めて。やっぱ10..20のとき20は含まないべきだよなァー。
105 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:32:20 ] >>104 書けるんだけど、sliceIndex は 0〜10 になって、10〜20 にはならない。 最適化もちゃんと効いて高速なんだけどなあ。
106 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:35:50 ] import std.stdio; struct Times { int n; void opShr(void delegate(int) yield) { for(int i = 0; i < n; ++i) { yield(i); } } } Times times(int n) { Times t; t.n = n; return t; } void main() { times(5) >> (int i){ writefln("%d", i); }; } うほっ
107 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:37:00 ] auto arr = [0,1,2,3,4,5,6,7,8,9]; foreach (i=3, v; arr[3..8]) writef(i," ",v,";"); -> 3 3; 4 4; 5 5; ... と妄想
108 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:42:57 ] >>106 そこは static opCall で作ろうぜ
109 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:43:49 ] >>108 opCall でプロパティになるかと思ったら ならなかったんだよー。
110 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:44:32 ] 二項演算子に do とか欲しくなってきた。 オーバーロード専用でも良いから。
111 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:49:38 ] >>101 いけそうでいけない気がする……。 記法としてはとても良い感じなんですが。 演算子オーバーロードじゃ理想的な演算子無いし、 無理矢理あてたとしても末尾に}();なんて付いちゃいそう。 >>103 Rubyのイテレータはいいものだと思うです。 今じゃ”ブロック付き呼び出し”のが主流の呼び方っぽいけど。 Dでもdelegate引数が()の外に飛び出せさえすれば、 同じ表記(Dらしく型表記は付くけど)ができるんだけど……。
112 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 11:51:19 ] >>111 そこで代入形式で呼び出すプロパティなんですよ
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
153 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 20:40:42 ] D言語の正式版の存在の意味が分からないw 明らかに人柱版としか思えないんですけどwwwww
154 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 20:51:12 ] >>153 正式版も何も、単にバージョンが1になったというだけの話でしょw
155 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:05:47 ] とりあえず落ち着かないとIDEとか無理だよな
156 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:20:10 ] >>152 hoge(x, y, z) do (int x, int y) { ... } でいいんじゃねえの? パイプって左右の区別なくて気持ち悪い。
157 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:56:47 ] char[][] commentlessScript = File.collectLines("foo.myscript") do (char[] line){ if(line == "---EndOfScript---"){ break; } if(line.startWith("#")){ continue; } return line; }; class File{ static char[][] collectLines(char[] filePath) do (char[] delegate(char[]) yield){ char[][] result; open(filePath) do (File file){ while(!file.eof){ result ~= yield(file.readLine()); } } return result; } static void open(char[] filePath) do (void delegate(File) yield){ File file = new File(filePath); scope(exit){ file.close(); } yield(file); } } /* コンパイラは、delegateの呼び出しが行われるのがwhileやforの中のみと判断した場合に限り、 そのdelegate内でのbreak、continueを許します。それらが行われた場合、delegateの実行は中断され、 delegate呼び出しから最も近いforやwhileに対してbreak、continueが行われたものとして処理されます。 */ 妄想が窮まってきたので、いい加減もう寝ます……。
158 名前:157 mailto:sage [2007/02/13(火) 22:09:33 ] ……コメントに付け足させてくれ。 /* 検討事項: ... do (loop char[] delegate(char[]) yield){ ... のようにloopキーワードを付けるなどして、 delegate引数の宣言の側でbreak、continue可能なことを明示すべきかもしれません。 この場合、この`yield`はwhileやforの中で呼び出さない限りコンパイルエラーになることになります。 */ 今度こそ寝る。
159 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 22:25:00 ] >>156 「関数呼び出し do 関数リテラル」って形だな。 doを既存の演算子に置き換えて、 その演算子をオーバーロードしたクラスを関数呼び出しが返せば、 「関数呼び出し 演算子 関数リテラル ;」という形にはなりそう。 その場合、文じゃなくて式だけど。
160 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:16:44 ] forの方が単純でいいような気がしてきた。
161 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:34:45 ] トリッキーなコードには演算子オーバーロードは欠かせない。 我々にはopDoが必要だ。
162 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 05:40:33 ] ネタでしょ?
163 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 05:57:51 ] 括弧内に { } があるのってダサくね?
164 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:31:20 ] まさかこんなのが古きよきforループより分かりやすい、初心者にも 教えやすいとか思ってないよな? しかも性能が劣るのは確実 単なるジャンプに過ぎないbreakやcontinueの代わりに例外なんて 論外もいいところ 馬鹿じゃないの?ただのオナニーじゃん
165 名前:デフォルトの名無しさん [2007/02/14(水) 06:39:54 ] >>158 おまいばかじゃね? ネタだとしても、折角do使ってキーワード増やさない様にしてるのに何してんだ。 そんなんなら最初から新たな構文作るだろ。
166 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:41:12 ] くだらんことでスレ延ばしてる香具師は 仕様いじくりまわして使えなくしてしまおうという スパイの陰謀にしか思えない
167 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:44:17 ] どこのスパイだ
168 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:52:10 ] Jで始まる言語を使うところだな。 Japanese
169 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:52:26 ] for ループと do 記法の提案の話は別ジャン。
170 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 07:43:56 ] 一所懸命相手のレスをねじ曲げて馬鹿にしてるんだから水を差すな。
171 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 08:03:36 ] うそみたいだろ 全部ネタなんだぜ
172 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 08:20:55 ] Don't touch me!