1 名前:デフォルトの名無しさん [2008/04/14(月) 15:16:22 ] プログラミング言語 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フロントエンド) ■参考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/3da5oa (C/C++に疲れた人のD言語) 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://dronten.googlepages.com/dscite (DSciTE) 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)
29 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 21:11:32 ] というか、もはやphobosまともに保守されてないだろ。 DMDと一緒に配布されてるphobosがコンパイル通らなかったりするし。
30 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 21:15:35 ] ここなんのスレだったっけ?
31 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:27:47 ] >>28 これが信者脳ってやつか
32 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:58:00 ] >>26 >把握してないと 型のある言語だったら大抵そうじゃね? const/invariantとか別れてるのはDくらいかもだけど
33 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:21:08 ] 引数の型ぐらいIDEが表示してくれるそれでいいんじゃね。
34 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:21:21 ] >>32 動的型付け言語も仕様上型のない言語も、不適切な型や値を突っ込めば 実行時にコケるか結果がおかしくなるわけだから、なんにしろ確認は必須だよねえ。 とはいえ、言語の性能ってのはそれ自体の性能だけじゃなくて、実際にはエディタや 周辺環境の性能も関わってくるから、そのへん不足してるせいで>>26 ってことなら、 まあD言語(の言語自身か周辺環境)が悪い、といっても間違いじゃないだろうけど。
35 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:22:51 ] それよりも、参照渡しと値渡しの区別が呼び出し側でつかないのだけはどうにかして欲しい。
36 名前:22==26 mailto:sage [2008/04/19(土) 00:43:36 ] >>28 それはひどい >>29 phobos捨てるべきなのか? >>33 伝説のIDEがあるならそれで一応満足するのだが >>32 .34 最大の問題は関数の利用者が関数のために 明示的にdeep copyしないといけないところだと思えてきたよ 都合があるのは関数側なのにね 必要なら(.idupの代わりに)関数呼び出し直後に関数内で使う前にdeep copyして欲しい
37 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:54:15 ] >>31 氏ねよカス(笑)
38 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:58:31 ] 最近の言語は文字列をimmutableな形式で持つことが多くなってきてるよね。
39 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:24:26 ] std.stringなんかはinvariant(char)[]とconst(char)[]の両方のオーバーロードを提供すればいいんじゃないの。
40 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 08:00:13 ] 関数の引数ってconst()とrefとinとoutだけでいんじゃね?
41 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 10:54:42 ] >>40 いいよな 俺はそうしてる
42 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:43:45 ] >>40 www.kmonos.net/alang/d/2.0/const.html にあるように エイリアシングの問題があるから、invariant引数は必要なところには 必要だと思う。 だがエイリアシングもクソもなく新しいinvariant文字列を返すような std.stringの多くの関数にはどう考えても不要だと思う。 string,wstring,dstringの定義がphobosのObjectの項に書いてなかったりするし、 stringをinvariantにしたの忘れてるんじゃないかな。
43 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:56:03 ] スライスを返したりする場合はinvariant必要不可欠だよね。 そこで例えばこういうふうにするのがいいと思う。 string[] split(const(char)[] str) { return split(str.idup); } string[] split(invariant(char)[] str) { return /*空白で区切ってスライスを返す*/; } もちろん例えばtolowerならinvariantのは定義せず、constだけでいい。
44 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:59:57 ] > もちろん例えばtolowerならinvariantのは定義せず、constだけでいい。 引数をinvariantにすればtolowerは純粋関数になるから、 ある種の最適化ができる可能性があるよね。 そういう意味でこちらもやはり両方定義すべき。
45 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:08:46 ] >>44 invariantとかconstとかは純粋関数かどうかには関係なくね? (引数以外の環境に依存せず同じ結果になるから。) マルチスレッド対応とかはtolowerでやることじゃないだろうし。。
46 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:52:35 ] >>43 それいいな でもそうなるとconst(char)[]版を書くの面倒 invariantにmutableを渡したらdeep ocpyするならこんな感じ //alias invariant(char)[] string; string[] split(string str); string s = "foo"; char[] t = "bar"; string[] u = split(s); string[] v = split(t); // deep copy implicitly
47 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:57:12 ] >>43 転送する引数が一つならまだしも複数になったら 自分で転送関数を書くのはやだぞ
48 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:58:02 ] >>46 プリミティブ型の配列ならそれでもいいけど、 オブジェクトの配列だったりすると何か問題が起こりそうな気が
49 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:23:08 ] opInvariant()の出番ですね!
50 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:28:10 ] その前にopCastを実用可能なものにしろと…
51 名前:デフォルトの名無しさん [2008/04/19(土) 21:57:26 ] dmd1.028 static assert(is(void function()==function)); // static assert is false なぜさ?
52 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 22:00:16 ] >>51 void function()は関数ポインタ型
53 名前:51 [2008/04/19(土) 22:52:43 ] >>52 アホな俺にも static assert(is(void delegate()==delegate)); //ok static assert(is(void function()==function)); // static assert is false この違いが分かるように教えてくれまいか
54 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:02:57 ] >>53 is(T==delegate) -- Tがデリゲート型 is(T==function) -- Tが関数型 void delegate() -- デリゲート型 void function() -- 関数ポインタ型 void f(){} typeof(f) -- 関数型 typeof(&f) -- 関数ポインタ型 おk?
55 名前:51 [2008/04/19(土) 23:21:10 ] >>52 ,54 static assert(is(typeof(void function())==function)); //ok 大変勉強になりました。
56 名前:51 [2008/04/19(土) 23:25:55 ] ↑失敗 void func(){} static assert(is(typeof(func)==function)); //ok ありがとうございました。
57 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:30:38 ] 俺も前それで1時間くらい悩んでしまったwww
58 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:35:25 ] >>57 typeidで確認しろwww
59 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 11:54:17 ] class A{} void f(const(A) a){f(cast(invariant(A))a);} // ??? void f(invariant(A) a){} 配列のときは.idupでいいけど配列じゃないときはどうやってclone作ればいいの? castしちゃまずいよね? 自前で.idup相当の処理を書かないといけないのかな class A{invariant(A) iclone()const{return new invariant(A);}} void f(invariant(A) a){} void f(const(A) a){f(a.iclone());}
60 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:07:10 ] それと配列でもこういうときは.idupできないけど .dupとcast(invariant(TYPE)[])でいいのかな? invariant(A)[] g(const(A)[] a){ //return a.idup; // error return cast(invariant(A)[])a.dup; }
61 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:09:27 ] >>60 いや、よくない。 const(A)[]であるaの参照がどこかにある限り、 a.dupの要素のメンバは変更されうるから、 何らかの方法でAをディープコピーしないといけない。
62 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 13:43:53 ] .dupってディープコピーじゃないの?
63 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 14:04:39 ] std.contractだかなんだかにあるやつが 結局>>60 な感じだったとおもったが
64 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 14:36:43 ] >>62 まさか。全く同じ内容の配列を複製するだけだよ。 >>63 assumeUniqueだよね。 これはプログラマの良心によってinvariant性を担保するもので、 >>60 のような場合に使うのは不味いね。
65 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 15:13:19 ] D言語っていろんな仕様のバージョンがあって、 自分に合ったものを選んで使えば良いときいたんですけど本当ですか?
66 名前:60 mailto:sage [2008/04/20(日) 16:55:53 ] >>61 確かにそうですね まとめるとこんな感じでしょうか class A{ int m; this(int m){mem=m;} const A opClone(){return new A(mem);} const invariant(A) opInvariantClone(){return new invariant(A)(mem);} } void f(A x); void g(const(A) x); void h(invariant(A) x);
67 名前:60 mailto:sage [2008/04/20(日) 16:56:27 ] f(new A); f(new const(A));//opClone()が暗黙的に呼ばれる f(new invariant(A));//opClone()が暗黙的に呼ばれる g(new A); g(new const(A)); g(new invariant(A)); h(new A);//opInvariantClone()が暗黙的に呼ばれる h(new const(A));//opInvariantClone()が暗黙的に呼ばれる h(new invariant(A));
68 名前:60 mailto:sage [2008/04/20(日) 16:56:57 ] //A x = new invariant(A); // is as //A x = (new invariant(A)).opClone(); //invariant(A) x = new A; // is as //invariant(A) x = (new A).opInvariantClone(); //これはうまくいくかどうかよくわからない //invariant(A)[] copy(const(A)[] ar){ // return ar; //} // is as //invariant(A)[] copy(const(A)[] ar){ // invariant(A)[] ret; // foreach (e; ar) t ~= e.opInvariantClone(); // return ret; //}
69 名前:60 mailto:sage [2008/04/20(日) 16:57:23 ] opCloneが未定義のときにconst/invariant -> mutable opInvariantCloneが未定義のときにmutable/const -> invariant に変換しようとしたときは今までどおりエラーになって 参照型メンバのディープコピー忘れを防止・・・とか なんていうかGCばんざい __EOF__
70 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 17:02:49 ] >>65 すぐ仕様が変わるだけで1.x系と2.x系のニ種類しかないよ
71 名前:デフォルトの名無しさん [2008/04/23(水) 02:40:09 ] class child : private parent { ... } この場合の private みたいに親クラスに属性つけるとどうなるんだっけ? 何も変わってないような気がするんだが。 export属性つけると怒られるし(dmd1.028に)。
72 名前:71 [2008/04/23(水) 03:30:19 ] privateに関しては自己解決した。 お騒がせしました。
73 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 16:59:42 ] 静かだな
74 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:23:06 ] そろそろ更新くるんじゃないかな
75 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:50:57 ] 何か難しいことでもしてるのかな
76 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:21:55 ] いきなり3.0とかかw
77 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:24:42 ] そして3.1でブレイクだな
78 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:26:22 ] 次は95とかですかね
79 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:30:41 ] えっ、2095年?
80 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:51:05 ] 3/1に3.1、9/5に95ですね、わかります。
81 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:17:30 ] え、それだけ言っておいてD2.013はスルーですか…? Version D 2.013 Apr 22, 2008
82 名前:デフォルトの名無しさん [2008/04/25(金) 01:24:24 ] >Html source files are now deprecated. え?アレ? 密かに期待してたんだが、、俺だけだった?
83 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 01:51:11 ] ・opDotはopCastのように盲目的に特定の型のインスタンスへ転送する機能 ・switchのcaseはconstかinvariantな整数型変数なら定数じゃなくともOK ・HTMLファイルにD言語のソース埋め込める機能は黒歴史 ・pureとnothrowは書くだけ書けるようにしておいたけどまだ何も機能しないよ ・synchronized文あるからvolatile文は非推奨 ・__thread記憶クラス実装したけど、言語上での表現はたぶん別の形になるよ ・関数オーバーロードで、派生クラスはより近い祖先の引数型にマッチするようになったよ あたりが主な変更? opCastといいopDotといい謎な仕様だと思った。 HTML埋め込みは、Dコンパイラにやらせるべき仕事じゃなかったんだろうな、と思った。
84 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 02:43:05 ] opDotはalias thisみたいな匂いがするね
85 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 04:47:03 ] >>83 switchのcaseはさりげなく面白い変更だな。 同じ動作だが基準がインスタンスごとに変えられるようになるのかな?
86 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 06:25:57 ] switchはどうせなら文字列でも出来るほうが面白そうな気がする
87 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 08:45:43 ] >>81 気づいてたら教えてくらさい
88 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 13:23:23 ] 何故だかキャッシュされててChangeLogの更新に気づかなかった。 // main.d import test; void main(){ error(); } // test.d import std.stdio; void error(string file = __FILE__, int line = __LINE__){ writefln("Error: %s(%d)", file, line); } > Error: main.d(4) おお、これでまともにUnitTest用ライブラリが書ける。
89 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 13:43:07 ] >>86 switchの条件に文字列指定は前から出来るけど・・・ >C/C++と違い、 文字列もswitch文で使用できます。 って書いてるし。
90 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 13:47:28 ] >>89 >>86 はそういう意味じゃないだろ >>83 の「switchのcaseはconstかinvariantな整数型変数なら定数じゃなくともOK」に対して,「const/invariantな文字列をcase文に使えたら面白い」という話だろ
91 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 14:21:51 ] まあ多分こっちの意図と違う事言ってるだろうなと思いつつ勢いに任せて書いた。すまぬ。
92 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 07:31:21 ] switch caseのconst変数について。 スタックにあるconstな変数は受け付けますが、 ヒープにある可能性のあるものは全部NGかなという感じです。 関数内(ネスト関数の外側関数含む)でconstな変数は受け付けますが、 クラスフィールド上でconstなものは受け付けません。
93 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:02:04 ] D面白そうだからやってみたいんだけどオススメの本あったら教えて 英語か日本語の本で
94 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:13:24 ] 他の言語知ってるなら言語仕様のページ見るだけで十分だと思う。
95 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:19:32 ] >>93 日本語の本で一番新しいのは『D言語パーフェクトガイド』。ただし古くて何の役にも立たない。 英語で最近出たのは『Learn to Tango with D』。まだ読んでないから内容の是非はわからない。
96 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:21:23 ] D はリアルタイムで言語が大きく変わるから ついていくには本なんて役に立たない
97 名前:93 mailto:sage [2008/04/27(日) 14:24:10 ] learn to tango->ダンスの本かと思ってスキップしてた amazonで買った
98 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 15:08:48 ] Dの本って出版された時点で時代遅れになってそうだな。
99 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 15:10:25 ] D 1.0 で止まっていいのなら何とかなりそうではあるが・・・ D 2.0 に興味があるなら本は無駄だと言わざるを得ない
100 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 15:30:26 ] opDotって委譲しやすくするって認識でおk?
101 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 15:31:24 ] >>100 No. 単一の型にしかforwardできないから何の役に立つのかさっぱり分からない。
102 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 15:38:18 ] o.m が o.opDot!("m") にでもなれば、いろいろ面白そうなのにな。
103 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:24:46 ] >>102 なんにつかえるかわからんけど、おもしろそう
104 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:26:07 ] >>102 関数の引数のstaticが来たらopDot("m")でいい気ガス。
105 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:05:18 ] >>103 ActiveXのレイトバンディングとかに使えるかも。
106 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 03:29:47 ] クラス関数を列挙して、それに対応する配列の擬似プロパティ版関数を作るテンプレートってありますか? 下記のような…… class Foo { void fun(int n); ... } ↓ void fun(Foo[] foos, int n) { foreach(foo; foos) fun(n); } ...
107 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 18:42:57 ] 作れないことはないと思うけど、すごく汚いものになる気がする
108 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:25:13 ] __traitsのallMembersやderivedMembersでメンバの名前を得られるから、 それらを関数かどうか判定して、それにあった関数定義を生成して…、 という形になるんじゃないかな。
109 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 20:29:22 ] >New/Changed Features >Hidden methods now get a compile time warning rather than a runtime one. これうざす。 親クラスの関数をFinalにして回避してるんだけど そもそもおれのクラスの設計がいけてないってことなのかなぁ・・・
110 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 22:06:04 ] >>109 警告メッセージに「オーバーライドしてんのにoverrideついてないよ」 って書いてあるから、素直にoverrideつけりゃいいんじゃなかろうか。
111 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 06:18:29 ] >>110 このケースのことじゃなかろうか class A { int foo(int a) } class B : A { int foo(int a,int b); } 名前が一緒で引数の取り方が違う場合
112 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 17:04:35 ] >>111 勘違いしてたわ。 なるほどオーバーロードの関係ね。 www.kmonos.net/alang/d/2.0/function.html で、 オーバーロードの解決時に基底クラスの関数を含めるにはalias使えとあるから、 class A{ int f(){ return 3; } } class B:A{ alias A.f f; int f(int x){ return x*x;} } たぶんこんな感じでOK
113 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 21:44:13 ] >>112 わっ本当だ! ありがとうございます! aliasの役割っておおいですね・・・
114 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 23:02:51 ] 使う場面は様々だけどそのスコープの特定の名前セットに 名前を追加するという役割は同じだよ
115 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 00:53:51 ] dHell+DMD1.0でゲーム作るの楽しい!!! /+D言語でハンガリアン記法どうしようか・・・うーむ+/
116 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 02:28:55 ] >>115 dHellってdHell2じゃなくて? 無印の方はSDLとほぼ同等だと思ってたが システムハンガリアンだったらダメ絶対 アプリケーションハンガリアンだったら推奨 ameblo.jp/argv/entry-10031517216.html
117 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 03:01:33 ] アプリケーションハンガリアンもtypedefがあるからあまり必要無いんじゃない?
118 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 11:48:18 ] >>117 え?
119 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 12:21:11 ] >>118 Cとかと違って,違う型として扱ってくれるからじゃない? 全て上手く行くかどうか分からないけども
120 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 14:57:22 ] データの目的を変数名に入れなくても、typedefで型のほうを目的固有にできるって話じゃね。 ttp://www.radiumsoftware.com/hungarian_notation.html この例なんかは、安全な文字列型と危険な文字列型を用意すれば解決するようにも思える。
121 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:29:48 ] >>120 のリンク先では「(C++で)いちいちウィンドウ座標とレイアウト座標を 別のクラスにするのは大仰すぎて非現実的だからアプリハンガリアンがいいよね」 と言いたいようだけど,ただ視覚に訴えかけるだけじゃなくて それぞれを暗黙的に変換されないようにするべきだと思う. typedefがあるD言語では仕組みは簡単だし 実は同じ型だから変換のコストは安いからもってこい typedef Point LayoutPoint; typedef Point WindowPoint; とか typedef /*unsafe*/string safeString; とか. D言語ではアプリハンガリアンでさえいらず型システムに任せられる気がしてきた
122 名前:117 mailto:sage [2008/04/30(水) 17:31:07 ] >>118 すまん言葉足らずだった >>119-120 が言っている通り なるべくならコンパイルエラーで検出できるようにした方が間違いが無いだろうし オーバーロードが出来るから処理も分けやすい 全てのケースで置き換えられるとは言わないけど 大体はtypedefが使えると思う
123 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:40:46 ] 文字コード別に文字列型を定義してしまっても良い気がする。
124 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:29:26 ] >>123 こんなのはしてみたけど typedef char mbchar; alias invariant(mbchar)[] mbstring; 文字列同士の連結に ~ じゃなくて連結関数を使わないといけないのがネックだった
125 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 19:42:24 ] ただの配列だから~演算子で連結できるだろ
126 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 19:44:23 ] >>124 charは既にUTF8って意味を持ってるから、ubyteを基底にするべきだろうね。
127 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 20:04:38 ] 配列でptrを使わずに&演算子で出てくるのは配列の最初の要素へのポインタと配列の長さを格納した8バイトのデータ?
128 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 20:21:27 ] >>125 あ,ゼロ終端の配列にするからいけないのか thx >>126 間違えた.元々 ubyte にしてました
129 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 20:25:35 ] >>127 &演算子が返すのは、配列の参照が保持されている場所のアドレスか、 配列の先頭の要素のアドレス。動的か静的かで挙動が異なる。