(new Otsu).res(1)
otu().dup().otu().otu().otu()otu().otu().print();
7 :
6 :2007/10/05(金) 23:20:38
9 :
8 :2007/10/05(金) 23:58:51
ってぐわw ごめんwうまく展開できてないっぽいわw
あれ? 俺はちゃんと元のページに飛べたよ?
11 :
8 :2007/10/06(土) 00:12:46
>>10 mjd?
あれーオレだけなのかw
何故かindexに飛んじゃう・・・
2.005来てるね
D 2.005 Oct 1, 2007 New/Changed Features * std.math.sin, cos, tan are now evaluated at compile time if the argument is a constant. * Added Cristian Vlasceanu's idea for C++ interface for 'plugins' * Overhaul phobox linux.mak and add documentation build logic * Massive additions to std.conv * Add writeln() and write() to std.stdio
* Add writeln() and write() to std.stdio これは地味だが良修正
>>C++ interface なにこれ C++のクラスがDLLでつかえちゃうのかしらん
17 :
16 :2007/10/06(土) 07:44:43
調べた。 感想:すげぇ・・・
やっと由美がかないそうだ
Tango 0.99.2 Don has been released.
Tangoの、0.99.9の次バージョンは何になるのだろうか
extern(C++) キタコレ!!!!
乙
>extern(C++) これ、軽く祭りじゃねぇの
ライブラリ使えないし正直2.0は暫く見送り……と思っていた俺にもそろそろ『時期』って奴が来たのか?
おまいら、もっと騒げよ
>extern(C++) すげー けど、現状Cライブラリでなんとかなってるし リンクしたいC++ライブラリなんてないしな・・・
もれなくさげてるお上品なおまえらに萌えだ
D始まったな。 遊んでくるわ。
C++のライブラリをポートする必要がなくなったってこと? 誰かエロい人おしえてくれ。
ベターC++ときいて飛んできました
ついにポートする必要なくなったのかな。 本家BOOST使い放題ってこと?
boostは大部分がマクロやテンプレートに依存してるから無理だろ。
あらら。でも、視野ひろがったなぁ。
htodのc++対応版が欲しくなるな。
ざっと見た感じできるのはここまでで extern(C++) { interfance CPP { ... } CPP getCPP(); } CPP cpp = getCPP(); こういうことはできないのか extern(C++) { class CPP { ... } } CPP cpp = new CPP; ここまできたらなんとかして欲しいけど無理か?
>>37 神修正につき翻訳中。
適当にばらしてinabaさんとこのdikiに書いておくわ。
DからC++が使えることよりも C++からDが使えることの方が嬉しい鴨試練
---- C++ ---- #include <iostream> using namespace std; class D{ public: virtual int bar(int i, int j, int k){ cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "k = " << k << endl; return 8; } }; D *getD(){ D *d = new D(); return d; } ---- D ---- extern (C++){ interface D{ int bar(int i, int j, int k); } D getD(); } void main(){ D d = getD(); d.bar(9,10,11); } 例にこんなのあるけど何かダサくね? D d = D::create(); とか無理なんけ?
44 :
デフォルトの名無しさん :2007/10/06(土) 19:36:39
流れをぶったぎってスマン 以下のコードがdmd1.020では大丈夫だが dmd1.022 (1.021も?)では コンパイルエラーになった(【1】の const をはずすと大丈夫)。 ちなみにインデントには全角スペース使いました。 Main.d(29): mixin Test!(TestStruct(12)) does not match any template declaration ----------- Main.d ------------------------- private import std.stdio; template Test(alias test) { void test_func(){ test.hoge(); } } struct TestStruct { void hoge(){ writefln("hoge %d", a); } int a; } const TestStruct test_struct = {12}; // 【1】 mixin Test!(test_struct); void main() { test_func(); } ------------------------------------------------- ひとまず const 外してやり過ごす・・・。
「{C関数}と{クラス}」 だと 「何のクラス」か分からなくなるので the とか it's とか冠詞が付くんじゃないかな よって誤植と推測
翻訳はちょっと一休み。inabaさんのCとのインターフェースの翻訳を流用しながら書いています。 いつも使ってるvistaマシンがアップデートで死んでる。 親指シフターにローマ字入力はきついぜ。
dmd2.005で動かしたら動いた。
というか、なんか勘違いしてたかもw
前スレ
>>979 レスthx!
>>40 これってC++側にvoid deleteD(D*t)用意しないとリークする?
それとも、GCされるの?
C++オブジェクトをDのinterfaceとして取得する発想は盲点だった・・ ちょっと感動中。Cristian Vlasceanuさんとやら天才じゃね? さて、ありがたく和訳を読ませて頂きまする。 # ふつーのテキストが<pre>に包まれて # 横に長ーく表示されちゃってるのは # Dikiの仕様なのかしらん。
草取りを除いて翻訳終わりました。>41のアドレスに。
>>40 DからはC++のクラス全体が見えているわけではなく、
ある型のインスタンスポインタと、その型の仮想関数テーブルだけが見えているようです。
したがって、
・フィールド(メンバ変数)
・staticメンバ
・コンストラクタ、デストラクタ、変換(cast?)オペレータ、演算子オーバーロード、割り当て関数(newとdelete)
これらはすべてアクセスできません。
多重継承したC++クラスのインスタンスも怪しいです。
>>48 リークします。
>40のC++側コードに追加するなら、
int removeD(D* obj){
try{
delete obj;
} catch(なにがしか) {
例外を受け取ったらエラーコードをreturnする
}
return 正常;
}
とするべきでしょう。
多用するなら、D側でラッパとなるクラスを用意して、
そのデストラクタからC++のデストラクタとなる関数を呼び出すようにするしかないかと。
二重deleteの防止などはかなり面倒ですんで、C++側でshared_ptrかGCを用意する対策が必要でしょう。
>>50 d。
そうすると、既存のC++ライブラリをDから使いたければ、
C++でラッパーを書かないといけないんだな。
ちょっと面倒だね。
ダサい部分や面倒な部分も、 Dならどんどん解決策が出てくるに違いないとか思える気分だw D 2.0始まったな!
お前らテンションたけぇなぁ 自分の足の匂いでも嗅いで落ち付けよ ああ臭ェ
構造体の扱いについていまいち不明な点があったので、訳註に加えました。
構造体扱いならメンバと非仮想関数にアクセスできる?(仮想関数にはアクセスできないが)
>>49 # 仕様ではないでしょうか。とりあえずコピペでテキストエディタで折り返すと見やすいかと。
>50に追加。
非仮想関数にもアクセスできません。
vtblしか見えないのか。ちょっと使い道限られるなあ。
COMには最適w
DCOMか
59 :
44 :2007/10/07(日) 00:05:02
D1.022 にあるこれか Bugzilla 1474: regression: const struct with an initializer not recognized as a valid alias template param これはどういうこと?直ったのか?直ってないけど・・・。 仕様としてだめになったってこと??(regression:回帰、復帰、逆行、退化、退行) フォーラム読んでも結論がよくわからず・・・。誰かわかります?
60 :
44 :2007/10/07(日) 00:10:33
こっちも関連あるかな。 Bugzilla 1456: Cannot use a constant with alias template parameters
regressionってのは「一回直ったバグが再発したよ」ってことだと思う
62 :
44 :2007/10/07(日) 01:03:28
> 61 なるほど。じゃあいつか直るってことかな。 どうもありがとう。
>>59-62 「「一回直ったバグが再発したよ」っていうバグを直したよ」ていうのが
> Bugzilla 1474: regression: const struct with an initializer not recognized as a valid alias template param
これなので、直ってないのだったら報告した方がいいかも。
2.005だと直ってるぽいので1.x系の問題かな。
D言語研究、リンクがいくつか変なとこに書き換えられてる? FrontPageの差分を見るとそうっぽいんだけど、携帯からだとよくわからない…
ブラウザの脆弱性を利用してキーロガーをトロイの木馬しようとしているのか 物騒な時代だな
なんかバグ見つけた import std.stdio; void main(){ writefln(join("123", "456")); } string[] join(T ...)(T t){ string[] a; foreach(e; t){ a ~= e; } return a; } joinの返り値が壊れる D2.005
C++のクラスのメンバ変数だけど、無理やり構造体と同じ風にアクセス出来る気がする。 Dのクラスの場合、インスタンスのポインタから+8バイト位置から各メンバ変数並んでいるけど、 C++の場合、+0バイト位置から並んでいるみたい…。
70 :
68 :2007/10/08(月) 00:30:51
68はバグではなかったです。 お騒がせしました。
>>69 ABIの仕様次第なんじゃないのかそんなん
tango使ってみようと思ったらstringが未定義とか言われてしまった。 付属のdmdは1.0.21だから大丈夫なはずなんだけども。仕様?
stringはdmdじゃなくてtangoのobject.diの中身の問題だとおもうので、tangoの仕様なんじゃないかと。
static if(is(string)) alias char[] string;
>>71 マングリング規則や仮想関数テーブルの位置や順番すら処理系依存なんだから、
この際、特定のコンパイラ向けにとことん特化すべきじゃなかろうか。
dmdならdmc++の出力とだけリンクできればいいと思う。
いや、C++はpluginって書いてあるから、abiごとにplugin書かないといけないんだろ。 それより、C++から来た例外をどうキャッチするのかが気になる。
>76 仕様読んでから書け。
すまん、ちゃんとダメって書いてあったな>例外 pluginも、plugin"で"C++対応じゃなくて、plugin"のために"C++対応するんだな。
DMDScriptをD2.0対応にかきかけたが くじけそう・・・
Dにもユーザー定義リテラルください。
ありゃ。C++のマングリング規則ってはっきり決まってたっけ?って 思ってたら、やっぱdmc依存なん? 「C++ではマングリング規則がコンパイラ依存」なんて記述も見つかるし。 そうだとしたら「dmdはC++のマングリングを把握しています」なんて書いてあるけど、 微妙にJARO通報モノだったり? 訳注でも付けとこか。
stlのlistとかに相当するのって出来合いのあったっけ? boost::multi_indexが欲しいがこれは作るしかなさそう
>>82 コレクションクラスならtangoに入ってる。
>>84 ありがとーぉ。dmcはWin32しか無いじゃないかーとか絶望するところだった。
……でも正直書いてあることの意味がほとんど理解できませぬ。
C++ABIの標準を決めようって活動で、
g++とかはそれに従ったマングリングをすることもできる、って事?
Win版に関しては、最後の
「時間がたてば、より多くのC++ ABIの側面が
Dから直接アクセスできるようになるでしょう。」の一文に期待するしか?
>>83 ありがとうございます。
見てみましたがなんか微妙な使い勝手?
>>85 IA-64向けコンパイラでは標準、それ以外のアーキテクチャ向けでもg++とicpcがこのabiを元にした物を標準で使ってる。
DMDで64bit版あったらいいのにって思うのは俺だけ?
>>88 Wikipediaそんなのまでのってるのか・・・
オタクがおおい分野はとんでもない内容まで乗ってますよ。 どうせこの板の常連とかが書いた or 訳したんでしょう。
msvcとdmc++のマングリング規則が一緒でも オブジェクトファイルの形式が違うからリンクできないんだよね? C++って案外可搬性ないんだな
インスタンスからstaticメソッドが呼べるのがちょっとううざったいというか、 演算子オーバーロードでstaticなのとそうでないのが区別できないのが困る
関数でslice/range表現(x..y)を受け取りたい…… void func(real x..y); と関数を定義したいなあ、と。 タプルでもいいから。 末尾を含むかどうかはx...y表現を認めるかどうかは難しそうだけど。 機能の提案って本家のMLとかに流すんでしたっけ?
digitalmars.Dでいいと思う
そもそも range型があってもいいんじゃないかと思う
実装されたときにx..yがx, yに展開されるようになると予想
1..3 は Tuple!(1,2) じゃないといやだよう
1..6はTuple![1,6)
>>101 対カッコの強調表示がむちゃくちゃになるのが難点
Tuple!("[1,6)");
それならTuple!("1..6")にしてやれよww
触ったらかわいそう
先にちょいと提案したいことがあったので、そっちを提案してみる class Foo { enum EnumType { A, B, C } } void func(Foo.EnumType arg); こういう定義のとき、funcに列挙された値を与えるのに func(Foo.EnumType.A) とやたら冗長なので、 func(A) と書いて通るように識別子探索を拡張して欲しいと提案してみる。 これっていまのところ解決策はないですよね?
>>108 今後のプランの一つに入ってるって、どこかで見た気がする。
カンファレンスのスライドだったかなあ。
>>109 それはいいねえ。
早めに対応してもらいたい感じだ
カンファレンスのログはあったと思うので、探してみる
だからslice/rangeはRangeオブジェクトリテラルにしようと(ry
>>93 死ぬほどありがとう。おかげで悩みまくった数時間が気持ちよく無意味になりますた。
そしてdmdのバージョン出力をよく見てなかった俺めアホが!
しかし完全にUTF-8化されているだけあって、Ubuntuじゃ文字化けしねぇなぁ。
Vista買ったのがバカらしくなってきたわい。
>>108 あー。それJavaでもC#でも同じ事思った覚えが。是非是非。
112 :
111 :2007/10/10(水) 00:02:00
て、何自己レスしとんねん。
res[111].replace("
>>93 ", "
>>94 ");
34だた
enumも今になってみると中途半端というかinvariantとかぶってるよな。 定数関連はinvariantに任せて、enumの方はシンボルってことで識別子名を 簡単に表示できるようになってくれればいいのに。 enum使うとデバッグ作業がめんどくさくて。
次の更新→enum廃止
>>115 ありがとう。
enum以外にも魅力的な拡張が多くて目移りしますね。
第一引数が配列である関数をプロパティ的に扱える機能の拡張はいいですね。
ついでにクラス内の(public)メンバを列挙して、自動で配列プロパティに突っ込むテンプレートがあるとうれしいかも……
ついでにデリゲートもオーバーロードしたかったり
>115
struct + invariant配列のほうが便利だったりしますね。パラメタ多いと。
そういえば、pp27あたりのstructがinterfaceを継承できるという案があるが、 あれはC++のクラスを利用する布石ではないかという希ガス まあ、便利なものはテンプレートの互換性がないと何も使えない気も……
delegateのcovariant/contravariantが早く欲しい その次は(環境を持ち運べる)closureかな
>>120 オブジェクト/クラス単位でガベコレのON/OFFって出来なかったっけ
D Conference 2007.jp開かれないかな
>>122 カスタムアロケータを書くしかなかったと思う。
import std.stdio; void main(){ auto b = new B(); b.f(); } class A{ void f(){ writefln("A"); } } class B: A{ final void f(){ super.f(); writefln("B"); } } リリースビルドして実行するとBがダブって表示されるのですが、 これは正しい動作なんでしょうか? バグなのでしょうか?
カスタムアロケータたのCCCCCCCCCCCCCCC
コンパイル時に整数乱数が欲しいんだが、どうすればいいんじゃろう。
thx そういえばそんなのあったなあ。 だけど文字列なのか…ちょっと厄介だのう
テンプレート内で文字列に変換するとき、迷ったらbox(...).toStringすればいいことに気づいた
便利だなこれ
>>120 「開放する」の元の単語ははcollectであってdeleteやfreeじゃないので、
「処理する」「片付ける」のほうがいいかもしれませんね。
>>129 例えばこんな感じ
hashの中身は、なるべくばらけが大きくなるような暗号系のアルゴリズムに近いほうがいいかも。
この値をキーにして、立ち上がりの早い擬似乱数生成器にかける方法もある
いずれにせよインチキなんで、求める乱数性に応じて適当にやってみてください
int hash(in char[] x) {
int sum;
foreach(c; x) sum^=cast(int)c*3;
return sum;
}
static if( hash(__TIMESTAMP__) == 1 ) {
}
132 :
120 :2007/10/11(木) 10:47:31
>>130 おおう、対応どもです。しかしせっかく真摯に対応していただいて申し訳ないのですが、
私の言いたいことは翻訳の仕方に関してでは無く、書いてある内容そのものなのデス。
多分原文でも言ってることは同じで、翻訳には問題なかったんじゃないでしょか。
というわけで、改めて
>>120 の疑問を書き直してみたり。
「Dでnewした領域のポインタをC++に渡してやってもいいけど、
途中でGCが走ってその領域がcollectされちゃうと、
いきなりポインタが無効になってC++側が困るよね。
だから以下ほげほげな方法で、GCのcollect対象にならないよう気をつけてね」
ってヲルターは言ってるけど、ポインタが無効になる要因ってcollectだけじゃないよね?
http://www.kmonos.net/alang/d/garbage.html によれば、
> 4. 残ったメモリ領域のデータをコピーして使用領域をまとめる処理 (コピーGCと呼ばれます) が実行される可能性があります。
> ガベージコレクタは、オブジェクトをメモリ上の任意の位置に再配置することがあり...
つまりcollect対象でない「生きた」領域を指すポインタだって、GCが走れば再配置によって無効になる可能性がある。
本当は「生かす」だけじゃなく、そのメモリ位置に「固定」する方法が必要なんじゃないか?
……って、アレ? このへん「Cとのインターフェイス」に書いてあることと同じじゃないすか。今気付いた。
今まで問題になったことなかったっけ? 再配置なんて実際には滅多に起こらないとか?
>>132 ・今のPhobosとTangoのGC実装はコピーGCじゃないので、再配置なんて実際には決して起こらない
・もし実装がコピーGCに変わったら、指摘されてる通りの問題は起きる
・そんときは std.gc.fix(void*) みたいな固定するメソッドが追加されるんじゃないかなあ(予想
Tangoのほうは仕様変更とかないの?
SDLのD2.0用のポーティングってある?
>>133 managed C++ に、pinっていうのがあったなぁ
(ピン止めという意味)
>I think Herb was talking about ADL. D doesn't have ADL, but the next update will include "overload sets" which, although very different, accomplish the same thing. 大風呂敷ktkr。非常にwktk。
だれかよんでくだしい
私は、Herb(人の名前?)はADLについて話していたと思っている。 DはADLを持ってはいないが、次のアップデートの際には「overload sets」が導入されるだろう。 これはADLとは非常に異なるものの、同じことを実現するものである。
誤訳や補足があればおながいします
元の話よんでないけど文脈からして Herb = Herb Sutter (C++のえらいひと) ADL = Argument Dependent Lookup namespace Hoge { class X{}; void foo(X* x){} } foo( new Hoge::X ); // Hoge::foo って書かなくても、引数のクラスと同じ名前空間で // 定義されてるfooを勝手にコンパイラが呼んでくれるC++の機能 // 複数の名前空間にまたがって関数オーバーロード出来る かと。 Walterたんは昔ADLやるとカオスになるからやらないって言ってたけどどうなるんだろう
ネームスペースあえてつぶすようなマネはやめてほしいなぁ。。。 パールのお化けがでるよ?
(new Hoge.X).foo(); に限ってADLを行うようにすればいいんじゃね?
それは、配列のプロパティ的な引っ張り方だねぇ。 うーん。わかる人にはわかるって感じだなぁ。 むー、どうなるんだろうねぇ。
この問題はこういうのだと把握 //b.d void func(string){} //a.d import b; void func(int){} void main(){ func(10); //オーバーロードと考えてこれを呼べてもいいだろうに //func("hoge"); b.func("hoge"); // 現状フルネームが必要 } ADLあんまり知らないんだが importされたモジュールのシンボルと真の意味で重複しなければ 呼び出し可能にするだけだと思うんだけどややこしいことが必要なの?
それちがくね?
あれ・・・違ったらすまそ ADLは引数の型の名前空間を見に行って関数を探すみたいだけど そんなややこしそうなことしなくても素直に考えたら a.func(int) を a_func_int として b.func(string) を b_func_string としておいて どこかで func(10) を見つけたら *_func_int のシンボルを検索し func("hoge") を見つけたら *_func_string のシンボルを検索するだけだよな? それでコンフリクトが見つかったらあいまいな関数呼び出しエラーにすればいいんじゃないのかと思って
なんかすごく勘違いしてる気がするぞ
ううむADLが何で必要なのか勉強してくるか・・・
てか調べてから家よ。 なんでお前の想像でレスを消費しなきゃなんないんだよ。アホかいな。
低レベルな質問で申しわけないんですが、構造体データを std.file.read() や std.file.write() で読み書きするにはどうしたら 良いんでしょうか?というか、void[]型の使い方がいまいち分からない。
155 :
154 :2007/10/12(金) 23:12:13
すいません、自己解決しました。 void[] は型のない配列だから、構造体もlengthが1の配列にして受け渡しすりゃ良かったんですね。
自分でも試してみたけど、そういうmarshalっぽいのはすごい泥臭くなるのね。 毎回手で書くようなもんじゃないということなんかな。
構造体をうにおんで囲んでryとか
泥臭さもDらしさではある
(cast(ubyte*)&st)[0 .. st.sizeof] 共用体のほーがいいかもなー
YAMLの実装はありますか?
162 :
デフォルトの名無しさん :2007/10/13(土) 22:42:49
>>135 DerelictのD2.0用のポーティングならある
そろそろ1系列から2に乗り換えようと思うんだが何がどう変わる?
その辺よくわかんなくてずっと1系列使ってる俺。 詳しい人誰か移行ガイドとか書いてくれないかなと思い続けている。
>>164 いいだしっぺの法則で是非 m(_ _)m
constとか文字列のコピー、そのあたり型が厳格になったのが
違うと思う
2.0 ちょっと使ってみた感じ ・doxygen 未対応(const な引数、戻り値を使うと正常にパースできない)。 ・各種ポーティングを2.0用に(若干)修正必要。 ・各種ポーティングに渡す時にキャストが必要。 例えばtoUTF16z()などの戻り値が(const wchar*)だけどポーティングのほうは(wchar*)なのでcast(wchar*)が必要 ・文字列リテラルが invariant なchar[] なので char[] s = "hoge"; とかやってると修正が必要。 だった。文字列リテラルはともかく、各ツールやライブラリが2.0用に対応してないと面倒くさくて適わない。 結局1.0に戻った。const/invariant/final は1.0に初めから欲しかったなぁ。
167 :
166 :2007/10/14(日) 13:20:23
あと不安定だった。bindings の win32 は修正しないと無限ループ突入したし。
constといえば、 const(C) c; //Cはクラス というメンバ変数に代入しようと思ってもできない(言語仕様上できるはず)とか、 メンバ関数でfinal constってできないこととか、 「一度初期化したら変更しない。初期化はコンストラクタじゃないメンバ関数で行う」 ということをしたいときに、finalが使えないこととか、 使いにくい点が多数。 将来なんとかなるのかな。 あと、「あるオブジェクトが別のオブジェクトの参照をもつ」ということをたまにするけど、 そのとき、別のオブジェクトを変更しないときはそれにconstを付けたいと思うのが普通だと思う。 で、そうするとその別オブジェクトに含まれるポインタには全部constが付いてしまう。 例えば、別オブジェクトにHWND型の変数があって、それを取り出してAPI関数に 入れるときには、constが付いてしまっている。 何が言いたいのかというと、win32のバインディングを完全にD2.0に対応しようとするならLPCSTRをconst付きにするだけでは駄目だということ。 ポインタ型を引数に取る全ての関数について、正しくconstをつけないといけない。 でも正直、win32をポーティングしてる人たちがここまでやるとは思えないし、なんかconst周りは絶望感しか感じない。
169 :
168 :2007/10/14(日) 13:52:10
あと、余談だけど、関数引数のinって値渡しだったんだな。 参照渡しだとずっと思ってた。 どこで勘違いしたんだろ。
170 :
163 :2007/10/14(日) 14:09:05
>>169 ポインタの値渡しだね。
1.0の in/out/ref は正直使いにくいと思った。
in でも参照先の値を変更することがいくらでもできるし。
const まわりはまだ検討が足りない気がするなぁ。
>>171 >ポインタの値渡し
? アセンブラでみるとポインタで渡すのが参照渡しとおもってたんだけど・・違うのかな。
>参照先の値を変更することがいくらでもできる
castしてない?
CTFEでForeachRangeつかえないのかな?
174 :
168 :2007/10/15(月) 00:13:18
>>171 >ポインタの値渡しだね。
ただの値渡しだと思う。
デバッガで逆アセしたコード見てみたら、inがあってもなくても同じコードになってたし。
175 :
171 :2007/10/15(月) 01:14:50
>>172 , 174
ああ、ごめん。俺が言ったのはクラスや配列を引数として渡すときのこと。
int などの基本型ならそのままの値渡し。
176 :
デフォルトの名無しさん :2007/10/15(月) 20:42:17
/* 以下のコードがコンパイルエラーになるんだけどバグ? bug.d(12): Error: this for m needs to be type S not type bug.C bug.d(12): class bug.C member m is not accessible */ import std.stdio; import win32.windows; struct S { int m; } class C { int f() { return S.m.offsetof; // エラーになる } } int main() { writefln("%d", S.m.offsetof); // これはOK return 0; }
バグっぽいね
デリゲートの挙動が意味不明だ
デリゲートな部分ですから、、、
【審議中】 ∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
OpenGL+SDLでゲームを作っているのですが、 SDL_mixerとABAさんのsound.dを使うようにしたところ、 Out of memoryというエラーが出てクラッシュするようになってしまいました。 メモリ使いすぎかと思ったのですが、 タスクマネージャから見るとメモリ使用量はほとんど増加していないので、 どんなバグを疑えばよいですか? ソースコードの変更点としては、数箇所にSound.playSe()とSound.playMarkedSe()を追加しただけで、 しかもこのライブラリはABAさんが実用化しているので、何が変わっているのかさっぱりです。 これを取り除くとやはり発生しなくなります。
書き忘れ。 コンパイルは成功して、同じ用にゲームは動き、音もなるのですが、 しばらく動かしていると突然エラーが出て終了する、という状態です。
D言語のコンパイラ精度ってどうなの
正確性には欠けるな。バグだらけ
188 :
178 :2007/10/17(水) 02:36:03
爆弾キターーーー
ttp://www.digitalmars.com/d/changelog.html What's New for D 2.006
* Transformed all of string, wstring, and dstring into invariant definitions.
Tons of changes in function signatures and implementations rippled through the standard library.
Initial experience with invariant strings seems to be highly encouraging.
* Implemented Overload Sets for functions and templates.
phobosの機能追加は多すぎて省略
何か凄い凄い。 std.getoptでプログラムの引数の利用が容易に、std.fileにディレクトリ内のファイル一覧を簡単に取得する方法が無かったのが修正された、std.stdioに機能増えすぎワロタ、std.contractsが新鮮。 std.conv.parseとstd.string.munchのコンボもいい。けど、refを使ったのは別のモジュールにまとめて欲しいような気がしないでもない。
すごい、すごいけどD1.0系列の更新が止まったように見える… 仕様が固定されたD1.0系列を使うか新機能とPhobosが見せる巻き返しを堪能するためにD2.0を使うべきか…悩ましい…
何がすごいのかさっぱり分からん
193 :
デフォルトの名無しさん :2007/10/17(水) 05:59:56
D言語  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ___ _ / ____ヽ /  ̄  ̄ \ | | /, −、, -、l /、 ヽ | _| -|○ | ○|| |・ |―-、 | , ―-、 (6 _ー っ-´、} q -´ 二 ヽ | | -⊂) \ ヽ_  ̄ ̄ノノ ノ_ ー | | | ̄ ̄|/ (_ ∪ ̄ / 、 \ \. ̄` | / ヽ ` ,.|  ̄ | | O===== | `− ´ | | _| / |
な、なんだどうした何が起こった!? 日本語訳を! 良いニュースなのか悪いニュースなのか!?
C++が使えない無能の為のプログラミング言語=D言語
ktkr
こりゃまたすごいのきたな。
てかD言語ってまだ開発してたのか
標準ライブラリって本当にPhobosからTangoに移行するん?
>>199 定期的に話題になるよな
2.0をいじってたら、
Tangoのわなびとしか、最近思えなくなってきた。
あ、string系のaliasがconst(char)[]からinvariant(char)[]に変わったのか。 ……どーいう意味を持つのかイマイチ分からない。 というか、未だに「invariant型」の動作がよく分からん。 invariant(char[]) book = "I, Robot"; って宣言したbookに関して、 book ~= " by Isaac Asimov"; book.length = 1; book = "2001 Space Odyssey"; こういう動作は別に禁止されないんだよね。invariant型って、どういう目的で使えばいいの?
>>191 D2.006の新しいPhobosの機能をD1.xに移植した人がdigitalmars.D.announsに。
std2ってやつ。
>>202 invariant(char[]) book = "I, Robot";
を
invariant(char)[] book = "I, Robot";
で、意味が変わるきがするが
>>201 !isはisが導入されたときからあったと思う
>>202 たとえば
class Stream {
int opApply( int delegate(ref const(char)[] line) dg );
}
こういう宣言だったとしたら、
string s;
foreach(line; din) if( line[0] == '#' ) s = line;
writeln( "#で始まってた最後の行は", s );
このコードは期待した通りに動かないかもしれない。
Streamが内部でlineの中身を勝手に再利用してるかもしれないので。
constだと、"自分が"lineの中身を書き換えることはできなくなるけど、
他のところで書き換えが起こる可能性は否定できない。
これが
class Stream {
int opApply( int delegate(ref invariant(char)[] line) dg );
}
こうだったら、opApplyの実装を見るまでもなく↑のコードは普通に動く。
invariantな配列の中身はもう"誰も"書き換えないので、Streamが後で
書き換えるようなことがない。
とかそういう使い方。
おい。invariant周りでコンパイル通らなくなったぞ。 まーた全部書き換えかよ…
なんでもかんでもidupつけないといけないのは気持ち悪いな
aasumeUniqueでおk
>>208 動作確認してなかったので翻訳してなかったんだが、
string, wstring, dstringの定義をinvariant付きにしました。
関数の定義と実装を(標準ライブラリ関数の影響も含めて)山ほど変更する必要があります。
invariantなstringを使ってみた最初の感想としては、かなり有望です。
なにがどう有望なのか試してないのでなんともいえませんが。
おいおい、phobos 張り切るのもいい加減にしろよ。tango の立場がなくなっちまうじゃないか。
walたんがTangoに「○○追加してね」っていえばいい
D2.x用のTangoは、どうなってる? もう出てる?
import std.stdio, std.contracts; void main() { foreach(string line; lines(enforce(fopen(__FILE__)))) { write(line); } } SUGEEEE
そんな感動するようなことじゃないが、これまでなかったのが不思議だな。
そういう短いけれども案外実用的なコードがたくさん欲しいところ
>>187 解決しました。
すいません、もともとあったメモリ関係のバグが、たまたま出てきた形でした。
D言語、1系が安定しない永遠のβだった頃から注目してるけど、 1系が成熟しないままさっさと2系に移ったところを見ると 実用的になるのは3系が登場してからかなと思ってしまう。
Dは永遠にをるたんの実験言語。 実用的になるなんてあり得ないよ。
>>209-211 さっぱりわからんのだが・・・
idup付ける代わりにassumeUniqueで済むってことだけじゃないよな?
余計にタイプ数増えるんだが
本当はassumeUniqueは何のためのものなの?
>>223 idupはデータのコピーが行われるが、
assumeUniqueはコピーが行われない。
>>224 うーん
そうですか
もうちょっと暗黙のコピーが発生するのを許容して
明示的な指定が減るようになったらいいね
テストしてなさすぎワロス いろいろ試してみたがdmd2.006はstd.formatが壊れてるな //>writef //testtest1010 //%s=%dvalue200 import std.stdio; void main(){ writef("test", "test", 10, 10, "\n%s=%d", "value", 200, "\n"); }
>>226 >Breaking change: std.stdio.writef can now only accept a format as its first argument.
>>227 あ 最後に書いてあるのそういうことか thx
stringにconstつけてみたりinvariantになったりするのはWalterたんからの「ソース見直せリファクタリング汁!!」というご命令に違いない!
Andrei Alexandrescuありがとう、そしてがんばれー とエールを送っておこう
>>230 Andrei Alexandrescu先生のTMPが見られるのは今やD言語だけ!(でもない)
gdcってdmdで言うv2.0以降はあるの?
svnで対応してるよ。
coroutineが、phobosでほしいなぁ
そこは言語仕様に組み込むべきだろう。
dmd2.004 以降でこういうちょっと怪しいのをコンパイルしようとすると途中で固まる。 void main(){ f([[]]); } void f(int[][] a){} f(cast(int[][])[[]]); ならおk -v 付きでコンパイルすると semantic3 までは表示されるけど code が表示されずに止まってる。 何これ?
D言語で作られたアプリケーションって何があるよ
Dで作ったOS それがDOS
in const constってどういう意味ですかwwww inって invariant const scopeだったよねwwwconst三つですかwwwww
typo ソース見れ
D言語でstaticライブラリをつくる方法はどうやるのでしょうか。 コンパイル激早なんで、やる必要があまりないのかもしれませんが・・・
budなら bud -lib main.d 何も使わないでやるなら dmd -c main.d lib -c -l main.lib main.obj
>>240 なんかintつけるとDDocが変なものを生成する。
static引数まだー?
関数名に?入れて述語ry そういやなんで?とか!とかは識別子にならないの?
scopeクラスが単にnew ScopeClass();でエラー出さないでしかもスコープ抜けてもデストラクタが呼ばれないですけどこれはバグ?
やっべDMD古いからかな。新しいので試してみます。一応古いのは1.020です
>>249 scope周りはバグだらけ。もうどうしようもない
把握しました
本当にconstとかinveriantとか必要なのか? C++から移ってきたときはほしいなと思ったこともあったけど、現状のconstとinveriantを見てるとうざったさ以上の便利さを感じない… もっと上手い方法なかったのかな…
デリゲート便利だなw Scheme触って帰ってきたら使わずには居られないwwww
>>253 constまわりは、まだまだこれからって感じだと思う。
現時点では文字列をimmutableにするためにしか使われてないし。
評価を下すのはまだ早いと思う。
現状のconstまわりの仕様には問題あると思うが。
文字列(配列)のスライスはコピー作らないから、文字列をimmutableにする意味はあると思うし、現時点では、
「inveriantは文字列をimmutableにするためのもの」
って割り切って、それ以外の機能は使わないようにすれば何とかやっていけそうだと俺は感じてる。
勇気出してD2を入れることにしたぞー!
macroって結局なんなの?
>>258 カンファレンスのをるたんのスライド見れば分かるよ。
それでも俺は1系列を使い続ける
>260 1系列は俺に任せてお前達は先に行け! まで読んだ
>>262 つまり行間じゃなくて字間を読んだということか
D2.0のstring周りの改変は 暗黙のコピーがいやでしょうがない どこでどう動いてるか把握したい 文字列で、知らぬ間にメモリをちょっとでも使われるのも嫌でたまらん ってことかな。 スクリプトライクな手軽なコーディングを できるだけ殺さないように、がんばってんだよね
みんな phobos と tango のどっち使ってる? phobos は単純明快だが機能面でちょっと不足な上にバグ多いし、 tango は機能面はある程度充実してるけどドキュメントが整備されてない上に使いにくかったりするし、 なんかこう、どっちも中途半端なんだよなぁ。
266 :
デフォルトの名無しさん :2007/10/20(土) 22:28:27
>>248 全角?も駄目なんだな。これで我慢しとけ。
bool もしかしてnullですか(Object nullかどうか調べるオブジェクト)
{
return nullかどうか調べるオブジェクト is null;
}
もしかしてnullですか?
もしかしてnullですか¿
nullですよ¡
>>264 藻前は組み込みに向いている
Dが組み込みに対応するその日まで
Dで生き延びろ
>>265 両者の良いところが全部一つに集まると、
素晴らしき真のDが誕生してどんな願いも叶えてくれると伝説にはあります
>>270 げ、するどい 正直びっくりした。
組み込み屋です。 Dが早く使えないかねらってます。
ちょっと和んだ
>>273 そう考えると2.006 invariant stringは有望だなあ。
Walterたんが「リアルタイム処理ではmalloc/freeよりGCの実行制御のほうが有利なこともある」
ってるが、そういうのは確かにあるので分かる気はする。
実際free listと組み合わせるとなかなか高速に動作してくれるし。
ada並の用途になるとDも本望だろう。
D1〜D7まで揃えるとDragonが(ry
組み込み屋ってなにするひと?
組み込みに関してはかなり素人で見当違いなことかもしれないんだが… たとえばH8のマイコンがGCCのコンパイラでコンパイルできるみたいだけど、 GDCとH8を使ってD言語による組み込み向けのプログラムを作ることはできないのかな?
GDC
ごめん、途中で送ってしまった GDCでクロスコンパイラはつくれるかもしれないが、 ターゲットが32ビットCPUでないとだめかもしれない。
tango 0.99.2を使ってるんだが、IConduitやらOutputStreamやら入出力周りの関係と用途がさっぱりわからん。 ソースによらず汎用的にストリームを扱いたいときはどのインタフェースをサポートすればいい?
>>281 去年 gdc を H8 にポートしてみた事がある。
phobos の GC がうまく動作しないところで絶賛放置中。
2日の作業じゃここらが限界だった。
GCつかわなければいけるんじゃなかろうかと一瞬考えたけど、そんなDに意味はあるのかどうか真剣に考えてしまった。
ベターC++と高速コンパイルだぜ!
GDCだと遅い罠
じゃあ意味ないんじゃね?
290 :
デフォルトの名無しさん :2007/10/22(月) 00:56:13
>>284 flectioned から抜き出してみた。tango と phobos の差異を吸収するような
書き方が一番なんでないかい?
static if(is(typeof((new object.Object()).toUtf8()) == char[])){
const bool inTango = true;
const bool inPhobos = false;
}else{
const bool inTango = false;
static if(is(typeof((new object.Object()).toString()))){
const bool inPhobos = true;
}else{
const bool inPhobos = false;
}
}
static if(inTango){
import tango.stdc.stdio;
} else static if(inPhobos) {
import std.c.stdio;
}
int main()
{
printf("Hello world");
return 0;
}
またあげちまったよ・・・すまん
ttp://dsource.org/projects/tangobos/browser/trunk Tangobos is a compatibility layer to allow most Phobos software to be compiled unmodified on Tango.
It is effectively a port of Phobos to Tango: it is only modified to the degree required to make it compile.
これってTango/Phobos共存させるのが目的なんだよな?
テラタンゴボスwww
なんというド直球ネーミングw
D言語製のブラウザってある?
>>292 Tangoboswww
見間違いかと思ったわw
297 :
デフォルトの名無しさん :2007/10/22(月) 12:57:13
>>292 Tangoの上に乗っかるPhobos互換レイヤか
どっちかに統一したほうが良いように思うのは俺だけ?w
Tangoboswwwwwwwwwwwww
>>298 統一してほしいね〜
そもそも、TangoはPhobosと共存できないように
作る必要があったのだろうか?
誰かがグレイトなライブラリを作ればいい。 どうせ D はまだ実用されてるとは言いがたい状況なんだし、 新規のライブラリがポンと出てきた所で問題は無い。
それをここで作るんですよ
Pascal型UpperCamelCaseが嫌いなのでphobos中心にマージされて欲しいと思う俺がいるが、 phobosはバージョンアップに追従するのが原則、 Tangoはそこまでやったりもしてないからなあ。 C++ユーザからの乗り換えパスとしてSTLとboost相当の移植は欲しい気がする lexical_castとかはC++では使えるけどDではtoStringその他が使えるからまあいいけど。
>>303 >lexical_cast
確かめてないけどstd.conv.toは?
makefileがわりにmake.dってファイル作ってrdmd make.d optionってやるのよさそうだね。 bud使ったほうが早いかな?むしろrdmd bud.dってかww
いまさら気づいたけどなんもよくないね
D2でライブラリ関係のコンパイル通らなすぎわろたあああああああああああ
>>303 ちゃんと「The D Style」なんてのまで存在してるのに、
そこまでlowerCamelが嫌いだったのかねぇ・・。
豊富な機能やクラス設計に「おお」と思いつつ、ドキュメントのHelloWorldを見た時点で
> tango.io.Console;
「え? モジュール名・・」
> Cout("Hello...")(s).newline
「え? Coutて? UpperCamelな関数? いや()演算子持ったオブジェクト?
つかなんで可変引数使わへんのん? で、newline? 構文が最終的にプロパティ参照になっちゃってるやん?」
そんなTango。
そういう話題が出ないはずないと思うんだけどなぁ・・・ なんか考えがあってのことなのかね?
Tangoは機能自体はいいんだが、俺も設計が気に食わない。
たしかにCoutはきもい void coutln(T...)(T t){ ... } とか各自定義汁ってことか?www
とりあえず動けばおkってことになってるのかな???
自分はCoutよりStdout派。 import tango.io.Stdout; Stdout("こんにちは 世界\n"); Stdout(1, 2, 3, 4, 5).newline; int a = 5, b = 10; Stdout.format("てすと {} + {} = {}", a, b, a+b).newline;
opCallのオーバーロードは、C++のビットシフトのオーバーロードより数倍キモイ。
まぁ、なんだかんだワガママ言ってもphobosよりはOOPが生きてるし、 使いたいといえば使いたいんだよねTango。 SDLに対するSDL_image/mixer/..、C++のSTLに対するboostみたく、 phobosがコンパイラ添付の最低限ライブラリ、 Tangoが「事実上の標準」な拡張ライブラリ、とかに分かれててくれるのが理想と思う俺。 組込みとか色々タイトな分野じゃない限り、普通Tangoを被せて使うものだよ、みたいな。
ならTangoはPhobosを利用しないといけないな! つーかなんでTangoはPhobosと共存できないのwww意味不明wwwwww
Phobosは廃止でいいよwwwwwwww
そこでTangobosが登場する?? Phongoとか、ネーミングはもうちょっとなんとかならんかったのか。
Tacos
>>304 俺も使ってないけど使えると思う。
というのはともかくとして、C++はlexical_castが無いと面倒な場面があるのだが、
Dではstd.conv.toを使わなくても結構いけるのでそのへんが良い。
無理に2つのライブラリ名入れることも無くない?
PThaonbgoos
よめなす。ふぁんぐーす(bはサイレント)?
たんごぼす
こんどこそでいもすで
Daimos(デイモス)はもうすでにあるし、Harmonia(ハルモニア)でよくね? ギリシャ神話でアレス(Ares)の娘…ポボス(Phobos)とデイモス(Daimos)の妹? ハーモニー(調和)の語源。とってつけたような設定じゃないか。
すまん、スペルミス。 ×Daimos ○Deimos
ハルモニアっていうとロマサガ思い出す・・・
>>328 それいいけど名前資源の無駄遣いはそろそろ控えるべきだと思ったw
やるならマジでやって欲しい・・・
あるのかよ だから無駄遣いはダメだと(ry
あったのか ライブラリの名前資源の干渉は防げないもんなぁ
じゃあ、 com.digitalmars.phobosとかするか?w
そんなことされたら勝手に名前変えるぞゴルア
もう日本語にしちゃおうぜ
しかもひらがなな
日本人である私たちがコードやコメントやパッケージ名に日本語を使わないのはおかしい! って言ってみるテスト
import 標準.標準入出力; void main() { writefln("ほげほげ"); } // こんなの嫌だぞ俺w
でも import std.stdio; よりは意味が取れる罠w 表意文字万歳
ヒント: タイプ数
じゃあひらがなかカタカナでいこう
ヒント: 文字幅
輸入 標準.標準入出力; 無 主() { 整形書出改行("ほげほげ"); } こんな中国産言語ならありそうだな
そしてブロックはPython風にインデントでやれば{}も消える!!
>>344 半カナはどうだ? タイプはかな入力で。
ドウニュウ キカク.キカクニュウシュツ;
ナシ メイン(){
ギョウカキ("ホゲホゲ");
}
話を広げておいて申し訳ないのだがものすごい既視感がwww 前に似たような話してたお
>>347 かな入力なんてできる人はかなりレアだぞ…
俺にはつらいw
Phobos上でTangoが動作しつつ、キモイ名前をどうにかしてくれたらTangoはかなり使いやすいライブラリだと思うんだ。 って話だったっけ?
まったくそのとおりである
std::cout << "hoge" << std::endl; の悪習を引きずるかのような Cout("hoge").newline; に代表される 気持ち悪いインタフェースがなくなればってのも加えておいてくれ
そもそも std::cout << "hoge" << std::endl; の良かったところはグローバルな演算子オーバーロードで簡単に拡張が加えられるところだったと思うんだ。 std::ostream& operator<<(std::ostream& strm, const Hoge& fuga); 逆にいえばこれが使えなければ意味がないわけで… Cout("hoge").newline; とかは何を意図してこんなことをしようと思ったのか… まぁ、可変個数引数だと問題はあるけど。 String s; Cout(s.append("aa"), s.append("bb"), s.append("cc"))).newline; これだと aabbccとなるかccbbaaとなるかわからん。
ここではおまいらが好き勝手言ってるだけだけど、 何か良くて何が悪いのかが評価できるなら素晴らしいライブラリを作ることもできそうなのになw Phobosのobject.dをいじらず、The D Style準拠で Cout周りのインタフェースをほげほげした(どうすんだこれ) そんなTangoに改造したらいいってわけか
2か所訂正…orz auto s = new String; で aaaabbaabbccとなるかccccbbccbbaaとなるか…か。
>>353 待て待てその最後みたいなのはC++でもやっちゃいけないことになってるんじゃなかったか
それを問題視する必要はないことしようぜ
>>353 >演算子オーバーロード
ヒント: toString
358 :
357 :2007/10/23(火) 03:05:52
あ、でもtoStringよりもストリーム演算子の方が効率的だわな。
>>353 >opCall_rまだー?
まで読んだ。
("hogahage")Cout; こうですか><
俺もそうおもたw けどおかしいだろw
(Cout "hogahage"); じゃあこうですか><
そして半角ひらがなの復活
>>363 ちょ!それスレ違い。
いや、俺もそのスレみてるからわかるんだが。
369 :
デフォルトの名無しさん :2007/10/23(火) 21:07:29
>>366 関数名はキャピタライズを採用して欲しかった俺がいる。
Time now = Now;
とかやりたかったのに・・
これで諦めてください><; Time now = Time.now();
371 :
364 :2007/10/23(火) 23:33:54
http://www9.uploader.jp/home/sukiyaki/ ここのアップローダはD関係なら自由に使ってください。合計200MBまで入りますから。
っていうか、人のライブラリがどうなってるか気になる!!!
そうそう、あとで後悔した時用に削除Passを忘れずに。
で!レスサンクス!!
>>366 こういう先頭大文字とかって名前あったんですね。。。
C++辺りからの癖になってるんですけど、次は小文字も検討してみます。
>>367 それ言われるとちょっと弱い。笑
Hにも・・・を見るとTangoだとかvar1系だとかそういうのが良くわからないので使ってないんですけど、
将来的な移植性を考えるとやっぱ習得したいですねぇ。。。
「ひとこぶらくだはひとこぶうんち ふたこぶらくだはふたこぶうんち これはうそ!」 lower/upper camel という字面を見てたら思い出した子供時代のはかない記憶。
Overload setっていうのでtoStringがかぶらなくなるのかと思ったら import std.string; class Foo { void bar(char* ptr) { string s = toString(ptr); // std.string.toString(char*)呼んで欲しい // けどObjcet.toStringにマッチしないのでエラー } } ダメなのか。まあstd.conv.toができたからいいけど
string s = .toString(ptr); って書けばいいから、できなくても別に不便ではないな
ExceptionとErrorの使い分けがわかりません>< おしえてくだしあ><
class Exception; 回復可能な例外は全て Exception クラスから派生すべきです class Error: object.Exception; 回復不可能な例外は Error クラスから派生すべきです
回復が可能かそうでないかの区別がつきません><><><
例外が回復可能かどうかなんて設計段階で判断できるような。 設計で判断できなくても経験積めばここは復帰無理だなっていうのが直感で分かるように。
どの範囲で復帰不能か可能か、って話もあるしな
なにがどうなると回復不可能になるの?
回復が不可能になるとだな
場合によりけりでしょ。 タイムアウトなんかで期待される結果が帰ってこなかった場合に、 初期値等のテキトーな値代入して問題なく処理続行できるなら例外、 出来ないならエラーって言う感じでいいんでは。
回復不可能だって分かった時点でErrorの子クラスでExceptionをラップして投げなおせばいい。
にゃる そういう意味なのか システムがぬっ壊れたりするのかとおもた
俺が分類したケース
回復不能
・root/admin権限が必要なのになかった
回復可能
・ファイルが見つからなかったが、指定しなおせばよい
>>384 最終的にはシステムがぬっ壊れない限りは回復の手段を用意することはできるかと思う
処理続行できるような想定範囲内のエラーで例外投げるな。例外は例外的な事態に使用すべき。 ……みたいなの(やや極端な言い方だけども)を信じてたんで微妙に慣れない。 多分戻り値でエラー処理みたいな文化が嫌なんだろうけど、効率なんかも考えると回復可能なエラーまで例外ってどうなの? って気がしてしまう。 上みたいな(勝手な)文化を持ってたせいかExceptionに回復可能な、みたいなニュアンスも感じないし。 実際のところDでなんか書いてるときにみんなErrorとException使い分けてるの?
俺の考えでは、プログラムの動作自体が危うい場合がError。 それ以外は全部Exception。 たとえば、ファイルをコピーするプログラム、copyを作るときに、 パラメータで指定されたファイルが見つからない場合は、Exception。
基本的にException。 拾いたければ拾えばいいじゃん(たいていは回復可能だから) というスタンス。 行列演算で要素数が不適切なときもException(動的に要素数を決められる場合)。 ただし契約違反は実装者が間違ってるからassertするときはErrorが多い。
>>386 引数、返り値が適切なほうがいいというのはあるかもしれない。
計画の中にpureという仕様が入ってるが、
ああいうのをまじめにやるならエラー処理のために引数や返り値がつぶされるのは好ましくない。
>>386 > 処理続行できるような想定範囲内のエラーで例外投げるな。例外は例外的な事態に使用すべき。
これは誰の教えなのかkwsk
人生のExceptionが発生しました
回復には神権限が必要です
引きこもりでごめんなさい→Exception 生まれてきてごめんなさい→Error ってことか
お願い届いて!!私のException!!! 引きこもりでごめんなさい。
そろそろ人生のErrorが発生しそうで不安になってきた。
Javaみたく「こいつはこーいう例外投げるかもしれんからちゃんと対処しろよ!」ってコンパイラに言われないしなぁ。 意識してErrorを自前で投げたことはないや。 assert違反とか、デバッグモードで埋め込まれる配列境界チェックなんかはErrorか? そんくらい。 あれ? ErrorてExceptionの派生クラスだったのか? つまり「Error is a Exception」「回復不可能は回復可能の一種」 ・・あれ? おかしくないですかカテジナさん!
ファイル読み込みルーチンで、開くべきファイルがロックされてたり ファイルがなかったりしたら、再試行とか考えてException、 そもそもファイルシステムや開くファイルの種類が非対応だったりして なにをどうしようがファイル読み込みは無理、ってなのはError、とか。 ただ、それらを受け取るルーチンでは、たとえば別の読み込みルーチンを 使うとかで、(より大きな枠組みから考えると)復帰可能だったりするかもしれない。 という感じで、回復可能か否かが処理の段階によって変わることに注意して組むと Errorの使い出もあるんじゃなかろうか。
Errorがでたのに何事もなくプログラムが動作し続けるってのは、ちょっとおかしいと思う。 それだと正常系に復帰してるじゃん、と。 OutOfMemoryぐらい致命的でないとErrorというのとはちょっと違うと思う。
>>399 回復不可能は回復可能がグレードアップ!
という考えで
つまり、ErrorをExceptionで捕えることができるのはおかしい、と。 Exceptionを派生したErrorってのがおかしいんだよな。 Errorを派生したExceptionとか、ErrorとExceptionはそれぞれ何からも派生してないってのがいいような気がするね。 Tangoみたいに安易に消しちゃうのはどうかとも思うが。
>>399 頑張ってメモリ解放して状況解消する頑健なプログラムだってありうるべ
メモリ食いつぶしかねないプログラムなら特に。
どんなエラーも何らかの処理がなされる、というのがDの例外機構なわけで、
399的な「絶対に正常系に復帰しない」発想だと、例外もクソもなく強制終了
するしかない状況じゃないとErrorを出さない、という意味のない話になるべ
何が正常動作かは処理の段階によって変わるんじゃね
その処理の段階ってちゃんと定義されてるのかな? 今のままだとExceptionとErrorがごっちゃになりそうな悪寒
むしろError使ったことないし 必要な場面に出くわしたことがないし これからも使わない気がしている
そういうのを定義するのが設計だべ まあそんなまじめなプログラム俺も書いたことないけど
2.006にしてみたらinvariant string関係の変更がtonほど出てきた
invariantのおかげでWin32API使うとき今まで以上にキャスト式書く機会が増えた。それ以外で特に気になるところはなし。 今は2.006でphobosが強化されたという話を聞いてわくわくしてるところ。
invariant stringとstd.stringの変更を解決してたら、設計の理由がなるほどと…… 無駄なコピーを抑えたいという発想をどう実現するかがなんか分かってきた。 variant世界とinvariant世界が分かれてる感じで、 両者の窓口がcast(invariant)やidup、dupといった風情。 in char[]を受け取ってchar[]を返す関数の内部でstd.string関数を使う場合、 入り口でcast invariantして出口でdupすればおk、みたいな。 ただしこの方法だとスレッドセーフには気をつけないとならんので注意かも。
めぐりめぐって invariantがなくなって、Cと同じになったりしてな・・・
散々こねくり回して出た結論がそれならば、それもまたよし。
idupの個人的まとめ ・idupは本当にコピーを生成する ・idupしたコピーはGCに回収される idupされた文字列を参照するようなstring(std.string中の関数の返り値など)をいつまでも受け渡し続けると、 いつまでたっても回収されずに残り続けることになるかもしれない。 巨大な文字列から1行だけ取り出すとかした場合はidupして、 巨大なやつをGCに回収してもらいやすくするのは考えられる。 idupは比較的気軽に使えるかなと思う。 長期的に生存する可能性があるプログラムについては知らね
ArrayBoundsErrorは回復不可能なんですか?
配列の範囲外に対する不正なアクセスだからエラーなんでは? そもそもDは配列のサイズがあらかじめ調べられるので、範囲外に対するアクセスは事前に防げるはず。
ほんとによく設計されたソフトウェアなら、モジュールがAssertErrorなんか投げてきても catchして「このモジュールはバグってんな」って切り離て、 さらにそのモジュールに依存する別のモジュールにも通知したりして、 本当にコアなモジュールが生きてる限りは動きつづける、とか作りこむんだろーな。 apacheとかそんな感じになってるのか。Dじゃないけど。 気楽なDの個人アプリじゃそこまでやらんで、 void main(){ try{ myMain(); }catch(Exception e){ outputErrorMessage("ごめんちゃいバグで強制終了します。以下をコピペして送ってくれるとお互い幸せに。", e); } } とかでいいよね? 後は明らかに発生しそうなException(new File(stdin.readLine())とか)くらいは その場でcatchすんの忘れないように気を付けなきゃ、で。 「catchすんの忘れてねぇか? いいのか?」とコンパイラに言ってもらえればなぁ、とも思うけど、 そうなるとErrorとExceptionの違いが問題になってくる感じ。
もしかして関数呼び出すたびにtry-catch書くのが普通なのか
default: を書き忘れて例外出されたときはかなりビビッた。 何でswitchが例外投げるの!?って。
>>415 俺は!の話だけどさ、基本的に例外投げないな。だから、ほとんどtry構文使わない。
D言語で作られたアプリで参考になるのねーの?
回復可能なもので例外投げるのは速度が・・・
通常の実行ロジック部分のパフォーマンスが重要 例外時に速度重視?
ああ、なるほど。勘違いしてた
>>419 Cで関数呼び出しごとにエラーコードをチェックしてエラーコード返して・・・ってやるよりも
遥かにぐちゃぐちゃなコードが出来上がるだけな気がするのだけど。
それを無くして「正常な実行パス」だけを簡潔に書くための構造化例外やん?
>>423 分かっててもときどき変なことやっちゃうんだよね
特にC++とかJavaでね
try〜catchはmainだけで充分なのかも知れない
>>423 すべての例外はどこかの階層で拾って、プログラムが適切に復旧するようにするのが理想。
別に、一関数ごとにtryで囲む必要はない。
in, body, outをはじめて使ってみたお^^ しかしenum/invariant structのような型で制限してしたほうが書くのは面倒だけど使えるお-_-;
>>426 でもoutとかで「戻り値にnullは絶対返さないよ!」とかassertしてあると使うのもコード読むのも安心するお^^
でも型だけで事足りるならちゃんと型設計してるってことだし偉いお^^
in/out/bodyってコード読むとき邪魔っぽくない?
ちょっとインデントに悩んだことはあった
430 :
デフォルトの名無しさん :2007/10/25(木) 21:23:49
void hoge() in { assert(文); } body { // 処理 } みたいに書いたり・・・? in と out を関数内部に書きたかったりする・・・ void hoge() { in{ assert(文); } out{ assert(文); } } あ、でもこれなら普通の scope 文でいいのか・・・?
中かっこを開業しないでくっつける派の俺としても悩んだけど void func() in{ assert(...); } out{ assert(...) } body{ ... } って感じにして妥協してみてる… この辺もコーディング規則で一応の指標があるといいのだけど…(宗教戦争勃発しそうな気もするけど)
433 :
431 :2007/10/25(木) 23:12:09
>>432 偉いなw
俺なんか
void func() in {
} out {
} body {
}
さえ正直捨てきれない。
自分はオールマンスタイルが気に入ってる
435 :
430 :2007/10/25(木) 23:41:01
自分もオールマンスタイル派なんだけど、公式の書き方は見難いと 感じてしまう。慣れの問題なのかもだけど。
if (test) { ... } else { ... } これってやめたほうがいいのかな
begin rescue ensure end
オライリーのPL/SQL本だかどっかで
void func(){
hoge();
}
こうあるべきだと力説されて妙に同意してしまって以来、
どうしてもfunc()と"{"が同じ行にいられないと落ち着かなくて困る。
>>430 は俺にとっても抗えぬ誘惑だ・・・
太古より語り継がれる伝説の「IDE」がいつか完成して普及すれば、
inとoutは普段は折り畳まれて「contractあるよー」的マークに収まり、
そこにマウスオーバーするとin/outのコードがポップアップで表示され・・・とか実装されるに違いない。
時を待つのじゃ・・・さすれば泣く日は来ぬ・・・
イデ・・・オン・・・
定数を引数とする三角関数のコンパイル時計算をオフにしたいときがあるわけだが、どうしたもんかな ちょいと考えてみる
>440 なにゆえ?
>>436 俺もそのスタイルで書いてるよ。
ifブロックとelseブロックがきれいに分離してるのが気持ちいいよね。
>>441 コンパイル時に決定できるループでsinが山ほどあったときにコンパイルが遅くなっていたんですが、今見たら大丈夫になっていました。
勘違いかもしれませんが、再発して条件が再現できそうならまた報告します。
グロ注意
>>442 IDEでコメントつける場合にずれるのが困りもの
// ほげほげが見付からなかった場合はエラー
else {
put_error_log("hogehoge not found.");
}
>>442 ですよね!
つーかこの書き方どこで覚えたか忘れたんだけど。
あと、コメント書くとき
if (test) { // ほげほげなら
...
}
ってなってるけどこれもやめたほうがいいかなwww
関数書くときは
/// ほげほげする
void func() {
...
}
こうなるからびみょうに統一されてなくね??とか思ってしまう
キミの好きにしたらええ
そこらへんのコーディング規則とか字下げスタイルなんかをk.inabaタンに定義してほしいw
450 :
442 :2007/10/26(金) 23:42:52
ifのコメントは //ほげほげ if (test) { ... } //はげはげ else if(test2){ ... } //その他 else{ ... } ってしてる。 関数は ///ほげほげする void func() { ... }
コメントは書かない
ソースがドキュメント
俺は、関数の説明は書くけど、if文にはコメントつけないな。 大抵は条件式見れば何してるか分かるし、 ぱっとみて何を比較してるかわからないほど複雑になったら関数化する。 仕事なら仕方ないから規則通りにどんな馬鹿らしいコメントでも書くけど。
極力コメントつけない方向で行ってみようと思う
456 :
デフォルトの名無しさん :2007/10/27(土) 00:28:41
D2.006 フィールドのプロパティ.offsetofが class Foo { int x; } ... void test(Foo foo) { size_t o; o = Foo.x.offsetof; //error o = foo.x.offsetof; //ok } になってるけど、これって仕様が変わったの?
458 :
デフォルトの名無しさん :2007/10/27(土) 00:33:26
いつものことだが誰か報告したのか?
最近D言語ってのを知ったんだが 今のとこ、これ!っていうIDEはないのかな? Poseidon?C::B?Descent?
伝説のIDEはDが完成されたときに現れます
今度からその台詞使おう・・・
Dの言語仕様は永遠にβ版です!
ウォルタンが開発やめるまでは永遠に進化し続けるよ! んでウォルタンが開発やめた後D言語の亜系が乱立することに… そして時代はbsDとreDhat系の戦いへ…
465 :
デフォルトの名無しさん :2007/10/27(土) 02:40:12
D2.006 でコンパイルして
http://cmeerw.org/prog/owtools/ ↑のwlinkでリンクすると以下のコードが
Error: Access Violation
で止まっちゃうんだけど、どして?
void main()
{
for(int i=0 ; i<5000 ; i++)
{
int[] x = new int[100];
}
}
ちなみに、変数 x を毎回deleteしてやるといける。
ソースファイルごとにDのバージョンの印つけといて、そのバージョンから任意のバージョンへの変換を行うものってあったらよさそうだな! バージョンの印付いてるの前提だけど!
467 :
176 :2007/10/27(土) 10:10:33
>>459 バグジラで検索したら2007年1月だったか2月に既にあがってたバグでした。
もう直す気無いと思われるw
>>467 そこのバグの修正は半年から一年後に
行われることがざらだそうです
>>461 IDEが発動するとき第6言語(D)は滅びるということか
C++0xスレでperlのQuantum::Superpositionsみたいなのの実装を見つけて Dでも作ってみようかと思ったんだが、!= と == の区別ができない…
472 :
465 :2007/10/28(日) 00:30:36
>>469 まじすか?
その時は、だいたいどんな結論に落ちついたんすか?
や、Viewerないもんで。。。ごめんねーいろんな人。
>>471 テラ量子力学wwwwwwwww
と思ったらマジでそういうライブラリなのか・・・
量子コンピュータの広がりの影響なのかな・・・
バージョンうpまだー?
Eclipse3.2.1ダウソしてDescentパッケ入れても全然反映されねーや… なんでだろ
476 :
デフォルトの名無しさん :2007/10/29(月) 21:49:53
dsssを使ってflectionedをインストールしてimportしたら、 コンパイルエラーが発生して、以下のようなメッセージが出力されました。 flectioned.d(104): module Vararg cannot read file 'tango\core\Vararg.d' 環境は、Windows / Cygwin / dmd.exe 1.022 + phobos で、 tangoはインストールしてないのに、 tango以下のファイルをimportしようとしてるみたいです。 static ifがtrueでもfalseでも両方のブロックの文法解析が行われてるのかな? とりあえず、flectioned.dの104〜131行と247行を コメントアウトしたらコンパイルできました。 あんまりうまい解決方法だと思えないので、 何か他にいい方法がないでしょうか?
Cygwin は使ってないけど、Windows + dmd1.022 + phobos で普通に動いてるけどねぇ。 Cygwin か dsss が何か悪さしてんじゃない?
478 :
デフォルトの名無しさん :2007/10/29(月) 22:30:45
>>477 あ。たぶんdsssのような気がしてきました。
おそらくdsssは、
import文を見てコンパイルするファイルを特定していってるんだけど、
そのときにstatic ifをうまく解析できてないのかもしれません。
[わなD]に
「DSSSは、static ifで条件importしている依存関係の解析が
甘くて時々不便だったりするので…」
という記述があったので、これのことなのかも。
Derelict は dmd 2.0 だとビルドできないのか?
480 :
デフォルトの名無しさん :2007/10/29(月) 22:52:37
k.inabaさんがdsssはstatic if内でのimportの解析が甘い的なこと書いてた気がする わなDかな
482 :
デフォルトの名無しさん :2007/10/30(火) 00:45:01
おお わなD更新されてるじゃまいか どっかで更新されたかどうか告知あったりしないのかな RSS配信とか
484 :
デフォルトの名無しさん :2007/10/30(火) 02:19:27
class Foo{} class Bar { private const( Foo ) mFoo; const( Foo ) getFoo() { return mFoo; } void setFoo( const( Foo ) iFoo ) { mFoo = iFoo; } } みたいなことをD言語2.xでしたいのですが、 Bar.setFoo()の中でコンパイルエラーが発生してしまいます。 たぶんメンバ変数Bar.mFooの定義方法がよくないと思うのですが、 どうするとよいでしょうか?
どうするんだろ うまくいかないや こんなんになりました class Foo{} class Bar { private const(Foo)* mFoo; const(Foo) getFoo() { return *mFoo; } void setFoo(const(Foo) iFoo) { mFoo = &iFoo; } } void main() { auto bar = new Bar; bar.setFoo(new Foo); const(Foo) foo = bar.getFoo(); }
const Foo mFoo; なら変数mFoo自体がconstだけど、 const(Foo) mFoo; なら変数mFoo自体は書き換え可能なはずだよね。 メンバ変数のときだけ動作が違う、ってんだからバグじゃね?
俺もバグなんじゃないかと思う。 とりあえずaliasでごまかしてみるとうまくいくようです。 class Foo{} class Bar { alias const( Foo ) Foo_const; private Foo_const mFoo; Foo_const getFoo() { return mFoo; } void setFoo( Foo_const iFoo ) { mFoo = iFoo; } } // 意味のないエイリアス // この手のものは…どうなんですか、ウォルターたん…
aliasした場合、今度はconst消えちゃってね?
>>482 > 2007/10/30 :: RSSはじめました
ました
助かります
わなDの"../表紙に戻る"って戻れないよね
>>488 ほんとだ。constがきえてるっぽい。これもバグなのかな。
まぁconst/invariant周りのバグは多すぎて報告する気にもならんけど。
v1からv2に乗り換えたら連想配列でキー引けないんだけど、なんか変わった?
>>494 エスパーしてみると、文字列リテラルの型がinvariant(char)[]になった。
int[char[]] foo = [ "hoge" : 1, "hage" : 2 ]; if(auto p = ("hoge" in foo)) writefln(*p); else writefln("ねーよ"); try { writefln(foo["hage"]); } catch(ArrayBoundsError) { writefln("ねーよ"); } v2でどー書くの?
// dmd 2.006 void main(){ int[string] foo = [ "hoge" : 1, "hage" : 2 ]; foreach(k; foo.keys) writeln(k, foo[k]); // Error: ArrayBoundsError } おそらくバグだな
void main(){ int[string] foo; foo["hoge"] = 1; foo["hage"] = 2; foreach(k; foo.keys) writeln(k, foo[k]); } こうすればいけるな。
499 :
デフォルトの名無しさん :2007/10/30(火) 21:23:48
分かっちゃいるけど直ってない、という話なのね
D2不安すぎる
D2.0で作成したソフトウェア納品してしまった件wwww ソースじゃなく、バイナリだけだけど
>>502 おぉおおぉおおそろしいことを…!
でもよくやった!
Makefileで依存関係しらべてビルドするより、
dmd.exeでどかっとコンパイルしたほうが速いんだね・・
>>502 ちょwww
>>501 Doctor2年でつか
>>502 どこの会社だよそれwwwww
せめて1.0にしろよwwwww
後で致命的なバグ見つかってもしらねーぞwwww
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::。::::::...... ... --─- :::::::::::::::::::: ..::::: . ..:::::::: :::::::::::::::::...... ....:::::::゜::::::::::.. (___ )(___ ) ::::。::::::::::::::::: ゜.:::::::::::: :. .:::::。:::........ . .::::::::::::::::: _ i/ = =ヽi :::::::::::::。::::::::::: . . . ..:::: :::: :::::::::.....:☆彡:::: //[|| 」 ||] ::::::::::゜:::::::::: ...:: ::::: :::::::::::::::::: . . . ..: :::: / ヘ | | ____,ヽ | | :::::::::::.... .... .. .:::::::::::::: ::::::...゜ . .::::::::: /ヽ ノ ヽ__/ ....... . .::::::::::::........ ..:::: :.... .... .. . く / _三502三∠⌒>:.... .... .. .:.... .... .. :.... .... ..:.... .... ..... .... .. .:.... .... .. ..... .... .. ..... ............. .. . ........ ...... :.... . ∧∧ ∧∧ ∧∧ ∧∧ .... .... .. .:.... .... ..... .... .. . ... ..:( )ゝ ( )ゝ( )ゝ( )ゝ無茶しやがって… .......... .... i⌒ / i⌒ / i⌒ / i⌒ / .. ..... ................... .. . ... .. 三 | 三 | 三 | 三 | ... ............. ........... . ..... ... ∪ ∪ ∪ ∪ ∪ ∪ ∪ ∪ ............. ............. .. ........ ... 三三 三三 三三 三三 三三 三三 三三 三三
508 :
502 :2007/10/31(水) 17:40:02
反応が結構あったのにびびったw リアルタイム映像系で、DとDirectX10と絡めた。 やっぱりネックはGCだけど、評判が悪いがscopeとかつかうとわりと回避できるよ。 それでもメモリ使用のグラフををみると /|/|/|/|/| こんな感じでノコギリみたいになる。 そこ以外はサクサク開発できた。 まぁなんだ、D言語最高
D2とVistaって・・・ どんだけばk・・・いや、いい意味でなw乙w
>>508 確かに集合型とか一時オブジェクトを扱うとC++よりDが圧倒的に楽なんだよなあ。
DX10を絡めたのは尊敬する。俺はやろうとして挫折してます。
>>502 ノウハウうpしてくれると俺が鼻水100ccほど垂らしながらよろこびます
俺も0xD2ccくらい垂らしながらよろこびます
>>508 本当に勇者だなお前は
お前みたいな勇者のおかげで俺たち一般PGが最新技術に触れる日が早まる
DirectX 捨てて OpenGL にいった自分も少しよろこびます。
映像系で思い出したが、dSFMTをクラス化してインスタンスごとに独立した系列がいけるようにチョコチョコいじってるのだが、 SIMD部分をどうするかでかなり悩む
finallyよりもscope(exit)のがつかいやすい
しかしふとだいぶ前ーのスレで 「C++よりいい感じだぜー」って研究室でデータ計算だかに 使ってるって言う人も見たなぁ、という記憶が。 まぁ「納品」という言葉が出てくると俺ビビらずにはいられんけどw ところで興味本位でメインマシンを64bitなubuntuにしてみたら いろんな32bitライブラリがネーヨとリンカに言われ俺涙目。 dmdもamd64吐けるようにぷっりーずぅぅぅー。
>>519 sudo apt-get install lib32gcc1
してリンカフラグ弄ればいいとおも
521 :
502 :2007/11/01(木) 07:05:47
DirectX10ヘッダーファイルをDにポーティングしていれば、一番みんなが使いやすいんだろうと思うんだけど C++でまずDirectX10をラップしてそれをDで使用するようにしました。 DirectX10.1とかでるし、dxgi.h、d3d10.h、d3dx10.hがころころ変わると思ったので。 以下スレチにならない程度にさわりを・・・ /* C++ */ class Device { public: _cptr<ID3D10Device> _cp; // _cpt<T>rはCOMをあつかうスマートポインタ }; class Swapchain { public: uint32 _width, _height; _cptr<IDXGISwapChain> _cp; int init( Device &dev, const DXGI_SWAP_CHAIN_DESC &ds); }; class Buffer { public: _cptr<ID3D10Buffer> _cp; }; とこんな風にまんま包み込んで、 Dに以下の様な関数をエキスポート Device * dx10g0_Device_new(); void dx10_Device_delete(Device *pthis); int dx10_Device_init(Device *pthis, void *pdevicesettings); int dx10_Device_DrawPrimitive(Device *pthis, uint type, uint n); int dx10_Device_DrawIndexedPrimitive(Device *pthis, uint type, uint indexcount); 中の関数はDirectX10APIより少々便利めにつくるようにしてます。 こうすることのメリットは、上でいったヘッダーファイルがかわっても(少しは)大丈夫なこと、 DirectX9に同様のものをつくることで、D側からはDirectX10、DirectX9が同じように扱えること。 Shader4.0をつかってしまったら、意味がないかもだけど・・・
>>520 情報有難う御座いまするー。
そうかー32bit系はそういうパッケージ名を与えられているのですね。
lib32gcc1は入ってました。中身の.soから、Winでいうインポートライブラリが生成できればいいんでしょか。
ともあれこれ以上は自力でごにょごにょとやってみます。
>>521 なるほど。
俺は、汚いヘッダファイルからではなく、比較的綺麗なIDLからDにポーティングしようとして挫折。
.diを吐くIDLコンパイラ欲しい、、、
「無いならば 作ってしまおう プログラマ」 詠み人知らず
>>521 ありがとうございます。参考になります。
まあDから読みやすいようにするのがいい解ということですかねえ。
win32のBitBltがどこにあるかわかりませんか?v1.015@Phobosです。 リンカのLibにはあるっぽいんですけど、 export BOOL BitBlt(HDC,int,int,int,int,HDC,int,int,DWORD); しても認識しません。。。
extern(Windows)
すいません!出来ました。しょーもない質問で申し訳ない。 ありがと〜。
win32.windows 使わないの?
なるべく標準で済ませたかったんです。 はやく標準でとりこんでくれないかなぁ。。。
意味無いけどあるある
チラ裏! 今丁度はまってた事。 クラスを宣言してC++と同じ要領で使おうとしたら、宣言自体は参照のためにアクセス違反の例外が飛んだ。ってか飛びまくった。 つまり、newしてなかった。あ〜、何事かとおもったわ。(TT
構造体・クラスをみわけるために なんかプレフィックスつけてる?
いや、そういう習慣は持ってないね。 それがさ、うっかりスタックに確保されるもんだと勘違いしてたんだ。 C++だと基本的に自分でメモリ確保しないようにやってたから。。。
//C++ Class hoge; //D scope hoge = new Class;
536 :
533 :2007/11/02(金) 08:26:58
いや、べつに532にきいたわけじゃないんだ。 みんなはどうしてるかなと思って。 俺は構造体にはSをつけて、クラスにはなんもなし。
ああ、結局newしないといけないんだなぁ。 なるほど、なるほど。 new恐怖症なもんでね。 だから、GC万歳ってかんじなんだけどね。
乳は決して怖くない。勇気を持ってください。
539 :
532 :2007/11/02(金) 08:41:34
>>536 俺は特にプレフィックスはつけない。何にでも。
でも、命名規則は割りと変数の使用イメージにそってつけてるかなぁ。
まぁ、しばらくすると、わすれちゃうんだけどね。。。XP
>>538 勇者はD言語を手に入れた。LvUP!!new恐怖症が多少和らいだ。deleteを忘れた。
徹夜しちゃったからそろそろ寝るかなぁ。
今作ってるの、もうちょっとで完成するんだけどねぇ。あえて寝る!
そんじゃまた〜。
そういえば`「わすれる」を覚える`って不思議な響きだよな・・・
(a, b) = (c, d);みたいなのが a = c; b = d; に変換されるようなやつってD言語にある?
関数からタプル返せるようになるのまだー?
それよりもタプルリテラル欲しい。
質問です。 v1.015なんですけど、以下のコードが変なエラー吐いて止まっちゃうんです。 Error: non-constant expression new stack_t(true) これって、グローバル変数に直にnewすることってできないんですか? private import Stack;//自作のstack_t(T)。引数はboolのみ。 struct dummy{ int x,y; } alias stack_t!(dummy) stack; auto st =new stack; int main(char[][]){ static dummy d={10,20}; st.push(d); return 0; }
そういう場合は static this() を使う。 private import Stack;//自作のstack_t(T)。引数はboolのみ。 struct dummy{ int x,y; } alias stack_t!(dummy) stack; stack st; static this(){ st=new stack } int main(char[][]){ static dummy d={10,20}; st.push(d); return 0; }
あぁ、なるほど。 わかりました〜。レスありがとう。
static thisってクラス外でも使えたのか……知ってればもっときれいに書けたのあったなあ…… クラス内enumの仕様が悩ましい。 class Foo { enum FooEnum {} } enum GlobalEnum {} class BarA(T : FooEnum){} // NG class BarB(T : GlobalEnum){} // OK class BarC { // OK FooEnum t; } BarAが宣言したいのだがなんとしたものか。
>>548 class BarA(T : Foo.FooEnum){}
Foo.FooEnum t;
digitalmars.com 繋がる?
>>549-550 すんません間違えました……でも両方とも
class Foo is forward referenced when looking for 'FooEnum'
でコンパイルエラーとなるという。
シンボルの意味が定義される順番が
A群
Foo, GlobalEnum, BarX(とテンプレート引数)
↓
B群
Fooの内部、BarCの内部……
というふうになっているからかな、とは思うのですが。
>>552 そこら辺、実装が微妙だよな。
内部関数も前方参照できないと使えないし。
What's New for D 2.007 Oct 31, 2007 New/Changed Features * Functors now supported by std.traits.ReturnType(). * Transitive const now leaves invariants intact in the tail. * Added overloadable unary * operation as opStar(). * Full closure support added. * Data items in static data segment >= 16 bytes in size are now paragraph aligned.
貼ってから気づいたけれどフルクロージャーサポートかっ!
2行目の意味誰かkwsk!
opStar・・・・・・これでboost::spiritが移植可能かも! いやあんまり要らん気がするが
writefに("日本語")としたらinvalid UTF-8 sequenceとでてコンパイルできないんですが どうしたらコンパイルできるんでしょうか。
ソース自体をUTF-8かUTF-16で保存してください。
561 :
559 :2007/11/03(土) 10:23:38
>>560 UTF-16は選べなかったので、UTF-8で保存したらできました。ありがとうございます。
ただUTF-8なので??となりました。
今更だがSharpDevelopいいな
>>561 今のところ、Windows上で出力内容を化けさせずに見たい場合は
1、テキストファイルに出力して確認
2、printfでUTF-16を使う
のどちらかじゃないですかね。コンソールでCHCP 65001とかやる手もありますが、
これだとなんか表示がおかしくなる上にコンソールのサイズが強制的に変更されるので使いづらいです。
2の方法の場合、下のようにするとうまくいきます。
//↓こんな感じ
import std.c.locale;
void main() {
setlocale(0,"jp.932");
printf("%.*ls\n","日本語"w);
}
ただこれ日本語版のWindows環境以外について全く考慮してないプログラムになるんで、
もう一工夫した方が良いと思います。単なるテストプログラムと割り切ってるなら
そんなん考えないでも良いと思いますけど。
Internal error: ../ztc/cgcod.c 1031
* Full closure support added. とうとうきたのか!?
ヘルプのtemplateのサンプルの Curry をこんな感じで書き換えたらアブノーマルエラーで落ちるんだけれど、これ何処か間違ってます? windows2kでdmd 2.007なのだけれど・・・ R delegate(U) Curry(R, A, U...)(R delegate(A, U) dg, A arg) { return (U u) { return dg(arg, u); }; }
>>565 D\(^o^)/ハジマタ
import std.stdio;
uint delegate() counter() {
uint i = 0;
return {return ++i;};
}
void main() {
auto c = counter();
writeln(c()); // 1
writeln(c()); // 2
writeln(c()); // 3
}
>>566 構文的には間違ってないと思うから、
まだバグ餅と考えたほうがいいかもね。
これのGCってstop the world? それともなにがしかのコンカレントGC?
おークロージャキタ━(゚∀゚)━!!
これはハジマッテルなwwwwwwww やべえwwww
クロージャってどういうときつかうの? ネストした関数なら使うことあるけど。
いよいよ2.0に挑戦するときが来たか……。 といいつつもクロージャがサポートされるとなにが嬉しいのかよくわからない俺。
ごめん被ったw
wktk
DってなんかSchemeっぽくね?
>>577 pure関数の導入も予定してるし、関数型的に行く気まんまんという感じ。
クローじゃきたのかー D2はじまったな
クロージャの実装ご苦労じゃ。
1.0 に組み込む気は無いのかなぁ。 発展途上というかバグだらけなうえに仕様が迷走してるだけに 2.0はまだ使う気にならんのだよな。
>548の問題が、自分の用途に関して一時的解決策ができた。 enum FooEnum {} class Foo { alias .FooEnum FooEnum; } class BarA(T : FooEnum){} // NG これで目的は果たせるけど、きっちりしておきたいところではある。
1.0にくみこまれたら組み込まれたらで 仕様が迷走してるっていうんじゃね?
1.0はもう変わっちゃだめだろ
>>578 pure関数入れるとどうなるんだろう
>>581 ちょっと待てw
0.xのときは早く安定させてって言われてたから1.x系作って安定させたんだろうに
ちゃんと進んでるぜよ
1.x系は無難な過去の寄せ集め。 2.x系は未来への布石。 俺ってかっこいい!?
むしろ世紀末への布石
え?おわっちゃうの!?
Dが完成するときは、世界の終わりの日だということか。
じゃあ・・・配列演算と並列処理まだー?
pure関数が実装されると、コンパイル時に自動的に実行とかやってくれるのかな? それか、結果のキャッシュかな。 とりあえずたらい回しが速くなる?
あえてスルーしてたのに、、、
すでにコンパイル時関数実行ってあるよね
sin,cosがそうなってると、このスレだったかで見たような記憶がある。
sin,cosは組み込み関数でコンパイラがコンパイル時に定数に置換するだけ。 CTFEの一種であることに変わりはないが。
D言語SUGEEEEEEE
むきー!! modfをfmodの代わりだと思って使ってた間抜けがきましたよ。っと。 なんて紛らわしいんだ。
(^Д^)m9
これはきっと「カマーン」って言ってるんだな
左側だろ
腕の力こぶを見せ付けてるんだろう ぶよぶよ贅肉にも見えるが
小指立ててるだけだろ。
循環import(AがBをimport、BがAをimport)って許されてない? 普通にコンパイルするときは問題ないんだけど、 コードカバレッジ解析(-cov)を有効にするとエラー出る。 Error: circular initialization dependency with module A
-covつけると静的構築されるの?
612 :
566 :2007/11/03(土) 22:54:28
静的構築が行われていないモジュール同士なんだけどなぁ〜 問題なく実行はできるし・・・
おそらく、カバレッジ解析用のコードが追加されてエラーになるんだろうな。 バグだろバグ
>>614 そう思う。バグだよねぇ〜。
それならそれでいいんだ・・・
D言語の思想に合ってないコーディングをしているのかと少々疑ってしまった。
-cov つけるとコンパイラがそれぞれのモジュール内に静的コンストラクタを挿入するって事?
かぶった、すまぬ
もし
>>616 ならそうそう解決されないんじゃね?
それに元々循環importは推奨されてないんじゃなかったっけ?
どっかで見た気がしてて
>>610 見るまで循環importやったらダメだと思ってたけど・・・
記憶違いならスマソ
どっちにしても循環しないようにしたらいいとおもた
>>615 610,613→609,613 間違えた。すまぬ。
>>618 >どっちにしても循環しないようにしたらいいとおもた
えぇ。循環したいよぉー
循環するほど密接してるんならもしかしたら一つのファイルにまとめるべきなのかもねえ
621 :
609 :2007/11/03(土) 23:40:38
>>618 モジュールコンストラクタがある場合に循環依存できないって制約は、
初期化順序を一意に定めるためのものであって、
循環依存自体に何か問題があるわけじゃないと思う。
コンパイラが挿入するカバレッジ解析コードに
モジュールごとの初期化順序が何らかの影響を及ぼすとは考えづらいから、
やはりバグだと思う。
class Hoge { int opProperty(string key, int val) { return 0; } } auto hoge = new Hoge; hoge.test = 22; // どうにかして => hoge.opProperty(test, 22); こんなキモいことできないかなー
妄想乙
>>623 それってさ、opPropertyの中で、keyとvalに応じて分岐とかするの?
それなら普通にメンバ関数の方がいいでしょ。
単にメンバ変数に値を設定するだけならテンプレートで増殖させるとかできるし。
>>623 opIndex(string key, int val)ってしてhoge["test"]=22で良くね?
ミスった。opIndexAssignね。
ーにかした ソースの外見をきにしてしまったアホだった/(^o^)\
雪駄下駄を書くのが面倒くさいだけなら、わな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; } } で十分。 でも、普通に書いた方がいいと思うぞ。
ドキュメント生成用のコメントつけられなくなるしなー。
きもさを追求するなら、opAutoload導入して欲しい。
ゲッタとか雪駄とかって他のC系列では自分で生成できないからすげーあこがれてたんだぞ。 それをこんなむげに扱いよって。ぷんぷん。 え?ビーム??でないよそんなの。
ですよねー
プロパティの += とか -= とかなんで許可してないんかね。 array.length += 2; ってやったら array.length = array.length + 2; って変換してくれりゃ良いだけなのに。 演算子オーバーロードとの競合を防ぐため?
将来的にはできるようになる予定とかどっか書いてなかったっけ。
D言語は糞だから期待しちゃだめ
ruby式だー
をるたんももしかしたら 各自array.length = array.length + 2;ってかけばいいのに とかおもってたりは・・・ないか
をるたんも実はarray.length += 2;って書けたらいいなあ、とか思ってる。
でも現実的に割に合わない面倒なことだなあ、とも思ってる
そんなしょうもないもの実装してる暇があったらマクロ実装してやんよ! と思ってるに違いない。
ほんとだな?
くろーじゃー!
でも対称性の点から見てもあってもいい機能だよな常識的に考えててててて
D2 の構造体/クラスの配列で sort しても opCmp 呼ばれなくなってね?
どうも吐くアセンブラがバギーな感じ
D2おもしろんだけど、コンパイラがバグだらけで使い物にならんな…
>>648 delegateまわりがとくに
closure関係だろうな
void main(){ A!(int) a; a.f(); } struct A(T){ T t; A!(A!(int)) f(){ A!(A!(int)) a; return a; } } これってやっちゃいけないことなのかな。 エラーになる。 Aをコンテナとして、リストのリストと言う具合に、 入れ子にするのは良くあることだと思うのだけど。
>>652 A!(A!(int)) をtypedefしたりなんやらしてたらDMDが無限ループに入っちまった。
怖い怖い
>>652 普通に無限ループしないか?
テンプレートをインスタンス化すると、その内部のテンプレートがインスタンス化され、
さらにその内部のテンプレートがインスタンス化され、、、
>>647 2.003と2.007の動作は同じよう。変化なかったよ。
1.023と2.007の動作はぜんぜん違った・・・
要素3つの配列をソートするだけの処理で・・・
1.023は、配列初期化時にopCmpを20回、ソート時に3回呼び出してる。
2.007は、配列初期化時にopCmpを3回、ソート時には呼び出しなし。
2.007は降順で1.023は昇順という大きな違いが←既知事象?
gdcって1.020までしかないの? だめじゃん
あった・・・ なんで最新のやつをでかでかと表示したりしないんだろ
>>654 最終的にはintで止まるはずだから、無限ループはしなさそうだけど
C++でやってみたら大丈夫だったし
え、Dって末尾再帰最適化してんの
なぜ突然「末尾再帰最適化」? 関係ないだろ
そういえばDって無限リスト書けんのかな
それっぽいものなら何とでもかけると思うが。
クロージャが来た記念ってことで、遅延リストを作って遊んでた俺。 でも、lines :: [char] -> [[char]]が書けなくてショボーン。 getContentsとか、zipWith使ってフィボナッチとかはできたお。
>>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^)/
くそー2.007おもしろそうなんだが、前のプログラムが動かん・・・
今まで追い続けたんだけど、今回は2.006にもどすよ。。。
>>663 面白そうな雰囲気
まったくわからんおいらに説明おねがいします
>>664 よく見ようよ。
A!(A!(T))だと確かにとまらないけど、上のコードはA!(A!(int))。
どう見ても有限の展開しかしない。
単に動かないのはdmdのバグでしょ。
class List(T) { static List!(List!(T)) listOfList() { return null; } } alias List!(int) t;
>>666 なるほど、A!(A!(int)).fの戻り値型はA!(A!(int))そのものになるのね。
単純にA!(A!(int))を展開しようとしたらまたA!(A!(int))が展開されて・・・という話ではないの?
同じテンプレート引数では一回しか実体化されないはず。
あーそうだった 俺ショボスwww
実装しだいでは、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; }
久々にスレの勢いを見てみたら、 この板ではC/C++, Javaについで3番手だということに気づいた。 PerlやJavaScriptやPHPはここではない場所でやってそうだが、 それでもずいぶん上に来たものだ。
674 :
663 :2007/11/05(月) 18:24:56
>>673 ウォルたんから新ネタがどんどん届くからな
間違いなく勢いはある
クロージャが入ってからの勢いがものすごいだけで、普段はそんなにすごくないんじゃないかな。
C++インターフェースのときもすごかったよね。
>>773 をををっありがとうございます
拝見します
replace( D言語Part15[677], `
>>773 `, `
>>674 `);
//ごめんなさい
ぬるぽ
俺はマクロくるまで冬眠
そう言って冬眠したのはもう三人くらいいるようなw
俺の理解度は置いといて!他の人のコード読むと楽しいな!! なんかね、久しぶりに心から「へぇ〜」っていっちゃった。 やっぱ、ネットはこうでないと。 そうそう、俺タートルとかやってた奴ね。
683 :
682 :2007/11/05(月) 21:13:27
混乱避けるつもりが紛らわしく。。。
俺->
>>682 だけね。
>>682 はもうちょっと落ち着いてもいいと思う
やけに楽しそうだw
getenv("CONTENT-LENGTH").toInt() とかはちょっとニヤリとしてしまう
俺は予想外にもクロージャ来たから冬眠からさめちまった
CGIっつーかAjaxっつーかweb開発用のフレームワークってありますか?
なんか、あったような気もするけど、古いかもなあ。
自己を動的に派生クラスに書き換えるモデルを考えて、 以下のようなコードを組んでみたのですが、失敗しました。 そもそも自己を動的に派生クラスに書き直せるのかちょっと疑問になったのですが、 こういうことは可能なのでしょうか。 class Hoge { this() {} void rewrite() { this = new Huga; } } class Huga : Hoge {} void main(){ auto a = new Hoge; a.rewrite; writefln(a); // -> Hoge }
>>687 sakuraiさんがずっと前に作ってなかったっけ
>>689 変数aのアドレスなり参照なりがわからないと無理でしょ。
メモリのインスタンスが存在する部分を書き換えるわけにはいかないから、
変数aが指しているものを書き換えるしかない。
仮想メソッドを直接書きかえ・・・いやなんでもないです
できてしまった 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); }
コメント書くところ間違えた あとインデント見やすく 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 }
this ってメソッド呼ばれる時にインスタンスのポインタを値渡しされたただの隠しパラメータだからな。 だから、this をいくら書き換えても呼び出し元の変数(ポインタの値)は変わらないまま。 this が元から lvalue にならなきゃ混乱しないのに。
>>692 求めているものは仮想メソッドの動的書き換えで、
かつオーバーロードできればいいなあという感じ(なのでデリゲート不可)で、
それが理想なんですが、さてどうしたものかと。
>>691 >695
なるほど。。少し分かってきました。
この辺を突破できるトリックをぼちぼち探してみます。
>>694 ひとまずこれベースで行ってみます。
ありがとうございました。
っステートパターン って言ってみる
D言語を使うからにはもっとトリッキーな手法をとるべきではなかろうか。
700 :
デフォルトの名無しさん :2007/11/06(火) 01:57:34
D言語は糞
なんか8スレ目ぶりくらいにアンチを見た。
dupと[]って書き方以外になんか違うところあるの?
>>703 dupは複製される。[]はされない。
int[] x = [1,2,3];
int[] y = x[];
y[0]=999;
writefln(x); // 999 2 3 (y=x.dupなら1 2 3)
クロージャがくると、coroutineがもうすぐできる という夢をみた
>>703 []は配列全体のスライス。
dupはミュータブルな複製。
したがって、型が違う場合がある。
static assert(is(typeof("foo") == invariant(char)[3]));
static assert(is(typeof("foo"[]) == invariant(char)[]));
static assert(is(typeof("foo".dup) == char[]));
ここまで試してみた結果のまとめ ・自己インスタンス書き換え 外部の自身を指すポインタのアドレスを渡す必要がある=複数あった場合は厄介 newでコンストラクタを呼び出すと厄介 ・delegateスイッチング+可変データアダプタ オーバーロードできない プロパティ風呼び出しができない ・Has-a オーバーヘッドはあるが、無視できることが多いかも ExchangerとInterfaceで2回定義を書くのがやや冗長 ・分岐 オーバーヘッドが大きい ・Factory 動的な変更が内部的には行えない 自身を指すポインタが複数あると厄介 自分の目的だとHas-aかデリゲートスイッチングの2択になりそうですが、 もう少し煮詰めてみて面白そうなら報告いたします。
アップローダのアップ形式は自分ではいじれないっぽい〜。
レンタルなんですけど、ちょっと不便だなぁ。
>>684 お察しのとおり、たのしくて!
えぇーっと、多少自重します〜。
d monooki とかいうDのソースコードアップロードできる場所が あったけど、いま使えるっけ?
>>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
}
きんもー☆
強烈過ぎて吹いたw ちょっと使える場面が限定されそうなので、しっかりメモしてそれにとどめておきます しかしgcがありながらこれができてしまうDの変態さには感心する
gcがあるからこそできるんじゃね?
version条件で、#ifndefとか#if !defined()とか#if defined() && defined() #elseに相当することってできましたっけ? なんとなくstatic ifに書き換えてますが、無駄を感じるもので。
どのへんが無駄?
static if以外にはversionとdebugくらいしかないと思う 他にあったっけ?
version(...){...}else{...}はできたような希ガス
#if defined(FOO) && !defined(BAR) ... #else ... #endif これが書きづらい。 static ifは定義済みでないと扱えないので、これをすっきり表現するには、 versionで定義されてるかどうかを真偽値とする定数を作って、……とやってるんだが、 このへんがどうにかならんもんかなあと。
#define FOO に変わるものがなあああいい
コマンドラインで指定するのをあきらめて、const使う案しか思い浮かばない const FOO = true; static if(FOO){ const HOGE = true; } else{ const HOGE = false; }
>>548 について本家で聞いてみたら、
「バグだとは認識されてるけど、『直す手間の割に実がない』とウォルターが言ってた」
とのこと。
まあ回避できるし特にいいかなと。
>>718 mixin宣言で「hoge1&&!hoge2ならversion=hoge3」とかやろうとしてみたけど
mixin宣言で生成したversion文より先に素のversion文が解決されてしまうっぽくて、
mixin("version = hoge3;");
version(hoge3){
int x = 5;
}
と書いても
version hoge3 defined after use
と言われてしまう。
mixinがversionの評価の前に通れば、もうちょっとましにはなりそう。
(そうなるよりは、version文が進化する方がありえそうな話だけど)
version(foo)version(bar){ // foo && bar
}else{ // foo && !bar
}else version(bar){ // !foo && bar
}else{ // !foo && !bar
}
これは書きづらい上に読みづらいな。
現状では、718の言う通りversion+static ifというのが一番マシなやりかただろね。
>>722 乙っす
なるほど
>『直す手間の割に実がない』
これがすべてだなw
しかしそんなんじゃいつまで経っても普及しない希ガス
そもそもウォルターには普及させる気がない気がしてる…
でもさりげなく次の更新に修正されてるという・・・
>>727 それはウォルターには普及させる気がないっていう不具合ですか
それは仕様です
ウォルタンのバグはいつ直るの?
>>494 void rebuild(E,T)(ref T[E] array) {
T[E] result;
foreach(i, k; array.keys)
result[k] = array.values[i];
array = result;
}
テレビと同じで叩けば動くらしい。
をるたんはをるたんの唯一の実装にして仕様そのものなので、直すべきバグは存在しません。
flectioned の v2.007 対応のってない?
private 定義したクラスってどういう意味になるの?普通にC++でいうstaticかと思ったら違うみたいだし。 逆にC++でいうstatic(ファイル内スコープ)なクラスはどうやったらできる? ---- b.d ---- module b; private class B {} private void hoge() {} ---- a.d ---- module a; import b; void main() { B b = new B; // OK hoge(); // Error: function b.hoge is not accessible from a }
仕様によればモジュールスコープのprivateは、 Cのstaticと同じ意味になるはず。 B b = new B; もエラーにならないといけないはず。
てことはバグかぁ。 サンクス。 まぁ、それほど困らないバグだしほっとくか・・・
737 :
デフォルトの名無しさん :2007/11/07(水) 22:32:53
>>733 flectionedをD2.007でコンパイルを通して使ってみたけど、
ちゃんと動いてないっぽい。
main関数直下でArrayBoundsError例外を発生させたら、
スタック表示はされたけど、関数名がでない。
(std.array.ArrayBoundsError) ArrayBoundsError main(80)
0x0012FD34 0x004046B3 <?>
0x0012FD4C 0x00404651 <?>
0x0012FDC4 0x004236E2 <?>
0x0012FF30 0x004023BC int main(char[][])
自前のクラスのメンバ関数でArrayBoundsError例外を発生させたら、
main関数が表示されてないし。
(std.asserterror.AssertError) AssertError Failure dbuffer.d(158)
0x0012FCDC 0x0040341F <?>
0x0012FCF4 0x004033BD <?>
0x00000043 0x0042244E <?>
ていうか、さっき初めて使ったので、なんか使い方を間違ってるのかも。
とりあえず[わなD]を見ながら使ってみたよ。
http://www.kmonos.net/alang/wnd/topics/flectioned.ja.html flectionedがちゃんと使えるようになると便利いいんだけどな。
それにしても[わなD]はいつも助かるぜー。ありがたい。
DDocについて、dittoの挙動が ///Params:x=aaa void func(int x){} ///ditto void func(double x){} ↓ void func (int x); void func (double x); Params: int x aaa ってかんじに、xの型がintってあたりが納得いかないんだが…と地味に思った。 この場合どうしたらいい感じに出力できるのかな? CandyDocとか使うと結構きれいに出てくれて素敵なんだけど…こういう細かいところがなぁ…
740 :
733 :2007/11/08(木) 02:34:43
自分でポートしてみた。
(std.array.ArrayBoundsError) ArrayBoundsError bug(25)
0xBFB35C74 0x08052158 extern(C) void _d_array_bounds(char[], uint)
0xBFB35C88 0x0804B389 void bug.__array
0xBFB35CA0 0x0804B2F6 void bug.foo()
0xBFB35CB8 0x0804B31E int main(char[][])
なんかちがうね?なんでだろ?
>>737 当方 linux
そんあこといわれたら全部
>>722 って言われちゃいます><
size_t l; stream.read(l); array.length = l; これ地味に面倒じゃねwwww array.length = stream.read!(size_t); とかで簡単にかけたら便利そうだなあああああああ
動的配列なのにわざわざ先にサイズ指定しなくてもと思うけど・・・。
動的配列だから先にサイズを読み込むんじゃ…?
別に配列関係ないだろ。
ラムダ式まだー
>>743 をるたんにその便利さを説けば入れてくれるんじゃね?
配列以外にも拡張メソッド構文が採用されれば、できるな。
ブライト艦長としては、既にDの開発に使える人生のリソースを100%使っていて、 どこをイジるかってのは完全にリソースの振り分け、優先順位の問題なのだろうし、 もうしばらくは優先順位の極めて高いwktkなアイディアが常に溢れた状態だろうから、 よっぽどの相対的価値をアピールしない限り、振り向いてはくれないだろうね。
752 :
デフォルトの名無しさん :2007/11/08(木) 21:31:57
>>738 コンパイルが通るだけで動作確認ができてないですけど、
もしどこかに簡単にアップできる先があればアップしますよ。
>>740 おー、ご自分でポートされたんですね。
ちゃんと動いてるっぽくていいなー。
[わなD]を見ると、私のほうでちゃんとでてないのは、
-gオプションで再コンパイルしたphobos使ってないからかも。
ちなみにうちは、WindowsXP / dmd2.0007 / phobos / dsss で稼動させてます。
2.0007 ご、ごめん
ちなみに同じ問題で悩んだけど 1.x 系だと phobos コンパイル通らなかった・・・! phobos のコンパイル通すのですら、をるたんにとって優先順位低そうでイヤン
D言語製のブラウザとかないわけ
D言語製のブラウザとか必要もないよな・・・
参考になるサンプルはある程度必要だろ
アプリのサンプルというよりゲームとかなら作られてるみたいだな。
760 :
デフォルトの名無しさん :2007/11/09(金) 07:26:59
C/C++の遺産の再利用がまだしづらいのかな?
サンプルを作ってもちょっと経ったらコンパイルできなくなりそうな言語
そして、いつぞやの納品したやつ脂肪。。。w
CTFEや文字列mixinに対応したIDEまだ?
CTFEって何ぞ?
どんも。mixinならまだしも CTFE に対応はかなり厳しくない?
もうコンパイラがIDEになっちまえばいいのではないだろうか。
String は非推奨になってるよ。 何でStringからTextにしたんだろ… StringはStringで別のものを提供するつもりなんだろうか… あとText.toUtf8()がおかしい。バグっぽい。Object.toUtf8()の「オーバーロード」関数になっちゃってるみたい…
そういや配列のプロパティ形式って配列でしかダメな理由あるのかな?
配列にはメンバがないからルックアップが簡単になるためじゃなかろうか。 たしか、カンファレンスのスライドだったかで、配列以外にも拡張するようなことが書いてあったと思う。
そのうちメソッドが void func(Class c) { } auto c = new Class; c.func(); なんてことになるのかな
さすがにそれはどうかと思う
>>773 ので書いたらクラスに後からメソッドを追加出来るな
それじゃクラスいらないね 全部構造体でいいじゃん
拡張メソッドはprivateメンバに触れないからカプセル化ができないじゃん
>>770 非推奨になってたのか。サンクス。
機能的にテキストエディタを意識しているように見えるから Text に名前変えたんかな。
お、Dにも来るのかそれ。 ……関数・メソッド・プロパティじゃそれぞれ相応しい名前が違ってくるから、 あんまり安直にごっちゃに出来て欲しくはないなぁ、というのは神経質というか今更かしらん。
自分としてはモジュールのstatic import や別名つけてる時も大丈夫なようにして欲しいな。 import Conv = std.conv; "12345".Conv.to!(int); とか。使ってる関数がどのモジュールに属するのか簡単に分からないのは嫌いだし 呼び出してるのがメソッドなのか関数なのか区別つかないのは精神衛生上よろしくない。
それはまた気持ちが悪いな…
うへぇ、きめぇwwwwが褒め言葉のD言語ですが
>>781 自分的にもそれはほしいけど、なんかわかりにくくなるね…
…ここでスコープ解決演算子::の登場。
import Conv = std.conv;
"12345".Conv::to!(int);
とか。何でも.でアクセスするのはC++使ってた身としてはコード的に見にくくなる気がしている。
"12345".Conv :: to!(int); ↑ここで意味の切れ目がある感じがして好きじゃないなあ "12345".(Conv.to!(int)); とか。
"12345".[Conv.to!(int)]; 角括弧のほうが見やすそう。
"12345".to!(int)で良いよ。無駄な冗長性はいらん。 安全に書きたいときは普通の形式で書けば良いんだし。
某スクリプト言語風にすると "12345".to#Conv!(int) または "12345".to!(int)#Conv こんな感じかな
Poseidonで ERROR >>> Wrong DMD Path!! とか出てコンパイルできないんだがどうすればいいんだ? DMDのパスを指定してるのにできない
>>786 無駄じゃないよ。
さっきも言ったように関数なのかメソッドなのか、関数ならどのモジュールの関数なのか
ぱっと見て分かるのは非常に保守しやすい。
自分の作ったものを自分で見る分には効果は薄いかもしれんが他人のソースコードを
見る時は非常に助かる。
Hoge hoge = new Hoge;
hoge.foo();
という記述があって、fooで何してるか見たい時に Hoge の定義見て、「あれ foo が無い」
となり、次は関数探すのにインポートしているモジュール見てそこから探し出すか、grep
かけた結果から探す羽目になる。
hoge.Bar.foo();
って記述してありゃ、Bar モジュールの foo()関数を読んでいるってのがすぐ分かる。
>>788 dmd の1個上のフォルダ指すんじゃなかったっけ。
c:\dmd なら c:\ を指定する。
>>789 ヒント: class Hoge{class Bar{void foo(){}}}
792 :
791 :2007/11/10(土) 17:07:34
ミスった。class Hoge{static class Bar{static void foo(){}}}ね。
793 :
789 :2007/11/10(土) 17:10:30
>>790 bin の1個上のフォルダ指すんじゃなかったっけ。
c:\dmd\bin なら c:\dmd を指定する。
>>790 ,794
ありがとう。おかげでIDE環境で初コンパイル出来たよ(つД`;)
>>793 まぁ、基本的にはそうだけど。
でも根本を無くすにはdmdがcallgraphを生成できるようになるのが一番だと思う。
伝説のIDEが登場すればチップヘルプで教えてくれるよ。
hoge.Bar.foo(); このBarの部分が省略可能だったらいいのではないかと。 明示したいときは明示すればいいし。
Barがmoduleなのかaliasなのかclassなのかstructなのか関数なのかメソッドなのか プロパティなのかメンバ変数なのかが区別つかなくなって読みにくいコードになりそうだな。 …っておもったけどいざとなったらtypeofとかis式とか__traitsとかpragma(msg, ...)とか stringofとかですぐに見つけられそうだな。
>799のhoge.bar.foo()形式は、演算子の結合順序的にありえないだろうな。 >783のhoge.bar::foo()形式だと、mylib.barとかいうモジュール名とか考えると破綻する気が。 ありえるとしたら>784とか>785あたりのhoge.(bar.foo)()系じゃね? >799の任意省略方式だと、static importとかで完全修飾を強制することによる bar.foo(hoge)って記法に対して存在意義がないから、>800の言うような 混乱要素を無用に増やすだけになると思う。 >786で言われてることかな。
>>801 関数呼び出し式は今も
IdentifierList '(' ParameterList ')'
IdentifierList:
identifier
IdentifierList '.' identifier
だから、結合順序的には問題ないよ。意味論のフェイズで正しく処理できるようにしてやるだけ。
803 :
デフォルトの名無しさん :2007/11/11(日) 09:17:07
>>802 いやいや、お前が間違ってるよ。よく考え身。
>>804 間違ってるとかいうなら根拠しめそうぜ
モジュール名は識別子じゃないとか間抜けなこと言う?
ああ、マヌケにはもっと説明を加えないと分からないか。 abc.efg.hij() これを結合順に括弧でくくってみろ。 それが既存の文法と矛盾しないか考えろ。
'.'って、いつから演算子になったんだろう
最初から
演算子の結合順は実装依存。 結合順に依存するコードは誤り。
>>810 お前頭大丈夫か?
そんなわけないだろ。
仕様で結合順は決まってるよ。
釣り師おおすぎ
土日だからな はぁ…月曜日が待ち遠しい…
月曜はニートだらけ
>>811 >>815 とりあえず、ここを読んでみようか
http://www.digitalmars.com/d/expression.html Evaluation Order
Unless otherwise specified, the implementation is free to evaluate the components of an expression in any order. It is an error to depend on order of evaluation when it is not specified. For example, the following are illegal:
アホ多くてワロタ
どっちにしろ、abc.efg.hij()は左結合だから、 (abc.efg).hij()と解釈されることはあっても、 abc.(efg.hij)()と解釈されることは無いな
>>817 明らかにアホはお前。
評価順と結合順を勘違いしてる大バカ野郎。
Barモジュールにあるfooってことで hoge.foo@Bar() とかどうだろう。 これでFugaモジュールにfooがある場合も hoge.foo@Fuga() っていけるし。 けど重複していない場合は hoge.foo() と省略して書けるとか。
>>818 そうだけど、typeof(abc)からefgを探して、無ければグローバルから辿るでおk。
>>818 式(expression.module)がexpressionとmoduleをpackしたデータを返すことにして、
それに対して.memberを呼び出したときに、module.member(expression)と解釈される。
ただし、(expression.module)のデータ型はコンパイル時にのみ存在し、変数等に保持することは出来ない。
と定義すれば何の矛盾もなくね?
>>821-822 何でそんなに無意味に複雑にする必要がある。
というか、そんな風にしたら foo.Bar.hogeという式のBarが何なのかを探すのが困難すぎる。
モジュール名を記述させたい理由は
>って記述してありゃ、Barモジュールのfoo()関数を読んでいるってのがすぐ分かる。
ってことじゃなかったのかよ。
まるっきり逆効果になることを言って何がしたいんだよ。
824 :
821 :2007/11/11(日) 18:35:25
825 :
821 :2007/11/11(日) 18:36:40
でも無いか、勘違いスマソ。
>>824 一行目しか読めないのか?
つーか、実装的にも自然じゃねーよ。。
aaa.bbb.ccc.ddd.eee()
これがどういう探索をしないといけないのか、よく考えてみろ
bbb.ccc.dddというモジュールがあったら?
ccc.dddというモジュールがあったら?
配列のプロパティ的構文で、 module util; int sum(int[] array) { ... } ... sum = a.sum; 関数が定義されてるモジュール名を書くようにするには、どうすればいいか、という話だったよね。 関数なら、util.func(array);で問題ないが、プロパティ的に呼び出すときには、 array.util.func; なのか、 array.uitl::func; なのか、とか云々。 一人、訳の分からない人がいて混乱してるけど、元々はこういう話だったということで。
何も考えずに、 array.(module.func)でいいと思うんだけど。 これが気に入らない人の意見が聞きたい。
それ以上省略できたら無意味に分かりにくくなるだけだしな。
830 :
802 :2007/11/11(日) 20:46:36
>>806 ,
>>807 ,
>>815 予想してた斜め上の回答がきててワロタ
構文解析とか意味解析とか知らないくせに左結合とか右結合とか
結合規則だけでコンパイラ語ってんじゃねぇ、ヴォケw
例えば、hoge モジュールの中に foo クラスがあって、bar っていうメソッドがあったとして、
hoge.foo.bar っていう字句列が何を意味するか分かる?
やれやれ、結局煽るだけか。 まぁ、納得できないんじゃなく、理解できないんだからしょうがないが。
>>832 つーかさ、なんで>802クンは>830で突然戻ってきた風なくせに、
突然>830でキレ気味に「ヴォケ」とかあおってんの?
そんなに悔しい出来ことがあったのですかー?
はいはい、ごめんねー
やれやれ、反論できずに非を認めて謝っちゃったか。最初からそうしとけばよかったのにな。
うん、そうだね^^
どうやらようやく理解できたようで。めでたしめでたし。
はい
わかったふりしたい時は 偉そうにクイズ出してごまかすに限るよな。
上はじゃじゃ馬下はヘボ これなーんだ?
ちんこ
まあ>>833-
>>841 は俺の自演なんだけどねー
>>842 自演ってことにしたいの?そんなに悔しかったのかい?
無駄なレスで消費するなよな・・・ と言うとこのレスも無駄だろと言われるんだろうけど。
糞スレのいい再利用法だな
アイタタタタタ・・・ 今日は802は悔しくて眠れないだろうなこりゃ。
悔しがることかどうかもわかってないから大丈夫
なんかスレのレベル下がったな
俺のおかげだな。
>>848 =849
いい加減にしたらどうだ?
そこまでして勝ち誇りたいかね
まだうだうだやってたのか。
せっかく俺が
>>834 を書き込んでやったというのに。
でもそんなの関係ねー
本当に悔しくて眠れないって、うけるwwwwwwwwwwwwwww
いい加減に寝ろww
おはよう諸君。 最後に書き込んだやつが、悔しくて最後まで起きてた奴ってことでいいかね?
>>859 悔しくて、朝一番に書き込んじゃったお前が NO.1だよ。寝てないんじゃない?
下らない流れで加速させてもなあ(´・ω・)
lazyって何につかってんのww
>>863 lazyとか、macroが導入されたら使い物にならなくなりそうな気がするな。
いまでもdelegateとか使えば表現できるし、使い道的にはぶっちゃけいらないんじゃね?
最適化のために使われたりするのかなぁ…
>>864 もういい加減その話題引っ張るのやめようぜ。
引っ張れば引っ張るほどそいつの悔しさが露呈するという事実
>>866 やめようぜ、頼むよ。
再帰には終了条件を設定すべきだろ。
終了条件はスタック溢れて例外飛ぶまででおk
末尾最適化されて無限ループに
auto D言語_Part15 = std.thread.getThis; D言語_Part15.pause;
何をどう書き込んだって俺の勝ちなんだから、 もう諦めようよw
じゃ俺も勝ちで
じゃあ俺は負けで
何の祭かと思ってスレ開く前に公式すっ飛んでった俺涙目
DSSS つかってみたんだけど dsss build でexeファイルができない・・・ 1>Creating imports for DD-Debug 1>Creating imports for DD-dsss_objs 1>Debug => DD-Debug 1>WARNING: Section Debug has no files. 1>dsss_objs => DD-dsss_objs 1>WARNING: Section dsss_objs has no files. ってでます。 dsss build main.d ってやればできるんだけど ルートディレクトリでコマンド一発ってのがdsssの機能をつかいたいです
dmd 2.007で void hoge(void delegate() func){ func(); } void main(){ hoge({goto End;}); End: return; } をコンパイルするとError: label End is undefinedってなるのと mainのreturn;をはずすと(ラベルの後がすぐ}だと)エラー出すのは仕様通り?
ラベルの後ろには文がないといけない。 End: ; ってしてみるといい。
>>876 gotoで飛べるのは同じ関数の中のラベルだけで、
関数から飛び出したり別の関数へ飛び込んだりは出来ないよ。
継・・・続・・・?
継続はいらね
あのさ、1系列はもういらない子なの?
まぁ、一度もまともに固まったことのない言語に安定版の3文字など存在しないから、 1.xは実質的には、単なる「試行錯誤の跡地」であり、要らない子かもしれないな。 そこに何かを求めるのは、ついうっかりDの安定性に賭けて何か作っちゃった人くらいだな。
今ふと気づいたんだけど、-v1オプションていつからか消えてる?
>>883 ヒドスwwwww
でもそんな感じだな・・・
2.0もそうなるんだろうな・・・
>>884 2.xには最初からなかったと思うけど
1.xにもなくなっているのかな
C♯も3.0出るしな
unrecognized switch '-debuglib=tango-base-dmd.lib' Tango入れたらこんなん出てきたんですが、 これはどっか設定変えないと駄目なんでしょうか。
DMDが古いんじゃね?
入れてる dmd が古くて -debuglib オプションを持ってないんだろう
omg そうだったんすか。 ありがとうございました。
893 :
デフォルトの名無しさん :2007/11/15(木) 02:07:06
既出してたらゴメ。dmd2.007(win)で import std.stdio; void main() { auto A = new Object(); auto B = A; delete A; delete B; writefln("end of process"); } を実行すると、end of processは表示されるけど、 プロセスが終了しないんだが、 1.そういうことしちゃだめ。 2.今、gcがもっすごがんばってるからもうちょい待て。 3.delete式なんてただの飾りですよ。エロい人にはそれが分からんのです。 4.バグだけど直すほどの価値がない。 どれ?
テキトーなクラスつくってデストラクタにwritelnでも入れとけば確認できるんじゃないでしょうか。
ていうかよく見たら参照元がdeleteされたあとさらにdeleteしてるんすか。 これはやっちゃだめでしょう。
気になって眠れないので調べたら、 「ポインタ、動的配列、参照変数は、 delete のあと null にセットされます。」 と言う一文が。 しかしこの場合nullがセットされるのは参照変数としてのA自体で、 Aの実体を参照してた参照変数のBはそのまんま(つまりゴミ参照してる)じゃないでしょうか。 なのでやっぱり複数の参照変数で参照されてる大元消したあとにdeleteするのはまずいかも。
ソースのどこで例外出してるか調べる方法ってありませんか? dfl使ってツリービューとかにドラッグオーバーを何度か繰り返すと 例外吐くんですが、それがどこなのかわかりません。
flectionedってそういうことできたっけ?
900 :
893 :2007/11/15(木) 16:09:45
>>894-897 あ、やっぱそっか。さんくす。
どうも4から疑ってしまう自分がいて、反省。
でも、例外とか吐いてくれるような仕様にならんかなあ。
>>899 あれはTangoが無いと動かないみたいで。
dflとTangoの組み合わせは自分でやった限りでは出来なかったので。
903 :
デフォルトの名無しさん :2007/11/15(木) 21:26:28
突然でアレなんだけどさ、これ module a; private import std.stdio; module b; import a; void main() { std.stdio.writefln("hello"); } >dmd b.d a.d が通るって初めて知ったんだけど、キモくね?
きもいね
きもいけどどういう挙動が正しいのか仕様にはっきりと書いてないね。
http://www.kmonos.net/alang/d/module.html >デフォルトでは、import は private です。
>これは例えば モジュール A がモジュール B を、
>モジュール B はモジュール C をimportしていた場合、
>Cの名前はAでは探索されないということです。
>ただし、 import を特別に public と宣言すると、
>その import が取り込むモジュール内の全ての名前が、
>現在のモジュールを外からimportするモジュールにも見えるようになります。
未定義になるべきなのでは
もしかして実はデフォルトがpublicなのかなーとか思って明示的にprivate import aにしてみたがやっぱり通るね。
バグじゃない?
>>903 それ、モジュールAとimport a;が無くても通るんだよね。
だから、仕様だと思ってた。
フル修飾だとimport不要、みたいな。
それだとstatic importの立場がなくなるがな
8ビットのビットマップクラスをつくてるんだが、streamのFileをオープンした瞬間にアクセス違反で落ちる。 Windowsなんだけど、なんでかな〜。いまのとこ、無いファイルを作ろうとしてるんだけど。 コンソールに違反だよ〜ってでるからAPI内部の犯行ではないはずなんだけど。 あ、コンパイラのバージョンは1.015です。 bool Save(char[] name, bool IsIgnor = false){ BitmapFileHeader bmh; bmh.bfType = 0x4d42;// 'B'<<8 + 'M'; if(exists(name) == true){ if(IsIgnor == false) return false; } static if(IsDebug) writefln("file:",name); File fo; fo.open(name,FileMode.OutNew); /* if(fo.isOpen == false) return false; fo.writeBlock(cast(void*)&bmh,bmh.sizeof); fo.writeBlock(cast(void*)&bih_,bih_.sizeof); fo.writeBlock(cast(void*)Palette_,uint.sizeof*Palette_.length); fo.writeBlock(cast(void*)Pixel_,ubyte.sizeof*Pixel_.length); */ fo.close();
newせいよ
>>911 ぐあ。はずかし!またやってしまった!!
くそー。癖って抜けないね。
なんにせよ、レスありがとう!!!!
aliasじゃインターフェイスを実装したものとみなされないのか…
Tangobos→Phango
915 :
デフォルトの名無しさん :2007/11/16(金) 19:05:07
Phagos
Photangobos
デバッグってvs2005でもいけるんでしょうか。 vs6だとうまく行くんだけど、vs2005だと作業フォルダ指定しても ブレークポイントに反応してくれない。
pthaonbgoos.
phandango
Tanpo
Chi...
>>889 >unrecognized switch '-debuglib=tango-base-dmd.lib'
自分もその現象が発生しました。Tango 0.99.3になってそのスイッチを使い始めたみたいです。
調査の結果、rebuildが-debuglibに対応できていないのが原因のようで、dsss最新版のrebuildを使ってみてもだめみたいです…
というわけで、dsssやrebuildを用いないでコンパイルするとうまくいくことがわかりました。
レスポンスファイルを作ってやるか、makeを活用するとよいかと思います。
というわけでそれを踏まえてDFL 0.96.01を使ってみたのだけど、いくつかはまったので使いたい方は以下を参考するとよいかと思います。
import\dfl\makelib.bat(23)にinternal/_stdcwindows.dを追加
import\dfl\makelib.bat(25)に_stdcwindows.objを追加
import\dfl\makelib.bat(34)の-v1を削除
でgo.batを実行してライブラリをビルドすることで解決したので参考までに載せておきます。
>>917 ああそういうことだったのかな
前はソースレベルデバッグできてたのにいつの間にかできなくなったと思っていたら
どなたかDflでドラッグドロップ系の処理が出来ている方っていますか? いたらバージョンを教えてほしいのでスが。
class A{ static void opBrace(void delegate() v){v();} } A{printf("brace");} みたいなのが欲しい。
q{} 文字列リテラルを追加しちゃったから、望み薄だな。
>>926 あれは、{code();}.stringof とかの方がよかったと思うのにな。。
tanpopo tanbo botan popotan bosan
>>926 a(b)があるけど、opCallもあるから大丈夫だ。
q{}を無くせばおk
どういうことだ? printf(q{A{"huga\n"}});は通る
>>924 ドラッグドロップ系使う時は
Application.run(...) を呼び出す前に Application.autoCollect = false; として、
頻繁にGCが走らないようにすると、とりあえず落ちるのは回避できるみたい。
必要な領域までGCに解放されてしまってるのかも…
直りました! 助かりましたありがとうございました。
935 :
デフォルトの名無しさん :2007/11/17(土) 03:21:23
mixin(q{aaaaaaaaaaaaaaa}); //error!
phungus
matango simeji enoki shitake
ttp://www.dsource.org/projects/tango/wiki/0_99_3_release ・DMD builds no longer generate libphobos.a/phobos.lib, but instead utilize the -defaultlib switch.
This enables phobos to install side-by-side with Tango
・Also note that there is an experimental D2.0 branch in our repositories now.
よく言われる
よく言われる932 よく言い、よく陰で思われる940
よく言われる932 よく言い、よく陰で思われる940 よく言い、よく影で思われ、それに気づかない942
class q{ static string opBrace(void delegate() d){return d.stringof;} } class q{ static string opBrace(string s){return s;} } とかできれば、q{}はいらないと
そもそもqは何のためにあるの
mixin(q{ some_valid_code_here; });
>>946 ありがとう
えーとじゃあ↓じゃなくて
mixin("some_valid_code_here;");
そうしたい場合ってのはどんなとき?
文字列と整数を合体させたい場合ってどうやるんでしょうか
>>947 mixin(q{ this is not valid tokens; }); // error
mixin(q{ this_is_valid(); });
ってことじゃね。
>>948 std.conv.to!(string)
mixin(" this is not valid tokens; "); でもエラー出ね? 出るエラーが違うのかな
>>951 変数に格納したりするなら、エラーの出る場所が違うな。
みんな分かってるみたいなのに
q{}の意義が全然わからなくて俺涙目
>>949 それをどういうときに使うのかと
mixin て何か分かってんのかね、おまいは。
わかりやすく説明すると、トークン文字列 q { ... }の内部の文字列は、Dのトークンであるので、 Dの字句解析をパスしなければならない。 つまり、文字列が、Dのソースとして解釈可能であるかどうかを判別できる。
q{}なんてあったの初めて知った。 コードを文字列として渡すときに、ダブルクォートの中にコードを書くなんていう、 エディタ支援が受けられない(どころかむしろ邪魔になる)苦行に挑まんで済むわけね。
え?そうなの? 俺は、変態なことやってる場所を簡単に検索できるためだと思ってた。
import std.stdio; void main() { const a1 = "\"hoge\""; mixin("string c1=mixin(\"mixin(\\\"\\\\\\\"huga\\\\\\\"\\\")~\\\"hoge\\\"\") ~ mixin(a1);"); writeln(c1); const a2 = q{q{hoge}}; mixin(q{string c2=mixin(q{mixin(q{q{huga}})~q{hoge}}) ~ mixin(a2);}); writeln(c2); } どっちがいいかとか
import std.stdio; void main() { const C = q{ mixin(A) + mixin(B) }; const A = q{ a }; const B = q{ b }; int a = 10; int b = 20; writeln( mixin(C) ); } こんなことできたりとか
なんという遅延評価…
import std.stdio; void main() { const s = q{mixin(s)}; writefln(mixin(s)); }
q{}はmixin用ってことでおk?
import std.stdio; alias string symbol; template add(symbol o, symbol v) { const add = `mixin( q{`~o~`} ) + mixin( q{`~v~`} )`; } void main() { const c = add!(q{a},q{b}); int a = 10; int b = 20; writeln(mixin(c)); a = 100; b = 200; writeln(mixin(c)); }
964 :
953 :2007/11/17(土) 22:21:54
>>954 mixinは大丈夫
他のレスは後で試してみます
なんか分かりそう
ありがとん
べつに構文はvalidじゃなくとも字句だけDの範疇ならOKだよね? q{int int class class invalid;}とかやっても大丈夫だし。
実行時mixinないかなー
opStarAssignマダー
亀ですまんけどちょっと質問
>>542 どうやって?
int a,b,c;
Tuple!(a, b, c) = Tuple!(10, 20, 30);とかって無理じゃね?
>>968 template Tuple(T...) { alias T Tuple; }
もしかしてDMD古いとできない?
>>970 1.023/2.006 でバグフィックスされてできるようになったのでそれより古いとダメ
obj[index] = value; はopAssignでオーバーロードできるけど、 obj[index] += value; みたいな複合代入をオーバーロードする方法ってある?
opAddAssign
974 :
デフォルトの名無しさん :2007/11/18(日) 13:39:55
あ、配列か。 opIndexでオブジェクトを返すとか ()がいるけど
>>971 1.020使ってたよ・・・(´・ω・`)
バージョンうpしたいけどgdcがなあ・・・
opIndexOpAssign opStarAssign opStarOpAssign このあたり追加して欲しい
Opってなんだ?
AddとかDivとか
opSliceOpAssign opCallAssign opCallOpAssign もお願いします!
obj(arg) = val; …さすがに要らんと思う。
obj(arg) += val; きんもーwww
perlだと関数呼び出しがlvalueになれるよな。 まあ、下駄雪駄を合わせたプロパティ的用途か、スライスへの代入の用途が主だから、 Dなら別の機能で間に合ってるけど。
opCallで内部クラスでも返せばよくねwwwww
あとすこしで落ちるからたわ言など。 公式で、ユーザライブラリコンテストとかやらないかねぇ。 一回総集編を作ってほしい。 現状、フレームワークは決定打ないし、グラフィックライブラリはないし、サウンドライブラリも無い。 でもなぜかZIPはあるし、細かいスパイスのきいたライブラリがそろってるのもまー事実。 Tangobosの問題もあるし、V2系のラストで是非やってほしいと結構おもてる。 問題はいつV2系が安定するかだなぁ。。。
あと15レス分は何に使うかな。
Truetypeフォントを動的ロードできて、さらに描画できたら、結構汎用性あがるかなぁ。 ファイルフォーマットの内容しらないし、ライセンスがどうなってるかは知らないけど。 プログラムの場合ってラスタフォントのほうが相性いいのかなぁ。
インターフェースの設計っていい叩き台ないもんですかね。 現状、Bitmapのインターフェースの設計をてきとーにやってるんですけど、 うまく全部(1〜32びっと)に当てはまるインターフェースが良くわからないです。 総合あーかいばプロジェクトは割りとその辺の設計が良かったから普及したようなもんだし。 なんか、いい手はないもんかなぁ。
規制に引っかかったので自重
>>982 perlのlvalueってあれ単に参照返してるだけに見える俺は異常?
中間言語導入による部分的な動的コンパイルの実現!
中間言語いらんからコンパイラを標準ライブラリに(ry
>>988 よくわからんが、
void[]でビットイメージを保持しておいて、
インデクサを用いて適切に変換するようにすればいいんじゃなかろうか。
>>988 >707だけど同じ目的なので設計を話し合ってみませんか?
私はピクセルに触る部分だけ専用の関数を作って、これをピクセルフォーマットごとに変えるようにし、
それ以外の塗りとかその他は必ずその関数経由で触るように設計しました。
あとで自分がやった内容についてファイルをうpしてみます。
俺の欲しいもの: * プロパティに対する複合代入 * ラムダ式 をるたん、クリスマスプレゼントまってます。
それまで>996はいい子にしてないとな
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。