1 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 20:16:30 ] プログラミング言語 D (D Programming Language) について語るスレッドです。 過去スレは >>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) ttp://www.sun-inet.or.jp/~yaneurao/dlang/ ttp://wisdom.sakura.ne.jp/programming/d/
620 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:27:37 ] 循環するほど密接してるんならもしかしたら一つのファイルにまとめるべきなのかもねえ
621 名前:609 mailto:sage [2007/11/03(土) 23:40:38 ] >>620 その通りですね。
622 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:48:57 ] >>618 モジュールコンストラクタがある場合に循環依存できないって制約は、 初期化順序を一意に定めるためのものであって、 循環依存自体に何か問題があるわけじゃないと思う。 コンパイラが挿入するカバレッジ解析コードに モジュールごとの初期化順序が何らかの影響を及ぼすとは考えづらいから、 やはりバグだと思う。
623 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:09:52 ] class Hoge { int opProperty(string key, int val) { return 0; } } auto hoge = new Hoge; hoge.test = 22; // どうにかして => hoge.opProperty(test, 22); こんなキモいことできないかなー
624 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:11:58 ] 妄想乙
625 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:16:28 ] >>623 それってさ、opPropertyの中で、keyとvalに応じて分岐とかするの? それなら普通にメンバ関数の方がいいでしょ。 単にメンバ変数に値を設定するだけならテンプレートで増殖させるとかできるし。
626 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:18:40 ] >>623 opIndex(string key, int val)ってしてhoge["test"]=22で良くね?
627 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:19:38 ] ミスった。opIndexAssignね。
628 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:22:46 ] ーにかした ソースの外見をきにしてしまったアホだった/(^o^)\
629 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:24:03 ] 雪駄下駄を書くのが面倒くさいだけなら、わなDのサンプル template attr_reader(T, string name) { mixin( "private T _" ~ name ~ ";" ); mixin( " public T " ~ name ~ "(){ return _" ~ name ~ ";}" ); } class Point { mixin attr_reader!(int, "x"); mixin attr_reader!(int, "y"); this(int ix, int iy) { _x=ix; _y=iy; } } で十分。 でも、普通に書いた方がいいと思うぞ。
630 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:27:39 ] ドキュメント生成用のコメントつけられなくなるしなー。
631 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:39:49 ] きもさを追求するなら、opAutoload導入して欲しい。
632 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:48:16 ] 本からパクッた!あ。いや、参考にして、タートルグラフィック実装してみた。 アーカイブの中に結果画像入ってる。 これぞ、コンピュータグラフィックってかんじで面白いね。 windows専用です。 www9.uploader.jp/dl/sukiyaki/sukiyaki_uljp00004.zip.html
633 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:58:08 ] ゲッタとか雪駄とかって他のC系列では自分で生成できないからすげーあこがれてたんだぞ。 それをこんなむげに扱いよって。ぷんぷん。 え?ビーム??でないよそんなの。
634 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 02:10:27 ] ですよねー
635 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 04:02:59 ] プロパティの += とか -= とかなんで許可してないんかね。 array.length += 2; ってやったら array.length = array.length + 2; って変換してくれりゃ良いだけなのに。 演算子オーバーロードとの競合を防ぐため?
636 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 04:14:42 ] 将来的にはできるようになる予定とかどっか書いてなかったっけ。
637 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 04:31:27 ] D言語は糞だから期待しちゃだめ
638 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 04:52:39 ] ruby式だー
639 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 05:01:50 ] >>635-636 もう忘れてるんじゃないのw
640 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 06:49:24 ] をるたんももしかしたら 各自array.length = array.length + 2;ってかけばいいのに とかおもってたりは・・・ないか
641 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:09:39 ] をるたんも実はarray.length += 2;って書けたらいいなあ、とか思ってる。
642 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:27:39 ] でも現実的に割に合わない面倒なことだなあ、とも思ってる
643 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:39:51 ] そんなしょうもないもの実装してる暇があったらマクロ実装してやんよ! と思ってるに違いない。
644 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:44:59 ] ほんとだな?
645 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:16:42 ] くろーじゃー!
646 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:35:53 ] でも対称性の点から見てもあってもいい機能だよな常識的に考えててててて
647 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:14:06 ] D2 の構造体/クラスの配列で sort しても opCmp 呼ばれなくなってね?
648 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:12:35 ] どうも吐くアセンブラがバギーな感じ
649 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:31:11 ] D2おもしろんだけど、コンパイラがバグだらけで使い物にならんな…
650 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:41:14 ] ttp://www.sun-inet.or.jp/~yaneurao/dlang/Chapter-03.html#030400000000 このVSつかうデバッグできてる人いますか? VS2005でやってみたけど、どうもうまくいかないです
651 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:52:32 ] >>648 delegateまわりがとくに closure関係だろうな
652 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:21:18 ] void main(){ A!(int) a; a.f(); } struct A(T){ T t; A!(A!(int)) f(){ A!(A!(int)) a; return a; } } これってやっちゃいけないことなのかな。 エラーになる。 Aをコンテナとして、リストのリストと言う具合に、 入れ子にするのは良くあることだと思うのだけど。
653 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:46:58 ] >>652 A!(A!(int)) をtypedefしたりなんやらしてたらDMDが無限ループに入っちまった。 怖い怖い
654 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:05:24 ] >>652 普通に無限ループしないか? テンプレートをインスタンス化すると、その内部のテンプレートがインスタンス化され、 さらにその内部のテンプレートがインスタンス化され、、、
655 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:09:45 ] >>647 2.003と2.007の動作は同じよう。変化なかったよ。 1.023と2.007の動作はぜんぜん違った・・・ 要素3つの配列をソートするだけの処理で・・・ 1.023は、配列初期化時にopCmpを20回、ソート時に3回呼び出してる。 2.007は、配列初期化時にopCmpを3回、ソート時には呼び出しなし。 2.007は降順で1.023は昇順という大きな違いが←既知事象?
656 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:11:38 ] gdcって1.020までしかないの? だめじゃん
657 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:35:23 ] あった・・・ なんで最新のやつをでかでかと表示したりしないんだろ
658 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:39:02 ] >>654 最終的にはintで止まるはずだから、無限ループはしなさそうだけど C++でやってみたら大丈夫だったし
659 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:06:12 ] え、Dって末尾再帰最適化してんの
660 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:46:11 ] なぜ突然「末尾再帰最適化」? 関係ないだろ
661 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 03:53:51 ] そういえばDって無限リスト書けんのかな
662 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 04:03:57 ] それっぽいものなら何とでもかけると思うが。
663 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:07:40 ] クロージャが来た記念ってことで、遅延リストを作って遊んでた俺。 でも、lines :: [char] -> [[char]]が書けなくてショボーン。 getContentsとか、zipWith使ってフィボナッチとかはできたお。
664 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:39:25 ] >>658 考えてみてもintで止まるということがよく分からんかった。 A!(int)はA!(A!(int))型戻り値の関数を持ち、 そのA!(A!(int))型はA!(A!(A!(int))))型戻り値の関数を持ち、… となるように思える。(intから始まって、止まらない) A!(int)の実体化中にA!(A!(int))を実体化しようとすると、 無限リストよろしく永遠に型の実体化が終了しないんじゃなかろうか。 で、A!(A!(int))の実体化のタイミングをA!(int)の定義後にしようと思って struct A(T){ T t; A!(TA) f(TA=A!(T))(){ A!(TA) a; return a; } } としてみたけど、それでもコンパイラ様は再帰展開だとおっしゃる。 で、小手先の変更として f(TA=A!(T))() を f(TA=typeof(this)) と変えてみたら dmdがsemantic3でオチタ\(^o^)/
665 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:19:30 ] くそー2.007おもしろそうなんだが、前のプログラムが動かん・・・ 今まで追い続けたんだけど、今回は2.006にもどすよ。。。 >>663 面白そうな雰囲気 まったくわからんおいらに説明おねがいします
666 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:41:58 ] >>664 よく見ようよ。 A!(A!(T))だと確かにとまらないけど、上のコードはA!(A!(int))。 どう見ても有限の展開しかしない。 単に動かないのはdmdのバグでしょ。
667 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:46:10 ] class List(T) { static List!(List!(T)) listOfList() { return null; } } alias List!(int) t;
668 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:59:06 ] >>666 なるほど、A!(A!(int)).fの戻り値型はA!(A!(int))そのものになるのね。
669 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 15:35:01 ] 単純にA!(A!(int))を展開しようとしたらまたA!(A!(int))が展開されて・・・という話ではないの?
670 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 15:55:09 ] 同じテンプレート引数では一回しか実体化されないはず。
671 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 16:11:39 ] あーそうだった 俺ショボスwww
672 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 16:47:13 ] 実装しだいでは、A!(A!(T))でも大丈夫だと思う。 なんせ、C++ではこれが正常に動くのだから。 C++でできることはDでもできてほしい。 using namespace std; template<class T> struct A{ T t; A<A<T>> f(){ A<A<T>> a; a.t.t = 2; return a; } }; int main(){ A<int> a; A<A<int>> b = a.f(); cout << b.t.t << endl; return 0; }
673 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 18:04:20 ] 久々にスレの勢いを見てみたら、 この板ではC/C++, Javaについで3番手だということに気づいた。 PerlやJavaScriptやPHPはここではない場所でやってそうだが、 それでもずいぶん上に来たものだ。
674 名前:663 mailto:sage [2007/11/05(月) 18:24:56 ] >>665 Haskellに標準搭載されてる遅延リストを、Dでどれだけ実現できるか、という試み。 実行コストが高いから実用性は無くて、お遊びでしかないけど。 ttp://www9.uploader.jp/dl/sukiyaki/sukiyaki_uljp00005.zip.html ここに上げたから、詳しくはこれを見てみて。 linesとgetContentsとzipWithは、Haskellにある関数。 linesが書けないのは>>652 がエラーになるせい。
675 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 18:31:51 ] >>673 ウォルたんから新ネタがどんどん届くからな 間違いなく勢いはある
676 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 18:47:32 ] クロージャが入ってからの勢いがものすごいだけで、普段はそんなにすごくないんじゃないかな。
677 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:01:11 ] C++インターフェースのときもすごかったよね。 >>773 をををっありがとうございます 拝見します
678 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:04:44 ] replace( D言語Part15[677], `>>773 `, `>>674 `); //ごめんなさい
679 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:21:49 ] ぬるぽ
680 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 20:04:12 ] 俺はマクロくるまで冬眠
681 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:04:15 ] そう言って冬眠したのはもう三人くらいいるようなw
682 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:10:47 ] 俺の理解度は置いといて!他の人のコード読むと楽しいな!! なんかね、久しぶりに心から「へぇ〜」っていっちゃった。 やっぱ、ネットはこうでないと。 そうそう、俺タートルとかやってた奴ね。
683 名前:682 mailto:sage [2007/11/05(月) 21:13:27 ] 混乱避けるつもりが紛らわしく。。。 俺-> >>682 だけね。
684 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:22:04 ] >>682 はもうちょっと落ち着いてもいいと思う やけに楽しそうだw
685 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:44:05 ] getenv("CONTENT-LENGTH").toInt() とかはちょっとニヤリとしてしまう
686 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:51:41 ] 俺は予想外にもクロージャ来たから冬眠からさめちまった
687 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:23:48 ] CGIっつーかAjaxっつーかweb開発用のフレームワークってありますか?
688 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:32:07 ] なんか、あったような気もするけど、古いかもなあ。
689 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:01:15 ] 自己を動的に派生クラスに書き換えるモデルを考えて、 以下のようなコードを組んでみたのですが、失敗しました。 そもそも自己を動的に派生クラスに書き直せるのかちょっと疑問になったのですが、 こういうことは可能なのでしょうか。 class Hoge { this() {} void rewrite() { this = new Huga; } } class Huga : Hoge {} void main(){ auto a = new Hoge; a.rewrite; writefln(a); // -> Hoge }
690 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:02:37 ] >>687 sakuraiさんがずっと前に作ってなかったっけ
691 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:12:28 ] >>689 変数aのアドレスなり参照なりがわからないと無理でしょ。 メモリのインスタンスが存在する部分を書き換えるわけにはいかないから、 変数aが指しているものを書き換えるしかない。
692 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:17:57 ] 仮想メソッドを直接書きかえ・・・いやなんでもないです
693 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:18:58 ] できてしまった import std.stdio; class A{ void change(ref A a){ a = new B; } } class B : A {} void main(){ auto x = new A; writefln(x); // a.A x.change(x); // a.B writefln(x); }
694 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:21:26 ] コメント書くところ間違えた あとインデント見やすく import std.stdio; class A{ void change(ref A a){ a = new B; } } class B : A {} void main(){ auto x = new A; writefln(x); // a.A x.change(x); writefln(x); // a.B }
695 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:26:15 ] this ってメソッド呼ばれる時にインスタンスのポインタを値渡しされたただの隠しパラメータだからな。 だから、this をいくら書き換えても呼び出し元の変数(ポインタの値)は変わらないまま。 this が元から lvalue にならなきゃ混乱しないのに。
696 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:31:15 ] >>692 求めているものは仮想メソッドの動的書き換えで、 かつオーバーロードできればいいなあという感じ(なのでデリゲート不可)で、 それが理想なんですが、さてどうしたものかと。 >>691 >695 なるほど。。少し分かってきました。 この辺を突破できるトリックをぼちぼち探してみます。
697 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:10:16 ] >>694 ひとまずこれベースで行ってみます。 ありがとうございました。
698 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:03:34 ] っステートパターン って言ってみる
699 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:37:40 ] D言語を使うからにはもっとトリッキーな手法をとるべきではなかろうか。
700 名前:デフォルトの名無しさん [2007/11/06(火) 01:57:34 ] D言語は糞
701 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:31:15 ] >>697 Has-a使ってやってみるのは? ttp://www9.uploader.jp/dl/sukiyaki/sukiyaki_uljp00006.zip.html なんでこの線路 .d がアップロードできんのん?
702 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 03:39:17 ] なんか8スレ目ぶりくらいにアンチを見た。
703 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 04:43:04 ] dupと[]って書き方以外になんか違うところあるの?
704 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 08:01:51 ] >>703 dupは複製される。[]はされない。 int[] x = [1,2,3]; int[] y = x[]; y[0]=999; writefln(x); // 999 2 3 (y=x.dupなら1 2 3)
705 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 08:35:14 ] クロージャがくると、coroutineがもうすぐできる という夢をみた
706 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 13:49:41 ] >>703 []は配列全体のスライス。 dupはミュータブルな複製。 したがって、型が違う場合がある。 static assert(is(typeof("foo") == invariant(char)[3])); static assert(is(typeof("foo"[]) == invariant(char)[])); static assert(is(typeof("foo".dup) == char[]));
707 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:57:39 ] ここまで試してみた結果のまとめ ・自己インスタンス書き換え 外部の自身を指すポインタのアドレスを渡す必要がある=複数あった場合は厄介 newでコンストラクタを呼び出すと厄介 ・delegateスイッチング+可変データアダプタ オーバーロードできない プロパティ風呼び出しができない ・Has-a オーバーヘッドはあるが、無視できることが多いかも ExchangerとInterfaceで2回定義を書くのがやや冗長 ・分岐 オーバーヘッドが大きい ・Factory 動的な変更が内部的には行えない 自身を指すポインタが複数あると厄介 自分の目的だとHas-aかデリゲートスイッチングの2択になりそうですが、 もう少し煮詰めてみて面白そうなら報告いたします。
708 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:37:02 ] アップローダのアップ形式は自分ではいじれないっぽい〜。 レンタルなんですけど、ちょっと不便だなぁ。 >>684 お察しのとおり、たのしくて! えぇーっと、多少自重します〜。
709 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:39:36 ] d monooki とかいうDのソースコードアップロードできる場所が あったけど、いま使えるっけ?
710 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:12:19 ] >>707 別のインスタンスにすり替えるんじゃなくて、インスタンス自体を書き換えてみた import std.gc, std.stdio; class A{ void change(){ // A to B if(B.sizeof > capacity(cast(void*)this)){ if(extend(cast(void*)this, B.sizeof-A.sizeof, B.sizeof-A.sizeof)){ throw new Exception("std.gc.extend failed"); } } size_t ptrsize = (void*).sizeof; with(B.classinfo){ (cast(byte*)this)[0..init.length] = init[0..init.length]; } } } class B:A{ void change(){ // B to A ...省略... } } void main(){ A a = new A; a.change(); writefln(a); //B a.change(); writefln(a); //A }
711 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:31:30 ] きんもー☆
712 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:43:00 ] 強烈過ぎて吹いたw ちょっと使える場面が限定されそうなので、しっかりメモしてそれにとどめておきます しかしgcがありながらこれができてしまうDの変態さには感心する
713 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:44:55 ] gcがあるからこそできるんじゃね?
714 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:46:58 ] version条件で、#ifndefとか#if !defined()とか#if defined() && defined() #elseに相当することってできましたっけ? なんとなくstatic ifに書き換えてますが、無駄を感じるもので。
715 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:51:29 ] どのへんが無駄?
716 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:56:53 ] static if以外にはversionとdebugくらいしかないと思う 他にあったっけ?
717 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:06:16 ] version(...){...}else{...}はできたような希ガス
718 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:47:35 ] #if defined(FOO) && !defined(BAR) ... #else ... #endif これが書きづらい。 static ifは定義済みでないと扱えないので、これをすっきり表現するには、 versionで定義されてるかどうかを真偽値とする定数を作って、……とやってるんだが、 このへんがどうにかならんもんかなあと。
719 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:59:10 ] #define FOO に変わるものがなあああいい
720 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:07:02 ] コマンドラインで指定するのをあきらめて、const使う案しか思い浮かばない const FOO = true; static if(FOO){ const HOGE = true; } else{ const HOGE = false; }