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)
21 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 07:25:15 ] その発想はなかったわ
22 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 07:41:53 ] expr の例外を catch すると scope(success) の条件外になり、 さもなくば expr の例外が外に漏れちゃって・・・
23 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:06:44 ] ややこしいな
24 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:27:38 ] 悪名高い for(int i = 0; i < 10; ++i) { ... } みたいなループは D でも for 使わないとダメ? まあ、foreach(i; new Range(10)) { ... } みたいにできる Range は定義できるけど、 どうも -O3 でも遅いみたいだし・・・。 いっその事、foreach(i; 10) { ... } がその代わりになるように 言語仕様の変更を提案した方がいいんだろうか。 foreach(i; 2, 10, 2) で 2 から 10 まで 2 つごとに・・・とか。
25 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:15:35 ] >悪名高い kwsk
26 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:19:38 ] ん? いや、C 教えた時によく for 文分かりにくいー、とか言う人いるじゃん?
27 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:30:42 ] お前のまわりだけだろ
28 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:45:15 ] C 風の for 文を敢えて採用しない言語がちらほらあるのは、 C 風の for 文での指定回数ループが直感的じゃないからだぜ。
29 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:47:36 ] 直感的ではないがあれは便利だ
30 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:56:51 ] まあ、便利だから、それはそれで別にあっていいんだけど、 foreach(i; 10) { ... } とかできたらさらに便利じゃない?
31 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 10:37:20 ] foreach(i;createArray(10)){ ... } int[] createArray(int n){ int[] array; array.length = n; for(int i=0;i<n;i++) array [n]= i; return array; } とかやっとけば?
32 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 10:57:56 ] いや、だから、やろうと思えばやれるけど、 最適化しても遅いからなんだかなあと・・・。
33 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 11:11:32 ] んじゃmixinで配列リテラル生成しとくとかどうよ。 mixinよく判らんから例出せんけど、できるんじゃないかな。
34 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 11:22:58 ] 配列リテラルじゃ最適化しようがないから遅いじゃん?
35 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 11:22:58 ] >>30 ぱっと見、直感的に見えるかもしれないけど、 変数で指定すると異様になるよ。
36 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 11:24:27 ] 変数か・・・。確かに aggregate 用の foreach と紛らわしいか。 作るなら別文法か?
37 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 11:56:46 ] 新しい文法を導入してまでforを置き換えるメリットはないね
38 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 12:04:04 ] mixinを使うと...わかりにくいなこれ。 import std.metastrings; template times(int n,char[]code){ const char[]times= Format!(`cast(void)&null[ ((){ for(int __dollar=0;__dollar<%s;++__dollar) {%s}; }(),0)];`, ToString!(n), code);} void main(){ mixin(times!(10,`printf("%d\n",$);`)); }
39 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 12:40:59 ] 普通に foreach(i; 1..10) write(i); ってかけたらいいんじゃね?
40 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 12:55:05 ] そこでrange型の導入ですよ
41 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 13:16:28 ] ちうか、こういうのは匿名メソッドで条件指定できるのが一番いいんだがなあ。。。 C#のpredicateみたいな。 そうなってくるとyield構文もほしくなる・・・。
42 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 15:47:35 ] ほらほら、Rubyから色々取り入れようよ、とRubyの好きな俺。 範囲型とブロックで(1..10).each(){ |i| hoge(i); }とか。 onApplyReverseとかforeach周りの妙な仕様が整理できるぜぇ。
43 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:05:39 ] Rubyだったら10.times{|i|...}だろw
44 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 17:20:04 ] void times( int[] n, void delegate(int) yield ) { for(int i=0; i<n[0]; ++i) yield(i); } void main() { [10].times((int i){ printf("%d\n", i*i); }); } うそですごめんなさい
45 名前:44 mailto:sage [2007/02/12(月) 17:24:25 ] てか普通にPythonと同じやり方でいいんじゃね? struct xrange { int limit; static xrange opCall(int limit) { xrange self; self.limit=limit; return self; } int opApply( int delegate(inout int) dg ) { for(int i=0; i<limit; ++i) if(int r = dg(i)) return r; return 0; } }; void main() { foreach(i; xrange(10)) printf("%d\n", i*i); }
46 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 17:44:19 ] class Range { static Range t; static this() { t = new Range; } static Range opSlice( int n, int m ) { t.start = n; t.end = m; return t; } int opApply(int delegate(inout int) dg) { int result; for (int i = start; i < end; i++) { result = dg(i); if (result) break; } return result; } int start, end; } void main() { foreach (i; Range[3..8]) writefln(i); } 既出ですかそうですか
47 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 17:54:36 ] ム板でインデントを認識、表示して欲しいなぁとかスレ違い
48 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:02:12 ] ループはfor文で十分。 >>47 インデント対応した2chブラウザ使えばいい。
49 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:03:17 ] int main() { writefln("こうするのは面倒だしね"); return 0; }
50 名前:デフォルトの名無しさん [2007/02/12(月) 18:05:23 ] 貼る時全角に痴漢すれば
51 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:10:19 ] >>50 置換するなら で良いんじゃ?
52 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:16:57 ] 慣れるとインデントなしで読めるようになる 困るのは Python とかかな
53 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:30:17 ] >>49 それだと結局コピペ時には ってなるから、  の方を使ってくれた方がありがたい。
54 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 18:31:24 ] foreach(int i; Range(2001, 2010)){ writefln(i); } Range(2010, 2061).each((int i){ writefln(i); }); 等々。 かなりRubyぽいところまで出来るけど、 やっぱりforeachキーワードや引数の呪縛から逃れたいなぁ。
55 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 21:05:11 ] 引っ張って悪いんだがインデント対応の2chブラウザってあるのか? Jane使ってるんだけど実はできたりする?
56 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 22:04:49 ] そのぐらいD言語で作れ
57 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 22:48:37 ] >>45 それ、遅いのよね。-O3 でも。 >>39 はいい感じの文法だと思う。 というか、それも妄想してたんだ、そういや。
58 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 23:00:10 ] foreachで回すことはできないけれど 1,2,3,...という連番アクセスが必要、 ってのはどういう状況があるだろうか。 ずるずると既存の機能を拡張してくのは なんか微妙な感じがするから、もっと 個々の用途に即した形の機能が追加される 方がよい気がする。
59 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 23:21:59 ] 指定回数だけ同じ処理を実行したい場合とか、 配列の要素数より少ないだけ回したいときとか。
60 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 23:30:44 ] 後者はスライス使える。 最適化も効くみたいだ。
61 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 23:45:45 ] スライスで前の方を削ると インデックスがずれるので面倒っちい
62 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:08:38 ] >>59 前者はカウンタ要らないから指定回数実行の構文があればその方が直感的かなと思う。 >>61 それは使ってて結構強烈に感じた。 配列の一部だけ回すって結構需要ありそうな気がするんだが。まー具体例は思いつかん。
63 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:26:01 ] ペアで扱う場合に先頭1つだけループから外すとか。 もう片方のループの範囲を決めるのにそのインデックスが必要になるから、 そっちもずらさにゃいかんなる。
64 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:33:28 ] foreach(i, n; array[1..array.length]) foreach(j, n; array[0..i+1]) // ← ここで + 1 が必要 ... ↓こっちの形なら不必要。ただ、j を使いたい場合にインデックスがおもっくそズレる。 foreach(i, n; array[0..array.length-1]) foreach(j, n; array[i+1..array.length]) ...
65 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:49:39 ] 「制御構造」を関数化(モジュール化)するスマートな方法は、て感じか。 「モジュールにdelegate渡してコールバックしてもらう」に 型推論+無名デリゲートまで組み合わせれば 既にかなりのことが出来ると思うんだけど。 それでも残る問題は、パフォーマンスと微妙な読みづらさ? # あと、foreach特別扱いされすぎだろと思う……
66 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:01:51 ] 折角ネイティブ言語でちゃんと最適化もすることをウリにしてるんだし、 パフォーマンスと書きやすさ読みやすさの両立は欲しいね。 現状は、foreach+スライスよりは、 for の方が読みやすいし使いやすい感じか?
67 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:05:53 ] (a..b)とは別に(a...b)がほしいな。意味はRubyと逆でもいいから。
68 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:09:57 ] あと単純に、range型が欲しい、という要望も混ざってるかな。今の話では。
69 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:28:38 ] foreach(i, 0, 10; null) ... foreach(i, 0, 10, n; array) ... こういうのでいい気がしてきた。
70 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:29:46 ] 前者はもう foreach(i, 0, 10) でいいか。
71 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 01:45:45 ] foreach(i : 5..10; array) foreach((i, j) : (0, 0)..(5, 10)) n次元ベクトルを走査できるぜw
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 ] 演算子オーバーロードってこんなに面白いかったのか。