1 :
デフォルトの名無しさん :
2008/08/04(月) 10:24:58
おつ
いちもつ
愛嬌のある乙だ
どうでもいいからnogcのキーワードがほしい。 ガベージコレクタを使わないことを静的に明示する。 あとscope強化してほしい。クラスメンバにscopeつけられるとか。
前スレっていつになったら埋まるの?
埋めたてんなよ勿体無い
2chにはGCがついていないので駄レスは回収されません
だれがうまいことを
動的配列のsizeofって何で参照のサイズなんだろ 全体のバイト数が欲しかったのに><
>>13 勘弁してくれ
コンテナ作るときとか困るだろ?
Dってパソコン用だよな… マイコンとかそっちは、やっぱアセンブラかCだよな
>>15 規模によるんじゃね?カーナビとか腕時計とか、それこそいろんな種類があるだろ
17 :
16 :2008/08/06(水) 22:22:03
>>15 すまん脊髄反射した。組み込みじゃなくてマイコンか
組み込みも結構低いの使ってるのあるからそれでもいいんだけど 組み込みはDいけるのか
組み込みでGCとかありえないからな Dなんて無条件ボツ
GC かからんような struct とかでがんばりゃなんとかなるでしょ。 ライブラリが鬼門だが、組み込みやる奴ならライブラリから作るだろうし。 今は invaliant があるから ROM 化しやすいはずだぞ。
Dってtry~catchあるの?
C#で言うところのGC.KeepAlive()的なものは無いの?
今は高機能なデバイスはWindows載せてて.NETが走ってるような時代なんだから、 「組み込み」が必ずしも低リソースな環境での開発を意味するわけではないでそ
携帯のJAVAもあるし、
>>15 でFAじゃないかな
でもCって高級アセンブラって感じだよな、結局 やっぱカリカリにチューニングするにはそうするしか無いんだな
27 :
25 :2008/08/07(木) 00:31:52
今風の記法だと synchronized auto keepAlive = obj; でした。 volatileないと不必要に同期処理入るのが気に入らんなあ。 最適化を抑制するのになんか別の書き方ないんだろうか。
volatileブロックって2.0でボツになったんだっけ
29 :
デフォルトの名無しさん :2008/08/07(木) 02:58:35
なんねーよボケ ボツになるのはテメーのコードだけで十分だ
いきなり火病られても困る
すぐキレる若者の典型例
>>29 しかし反省する様子はない
くり返し注意をしても無反応
いいかげん無視しようとみんなで話していると
ただ黙っていた
>>29 が初めて口を開いた。
いや、開いたのは下の口だった…。
オナラすんな
おれもくいたい
std.dateって何か設計おかしくない? d_time MakeDay(d_time year, d_time month, d_time date) もう完全に型の意味ないじゃん。
ちなみに使い方は、 writeln(toString(MakeDate(MakeDay(2008, 8, 7), MakeTime(14, 8, 41, 0)))) MakeDate,MakeDay,MakeTimeの引数・戻り値は表してるものが全部違うのに同じ型。
dsourceつながんない
2.013で > VolatileStatement を非推奨としました。代わりに SynchronizedStatement を使用してください。 だよ。
なんだやっぱりボツなんじゃん 29は何なの
volatile == synchronized なの?
volatile === synchronized なの?
volatileってこういうのだろ unsigned int volatile *reg = (unsigned int volatile *)0xABCD1234; //なんかのレジスタ while(*reg & 0x1){} //ポーリング で、volatile付けないと最適化されて無限ループになっちゃうっていう
>>41 命令の順序を入れ替えたり省略したりしないのがvolatile,
それに加えて複数の命令をアトミックにするのがsynchronized
アトムと言われて アトムボーイ きりり
TangoConferneceだってよ 行かないけど
47 :
デフォルトの名無しさん :2008/08/08(金) 12:08:48
ConfigureとかでStaticとかSharedとかあるんですけど、これどういう違いがあるんでしょうか。
何のconfigureか分からないけど,静的ライブラリとして生成するか共有ライブラリとして生成するかの違いじゃないかな.
行ってみたいもんだな
そろそろdmdの更新が来そうな気がするな。前回の更新から約1か月… 破壊的な変更があると盛り上がるんだが…
出力時に文字コードを変換できる変数 kanji が登場 kanji.utf8 kanji.sjis kanji.eucjp などなど
いまどきkanjiはねえよ
メモリリークを検出する方法ってありませんか
ガーベジコレクタを信じればいいと思うよ
GCをOFFに出来ないのがDの最大の弱点だよな
>>59 >>58 の言いたかったことは、GCを使わない記述は現状非常に困難で、
std.gc.disable(); とかしたときでもメモリ使用量を増やすことなく
動作するプログラムが書けないねってことなんじゃないかと思った。
そんな俺は
>>8
>>59 それはGCの回収作業を一時的に止めるだけ。
言語仕様自体がGCの存在にいそんしてるから、GCを完全に無効にしてしまうと、
かなり気を使ってコードを書かないとメモリリークする。
>>60-61 すまん
文章しか読まないで、文章の意味と意図を全然考えて無かった
>>61 それはCなみに、ですか。それともC以上にですか?
>>63 C以上に。
Cだとmallocに対応したfree書いとけばメモリリークしない。
C++でもnewした分だけdeleteすればいい。
でも、Dは違う!Dはすごい!!
うっかりしてるとコンパイラが勝手にnewしてる。
newとか.dupとか書かなくても独りでにオブジェクトが増えてる。
自分でnewしてないやつまでdeleteしないといけない。
配列リテラルとか全部deleteしないといけない。
>>64 それは死にますね。というか、自力管理はほとんど不可能ではないでしょうか。
>>65 や、便利機能を封印すればいいだけなんでできんことはないよ。
DのGCの自体もDで書いてあるわけだけど、GCに依存しないようにできてる。
ただ、見てみれば分かると思うけど、まんまCだから素直にC使ったほうがいいw
GCを切りたい訳ではなくて、Dから呼び出してるライブラリでのリークを調べたいんですが これはここで聞くべき事柄ではないですか? 正しい処理: Resource* res = dll_malloc(); ... dll_free(res); 解放忘れ: Resource* res = dll_malloc(); ... //dll_free(res); ←これを忘れていないか調べたい
メモリリークを検出するにはラッパ被せて追跡すればいいだけでしょ。 つまり、dll_malloc/freeのかわりにdebug_dll_malloc/freeにでもして、呼び出しの数かぞえる。 でもどうせなら折角GCあるんだし、オブジェクトでラップしてデストラクタで開放してやればリークしなくなるよ。
D2.018 T[] a, b; ... a[] = b[] + 4; だそうです。
これdmd1.0系列にも適用されるのな
a[].foo() ってのは無しかい?
foo(a);が1回だけ呼ばれます
まだごくごく一部の構文でしか動かないみたい
実装されるまで長かったなぁ配列演算 []付けると配列演算なのね
Version D 1.034 Aug 7, 2008 New/Changed Features * Now supports array operations. ワロタ
all base belong to us
auto b = a[] * 3; とかはできないのかー
>>76 all your base are belong to us.
C++脳だから、そんなに配列演算って便利かなー???と思うけど。 なんかいい例ないですかね。
むしろstd::vectorを組み込みにしちゃいました的な感じじゃね
>>79 利便性というよりはベクトル化が目的なんじゃないのかね。
お世辞にも構文的に使いやすいとはいえないし。
C++にはvalarrayってのがありますけどつかった事ないですねぇ。
>>80 メモリ負荷を気にしないでpush_backできるなら結構すごいと思います。
>>81 最適化でSSE使うとかそっち方面の話ですか?
でも現状SIMD使ってないみたいだな。 逆アセはしてないが、計った感じだと
なんかインパクトに欠ける更新だな
既存コードが通らなくなる変更じゃないと満足できない体に、もう……。
皆さん2.0使ってるんですか? 1系の方がいい理由とかあるんでしょうか。
あんまり仕様変更がなく安定している・・・ 訳ではないな、すぐ↑で話題になったとおりw
一応破壊的変更はないものと思ってよいのではないか?
1系はEasyDとかもあって、Dを始める人には「Dってこんなんだよ!」っていうのがわかりやすいよな
この砂上の楼閣っぷりがたまらないwwww
D2.0のユーザは 少数の新しい物好きと 多数のマゾヒストにより構成される
まるで封建社会ね
違うな新しい性の目覚めだ
そんなことより早くstatic foreachをください
それなんですか
性的にコレクションを嘗め回します
双方向リストくだちぃ>< あとキューとかFIFOとか・・・みなさんはどうされてますか
Tango
tango使ってる まあキューやスタックぐらいなら自力で書いてもいいかなとは思うが
phobosは変なモジュールあるのに肝心な機能に限ってないし、 tangoは2.0で動かないから、自分専用ライブラリがだいぶ膨らんできた。
>>102 俺も。
Stack,Queue,TreeSet,TreeMap,HashSet,
SFMTバインディング,CURLバインディング,iconvバインディング,gmpバインディング
を自分で何とかしたよ。
コンテナを構造体にするかクラスにするか 悩み続けたが、いまだに答えは出ていない
構造体は Stack x; // なんかいろいろ処理 Stack y = x; とかしたときにビットコピーされることを意識しないといけないから、 クラスのほうが混乱がなくていいんじゃないかと思う …んだけど、なんでTangoは構造体に…?
ビルトインの配列が参照型だから俺はクラスのほうが好みやな。 template Array(T){ alias T[] Array; } みたいにしたら似た感じで扱える。
ATL/WTL っぽいものなら、なんか出来つつある。
さぁみんなの力をあわしてくれ!
和製コレクションライブラリキタコレ!?
tangoもそうだけど俺には標準ライブラリは無駄にでかすぎるぜ
>>108 多重継承とメッセージクラッカー(だっけ?)みたいなのどうした?
TangoにJSONとかtrunkで導入されてるっぽいんだけど、標準ライブラリでそこまでする必要あんの?
PhobosにOpenRJとか導入されてるっぽいんだけど、標準ライブラリでそこまでする必要あんの?
std.openrjとstd.outbufferは俺的2大ゴミ標準ライブラリだと 思うんだけど皆はどう思う?
outbuffer使ったことないんだけど、なんの役に立つの?
74LS07使ったことないんだけど、なんの役に立つの?
>>113 bool onCreate(ref bool handled, LPCREATESTRUCT lpCreateStruct) {
return true;
}
void onDestroy(ref bool handled) {
PostQuitMessage(0);
}
LRESULT wndProc(UINT msg, WPARAM wp, LPARAM lp) {
bool handled = false;
LRESULT result = 0;
mixin msgcrack!(handled, result, msg, wp, lp);
MSG_WM_CREATE(&onCreate);
MSG_WM_DESTROY(&onDestroy);
MSG_WM_SIZE(&onSize);
こんな感じ。まだメッセージクラックでMSG_WM_〜とか作り始めたばっかりだからしょぼいけど、
でもちゃんと動くからよしとしてる。dmd 1.028 + phobos + win32 binding
>>120 なるほど
WTLがやってる多重継承の使い方をどういう風にDに落とし込むかで悩んだことがあるのよね
122 :
デフォルトの名無しさん :2008/08/12(火) 19:46:07
グループで開発してる言語ならともかく、一人で開発してる言語 なんて所詮、modula2と同様忘れられるさ
どういうわけか知らんが、Dは1人で設計開発されてると思われてるんだよなぁ 趣味止まりじゃないってことを見せ付けてくれんか?
Andreiかわいそす
最終的な決定権を持つのが一人ということだったらPerlもPythonもRubyも同じだよな
まともな標準ライブラリがないってのさえ初期のC++と同じだしな
スクリプト言語でインタプリタ屋が決定権持つのは仕方ないだろ Dは自分の所のコンパイラ識別子を予約語にしてるのが痛い
バージョン識別子の意味を勘違いしてるか予約語の意味を勘違いしてるか。 後者かな。予約語とは、とかでググれ。
>>129 DigitalMarsのコンパイラでGNUがdefineされてたらおかしいだろ…
>>129 version (DigitalMars)
{
...
}
version (GNU)
{
...
}
両方動作しちゃいます
ってさすがに釣りにマジレス過去悪いな
>>132 ( ゚д゚)ポカーン
ポカーン(゚д゚ )
( ゚д゚ )
え?これってDの仕様じゃなくてDigitalMarsのコンパイラの説明書なの? "DigitalMars"という識別子は「DigitalMars製コンパイラ」という意味以外で使っちゃいけないって Dの仕様で決められてるんだろ? でも「GNU製コンパイラ」という意味以外で使っちゃいけないっていう意味の識別子は 仕様にはないんだろ? そういう意味にしか取れないんだが
DMDの仕様書じゃないの?
正直どうでもいい
コンパイラの仕様と言語の仕様をごっちゃにしてるのか。
versionってDMDの拡張機能だろ
また変なのが湧いてきた
話題ふり Tangoってどんなん?
うぉるたんが新バージョンださないからスレが荒れてきた…
こないだ出したばっか…
いや、
>>142 の言ってるのはもしかして伝説のD3.0系か?
>>142 破壊度低くても新バージョン認めてやれよw
「僕の考えたD 3.0」な流れだな
例外発生時の発生したソースの行などを取得する方法ってないのですかねぇ。poseidonのデバッガは例外発生時に該当行でとまるので、どこかに情報を持ってそうなのですが。
ddbgならpsやらusやら打ち込めばチラ見出来た気がする
外部デバッガを使わずにプログラム自身にログを吐き出させたいので、 Exeptionのメッセージに該当箇所が入ってくれれば一番良いのですよね。 assertを例外で拾った場合はソース行も入ってるので、AccessViolation も同様ならいいなぁとか。
Visual D#マダー?
>>150 それは早急すぎ。C#がC++++の意味だから、まずはD++を経なければならない…
あと、.net対応ならDマネージ拡張とか、D/CLIとかでもありだな。
ああ・・・ ++++だったんだ#・・・
次はC丼だな
castのコストっていかほどなんでしょうか? キャストが不正だった場合、nullが返ってくるということは、 ランタイムで型をチェックしているんですよね
C#はJavaユーザからだと乗り換えしやすそうだけど Perl/Rubyあたりからだと、やっぱDの方がフレンドリーに思えるな・・・
>>154 そういうチェックが入るのは、クラスオブジェクトをダウンキャストするときだけでしょ。
>>156 なるほど、構造体とかならノーコストっすね
ありがとうございます
まじで和製D2.0Phobos用コレクションライブラリを 整備しませんか
それで言いだしっぺは何を提供してくれるんだね?
ごめんなさい>< 準備します
じゃあ俺はutil/brainfuck.dを提供することにしよう。
auto o = new Object; synchronized(o) { synchronized(o) { // do something } } こんな感じで同じオブジェクトで入れ子で複数回synchronized呼ぶのは安全ですか?
>>155 それは興味深い なんで?
>>161 そんなもんはいらんwwwていうかもう作ってる人いるw
opStarAssignが欲しいんだが…
>>164 このままop〜Assign系を増やしても根本的な解決にはならんだろ
必要なのは参照じゃね?
opStarが増えたからopStarAssignも欲しくなるんだよな opStarは何のために増えたんだ?
boost::spiritを移植するため
ノ ___ノ 精神を加速させろ (____,,--‐‐'''''"''':::::l.川 アイキャンレディゴー . |(●), 、(●)、.:|川 ゴーウェイ | ,,ノ(、_, )ヽ、・,,.::::|リリ
D言語使いはD Lingualでどうだ って流れに乗り遅れすぎだぞ俺
おまいらはマゾだからDingoでいいよ
Tinpoっぽいな
っぽくねえよw
Der
174 :
デフォルトの名無しさん :2008/08/15(金) 00:54:04
Microsftが採用しない限り、無理だろ。 MIcrosoftが開発を発表したDとは 似てもつかないものだし。 我田引水的にいうと、C#などの言語はWindowsプログラミング に徹した方がいい(MFCはもう古くさい)。 あとは、NativeのC++とC#をいかに透過的に連携させるかに 注力した方がいい。Windowsに関してはMFCよりもC#の方が 明らかにプログラムしやすい。 問題は、C++NativeコードとC#あるいはC++/CLIをいかに 透過的に結合させるかだ。
Der 変態
最初の3行以降はdと全く関係ないよね
であですでむでん
インターフェースと静的関数の関係がいくつか未定義な気がする // 通る interface A { static A opCall(); } // 通る interface A { static A opCall(); } class Z : A { } // 通る interface A { static A opCall(); } class Z : A { static S opCall() { return new S; } } // A.opCallが未定義であるとリンカが文句を言う interface A { static A opCall(); } class Z : A { }
2つ目と 4つ目の違いがわからん
ごめん interface A { static A opCall(); } class Z : A { } auto A = A(); と書いた場合A.opCallが未定義であるとリンカが文句を言う
>>181 あたりまえじゃないの?
どこで定義しているの?
>>182 当たり前なんだけど、
「そもそもinterfaceにstatic関数を定義できないのが正しいんじゃね?」
という議論が>179。
そもそも静的関数はオーバーライドできないんだから 宣言した箇所で定義をつけてやらないと困ったことになるのは当然だろう。 インターフェイスをC++的に考えると純粋抽象クラスだから、静的関数を持てても問題ないと思う。
テンプレートがあるんだから、 static virtualとかvirtualなコンストラクタとかが あってもいいのではなかろうかと常々思う。
>>184 待て待て後半で前半が覆されてるぞ
インターフェイスをC++的に考えると純粋抽象クラスだから,実装(静的関数)を持てちゃまずいんじゃないのか
>>185 static virtualは全然わからんが
virtualなコンストラクタって何のインスタンスができるんだ?
ビルトインでオブジェクトファクトリパターンでもやるのか?
できるのかなそれ
>>186 静的関数はオーバーライドできないから、クラスの抽象性とは関係ない、といいたかった。
>>185 静的関数を仮想化できて何の役に立つの?
静的関数は名前の通りコンパイル時に静的に解決されるから意味ないと思うけど。
News見ている人に質問 The Death of D. (Was Tango vs Phobos) のあたりの、あらすじを教えて よくわからなくなってきた
インスタンスの型によって振る舞いを変えるための virtual なわけで、 static 関数では対象となるインスタンスがないのにどう振る舞いを変えろと? 根本的にオブジェクト指向が分かってないんじゃないの?
>>186 interfaceと同じスコープにファクトリを据えたいのは山々なんだよね
>>190 Tango vs Phobos!?
興味深い
>>191 そもそも、インスタンスがないのに、
ファクトリが自分がどの型であるべきなのかどうやって認識するの?
この流れは… Phobos、Tangoに続きTimpoライブラリをこのスレで作る…!?
わかってたらそんな頓珍漢なこと言わないだろう
>>189 ウォルターが
Tangoのパブリックドメインやら
いろいろ言っているようなんだけど
>>189 「PhobosにTangoマージしてくれ」
→をる「ライセンスをPhobosとコンパチにしてもらえないと困る」
200 :
193 :2008/08/15(金) 20:17:15
>>195 おいおい、マジでそんなあほなこと言ってるのか。
インターフェースは内部実装知らないから意味があるんだぞ。
内部実装知らない状態で、インターフェースにあるファクトリは何を作るべきなのか?
と聞いているんだが。
実際のところ、
interface IFoo
{
IFoo createObject();
}
として、
IFoo newObj = foo.createObject();
くらいでファクトリは十分なんじゃねーの?
それ以外でどういうものを期待してるんだ?
文字列とか受け取ってから、その文字列に応じたインスタンスが欲しいとか そういう話だとすると、 それはそれ自体が実装だから元々インターフェースに置くべきではない。 class FooFactory { IFoo createObject(string fooType); } で十分でしょ。 interface に置いて何かが劇的に変わるかというと変わらない。 それにメンテナンス性が下がるよ。 インターフェースは原則として不変であるべきなのに、 新しい class FooNewClass とか追加したら、そのたびに interface の中いじることになる。
外部から登録するようにすればインターフェイスを弄る必要はない。
>>203 その場合、インターフェースが「内部状態」を持つことになりますが、
その辺についてはどうお考えで?
>>204 べつにいいじゃん。
ただの抽象クラスでしょ。
ただの,じゃなくて,純粋な抽象クラスだからなあ
インターフェースと抽象クラスの違いがわからない人がいることに絶望した。
てことでinterfaceにstaticメソッドを定義できちゃうのはまずいわな リンクエラーになるくらいならコンパイル時にエラーになってもよいと思う
結局はインターフェイスを名前空間として使いたいだけなんだよね。
インターフェイスは契約だって言いたいんだろうけど、 契約が自身に関係するメタ的な機能を持ってるのは何も問題があるようには思わない。
クラスというのは is-a 継承のために存在する。 インターフェースは、ポリモーフィズム(多態性)の実現のために存在する。 鳥と飛行機は両方飛ぶけど、 鳥 is a 飛行機にも、飛行機 is a 鳥にもならない。 でも、インターフェースとしては両方 Flyable なわけですよ。 まともなオブジェクト指向やってる人なら常識なんだけどねぇ。
>>212 それは抽象クラスとの違いの説明にはなってないよ
鳥 is a FlyingObject
飛行機 is a FlyingObject
そうそう、クラスの意味を理解していないと、
>>213 みたいな勘違いをやりやすいんだよね。
実際そういう変な継承で物を作って、後で困るケースが多々ある。
で、抽象クラスというのは
鳩 is a 鳥
という関係での鳥にあたる。
ただの派生元クラスじゃんということにもなるけど、
実装を一部持たないものが抽象クラスになる。
まだ、中身はわからないけど、
そのクラスにはそういう属性や振る舞いがあることは確かだ
というためにある。
>>209 C++で書くとこうかな
class A {
virtual void foo();//仮想関数
virtual void bar() = 0;//純粋仮想関数
}
仮想関数を1つでも持つクラスは抽象クラス(abstract class)という
すべてのメンバ関数が純粋仮想関数のクラスを純粋抽象クラス(==interface)という
これでおk?
飛行機 is a 機械で、鳥 is a 動物 という継承が実際後で必要になってきてから、 飛行機 is a FlyingObject, 鳥 is a FlyingObject という継承になってたりすると、あれー? ってことになる。 飛行機が物を食べるかどうかとか、 鳥にハンドルが付いているかどうかとか、真剣に考えたりすることに。 このへんは物をどう捉えるのかのセンスが問われるねぇ。
論点がぼやけすぎてきて話がわかんねーなこれw
interface FlyingObject にファクトリが付いていたとして、 何がインスタンス化されるのがお好みですか? と言えばわかりますか?
いや、
>>216 の書き込みにずいぶん納得した。
説明うまいね
>>216 多重継承が必要という話ですね、分かります。
Javaは偉大だ。 飛行機 extends a FlyingObject 鳥 extends a FlyingObject
>>216 飛行機 is a 機械
ロボット is a 機械
ロボットは空を飛び、飛行機は原子力で動くわけですね。
>>224 揚力得られずに自由落下するだけのは飛ぶとは言わんと思うが。
>>218 そんな変な例を出すから気持ち悪いだけで、
interface Singable { void sing(Song song); }
interface Danceable { void dance(Dance dance); }
class Singer : Singable;
class Dancer : Danceable;
class Otaku : Singable, Danceable;
という構成のときに、なんか歌が与えられて誰か適当に選んで歌って欲しいときに、
auto singable = Singable.createObject(song.genre);
singable.sing(song);
と書きたい。
もっとも、SingableFactoryを別に用意してもいいけど、
俺はSingableのメンバになってたほうが構文上美しいと思う。
ファクトリ自体のポリモーフィズムについては考えないんですね。 「適当に選んで」 ってのが実装になっちゃうので、 その実装は色々考えられちゃうわけですが。
実装を差し替える必要がなければ多態化する必要はないだろう… それにこれは静的メソッドでファクトリを実装することの問題点であって、 インターフェイスのメンバでファクトリを実装することによる問題じゃない。
>>199 マージされるのかな?
ワクワクしてきた
インターフェースの静的メンバでファクトリを実装する問題だよね? 「インターフェースのメンバでファクトリを実装する問題」であるなら、 インスタンスが知っている情報に基づいてファクトリが動くべきで、 普通は、インスタンスの型と同じ型のまっさらなインスタンスができるか、 インスタンスのコピーかそれに毛が生えたようなものができるかってとこでしょう。 多態化しなきゃよいっていうなら、 素直に SingableFactory クラス作ればよいって返すだけなんだけど。 interface Singable に static なファクトリ乗っけても 後で多態化が必要だとわかった時に後悔するだけだ。
>>230 インターフェースの静的メンバでファクトリを実装する問題であるのは確かだけど、
問題になってるのはインターフェイスだからではなくて静的メンバだからでしょう。
ファクトリを多態化できないという同じ問題は、
抽象クラスの静的メンバでファクトリを実装したときにも起こりうるよね。
でも、それでも実用上問題にならないことはあるんじゃないかな。
名前から一意にクラスが決まる場合とか。
「実用上問題にならない」という考え方で設計するなら、 どんなスパゲッティコードでも動けばオッケーってことになりますよ。 (実際そういうなんちゃってオブジェクト指向で悩まされるんだ…) 「インターフェースは実装を一切知らないってのがミソ」 ということが分かっている人なら、 インターフェースに実装を置こうなんて絶対思わんでしょう。
だから実装を知らなくても実装の一個を返すことぐらいできるよ
インターフェースに static 実装をおかないことの利点って何? そんなことやったこと無いけど、こうして議論になってるから 考えてみた。で、わからん。 あと、Java で常々思ってたけど、 インターフェースには DBC みたいなことを書けないんだよね。 それが書けるとうれしいんじゃないかなーとか。 どうおもう?
>>235 そんな、ツンデレなウォルター嫌だ
でも、そんな感じの話が書いてあった
FreeBSDみたいな事にはなって欲しくないし正しい選択だと思うよ
>>235 ヲルさんはいい人だというのがわかったw
意訳ありがとう
ReactOSはソースの潔白の検証で進行が止まってるしな
class
>>178-224 :「インターフェースは静的関数を持てるのか」
{
}
僕の方がOO理解してるんだいって主張は他でやってくれんか?
241 :
185 :2008/08/16(土) 10:22:34
unzipとかtarとかを拡張子から選び出して実行する、単純なフロントエンドを作ろうと思ったわけですよ。 対応フォーマットを追加したければ、Extractorを増やしてExtractorsに追加するだけ、みたいな。 Extractorsは可変長テンプレート引数にしたほうがいいかも。 class ExtractorCreator{ alias TypeTuple!(TarExtractor, UnzipExtractor, LhaExtractor) Extractors; Extractor create(Path archiveFile){ foreach(ExtractorType; Extractors){ if(ExtractorType.isSupport(archiveFile)){ return new ExtractorType(); } throw new UnsupportedArchiveTypeException(); } } class Extractor{ static string[] SupportSuffixes(); static bool isSupport(Path archiveFile){ return SupportedSuffixes.contains(archiveFile.suffix); } void extract(string archiveFile); } class TarExtractor{ static override string[] SupportSuffixes(){ return [".tar", ".tar.gz"]; } override void extract(string archiveFile){ exec("tar xf " ~ archiveFile); } } ... 略 派生クラスに対して「自身のメタ情報を表明せよ」って強制できれば、いい感じに書けないかなぁって。
>>240 適当なキャラ付けで他人を小馬鹿にして興奮するオナニーも他でやってね。
中二病の子までDやるのか、最近は。
要は、シングルトンだから new しなくてもいいじゃんくらいの意味なんだよな。
命名規則の欠陥だと思う。以下のコード見たとき強くそう思ったけど、それに似ている気がする。 class FooError:Error{ this(string message){super(message);} static class XXX:FooError{ } static class YYY:FooError{ } } throw new FooError.XXX();
単純に static の意味が分かってないとみた。
D言語のstaticは単なる名前空間の代わり。 class test{ extern(C++) static int x(){return 10;} } はC++の namespace test{ int x(){return 10;} } と同等。
>>241 僕は*Extractorを別ファイルにしやすいこっち派
class ExtractorCreator{
static Extractor[] es;
static void addExtractor(Extractor e){es ~= e;}
static Extractor create(Path archiveFile){
foreach(e; es)if(e.isSupport(archiveFile))return e;
throw new UnsupportedArchiveTypeException;
}
}
class Extractor{
abstract string[] SupportedSuffixes();
bool isSupport(Path archiveFile){ return SupportedSuffixes().contains(archiveFile.suffix); }
abstract void extract(string archiveFile);
}
class TarExtractor : Extractor{
static this(){ ExtractorCreator.addExtractor(new TarExtractor); }
override string[] SupportedSuffixes(){ return [".tar", ".tar.gz"]; }
override void extract(string archiveFile){ exec("tar xf " ~ archiveFile); }
}
class ZipExtractor : Extractor{
static this(){ ExtractorCreator.addExtractor(new ZipExtractor); }
override string[] SupportedSuffixes(){ return [".zip"]; }
override void extract(string archiveFile){ exec("unzip " ~ archiveFile); }
}
void main(){
string file = "hoge.tar";
Extractor e = ExtractorCreator.create(new Path(file));
e.extract(file);
}
string file= "kubo.tar";
お産の最中に仮想化できると思う方がきっとおかしいんでしょう。
252 :
250 :2008/08/17(日) 01:33:43
テンプレートパラメータに対してクラスを限定できるんだから、
せめてその時は実行時じゃなくてコンパイル時にもポリモーフィズムが利用できていいはず。
オブジェクトがクラスに、普通のメソッドがstaticメソッドに、
メソッド呼び出しがテンプレートのインスタンス化に置き換わる感じ。
>>234 むしろインターフェースにこそ契約書きたいよね
>>253 なんというクソゲー
全部見てしまった
俺の時間を返せw
>>156 アップキャストもチェック入りダイナミックキャストでした
>>259 たんにbodyがなければいいんじゃね?
in, out の DbC が書けるのはよさげだね。これには賛成。 デバッグコンパイルするとラッパクラスがこっそりできることになるんだろうね。
263 :
デフォルトの名無しさん :2008/08/18(月) 17:38:45
Code:Blocks+ddbgの動かし方が良く分からん ブレークポイントを置いてるのに引っかからないでこうなる Starting debugger: done Debugger finished with status 1
数ヶ月前にやった記憶だとnighty buildじゃないとダメなんだっけ?
ところで、tangoのD2.0のやつ、更新されてたから使ってみようかと思ったんだけど、 コンパイルできない…どうやったらコンパイルできるんだ?これ。 Windows Vista 64bit SP1, dmd2.018, tango r3889, dsss 0.75 この環境で XXX\dmd\import\tango>dsss build ってやってみたけどコンパイルできず。 tango\sys\win32\Types.di(288): template instance _PCHAR!("ServicesActive") does not match template declaration _PCHAR(char[] a) とか出る。ちょっといじってこれが通るようになってもほかのところでエラー出たりdmd死んだり… もしかしてこれってまだコンパイルできる段階じゃないのかな?
266 :
263 :2008/08/19(火) 10:26:33
なんだかPoseidonの最新版が良い感じになってたからこっち使ってみるわ D言語普及のために詳しい使い方でもHPに書いてみるか
>>263 PoseidonのDebuggerにddbg使えた?なんかうまくいかん
Ddbg 0.11.3 beta - D Debugger
ごめんposeidonが古かったみたい
Descentのアップデートはまだか
nightlyあるんじゃなかったっけ。
ああ、リポジトリ自体に更新ないのか
Poseidon日本語のフォント使えない…? やっぱWinのAPIたたくときにマルチバイトを考慮していないのが原因なのかな…
>>273 使えるぞ?
MSゴシックを選択して文字セット欧文のままってオチじゃないよな?
275 :
273 :2008/08/20(水) 14:42:00
文字セットってのがよくわからないけど、とりあえずツール>オプション>エディタ>デフォルト スタイルのフォントを MS ゴシックにしただけだと等幅にならない… マルチバイト文字の混じらないFixedSysとか指定するとうまく等幅になるっぽいけど。 他になんか設定する必要があるのか?
276 :
デフォルトの名無しさん :2008/08/20(水) 15:51:36
なんてこった、今気づいた キーワードで太字になると等幅が崩れるみたいだから、太字を切ってみたらうまくいった
typedef int myint = -1; void main() { writeln(typeid(typeof(myint.max))); } typedef型のmax/minが元の型になってしまうんだけど、 仕様的にはどうなのかなあ。
>277 それはおかしいんじゃないか
typedefで新しい型に新しいmin、maxとか設定できてついでにinvariantみたいにチェックしてくれる機能マダー?
ここ読んでいる人は、いつもC++を使っている人が多いと思うんだけど、 D言語使っているとC++とごっちゃになって困ったりしない? 自分はしばらく使っていると、細かいところでよく間違えるんだけど、 みんな問題ないのかな?
class A{};セミコロンとかはあるある
関数の引数にauto使えないのかなあ。 いちいち、 auto twice(T)(T x) { return x*2; } と書かなくても、 auto twice(auto x) { return x*2; } と書けたらいいのに。 あと、ラムダ式もほしい auto twice = (int x) => x * 2; さらに、ジェネリックラムダ式とか… auto twice = (T)(T x) => x * 2; auto twice = (auto x) => x * 2; auto twice = x => x * 2;
>>282 それは構文上問題ないからいいだろw
auto var = Foo(arg1, arg2);
とか書いて怒られるのはよくある
でnewつける
C++に戻ると、クラスや構造体のフィールドの定義で初期化を書いて怒られる
>>284 template OpCallConstructor() {
static typeof(this) opCall(Args)(Args args) {
return new typeof(this)(args);
}
}
>>285 (Args)は(Args...)にしとくべきだな
>>285 mixinが必要なのがちょっと面倒だな。
勝手にインジェクションするようなテンプレートは書けるだろうか?
>>283 auto twice = (int x){return x * 2;};
alias std.functional.unaryFun!("a*2") twice;
まあ、後者はクロージャじゃないし色々使いにくいけども…
double a = 3.14; writef("%f %1.2f",a,a); 結果: 0 3.14 これってバグ?仕様?(gdc 0.24 mingw)
D言語、さすがにもうまとまってきた感がある・・・ 「ヲルさん!うは!まじかよ!またコンパイル通らねぇww」 あの感覚はもう味わえないのかな
D1.0+tangoとかが狙い目。Tangoはまだ仕様が安定してない。 最近も、Path周りでコンパイルは通るけど実行時にエラーをはきまくるという惨事が体験できた。 いつになったら1.0が出るのか…いつになったらD2.0に対応するのか…wktkが止まらない。
マゾ的にはなかなか苦痛がやってこない放置プレイもまた快感。
俺はマゾヒストじゃないからいい加減まちくたびれたお
いまのところ、D には画像を扱うための 標準的な方法はなっしんぐ?
DMagickでも作っておくれ
そろそろ標準ライブラリの整備始まれー
dfl rev72 + dmd 2.018 で動作を確認
次のネタがくるまで標準に何を求めるのか列挙していこうぜ。
・繰り返し行われる破壊的変更
>>295 一応手元にpngを読み書き編集表示(要opengl)(パレット利用不可)するライブラリがあるが、
これでは使い勝手が悪いのでなんとも。
ほかのも読めるようにしたいが、自分では使わんので放置してるなあ。
なんか標準的に使えるものをコミットしたいが……
そろそろD3.0が登場しそうな気がしてきた。
そうなったら(SM的な意味で)信者歓喜だな
最新verが欲しくてgdc(Rev.243)をビルドしてみたんだが、 ビルドしてインストールしたものを使うと object.d: module object cannot read file 'object.d' とか言われてしまう。 cc1dをsourceforgeの0.24で置き換えると普通に動くのだが、 どうやらcc1dがコンパイラ本体らしいので意味がない・・・ この辺はまだまだ十分マゾいと思った。
なんでfunction型って、delegate型に暗黙変換できないの?
>>306 引数の型が同じでも、delegateのほうが余分に一つ引数を取るからじゃないかな。
周囲の環境には触れないだけなら、 フレームポインタをnullにすればいいだけなんじゃ… ---- import std.stdio; void main(){ static int func(int a, int b){return a+b+1;}; int delegate(int,int) dg; // いちいちこうやらないと突っ込めないのが面倒… // dg = &func; これで通れば関数の引数とかもっと楽になるのに… dg = (int a, int b){return func(a,b);}; writef(dg(2,5)); } ---- って思ってよく見てみたら、 今後の方向性: 関数ポインタとdelegateの構文を共通にして、 相互に互換性を持たせる予定です。 ってのがあるのな。早くやってほしいな。
>>308 フレームポインタ/thisポインタは一番前だから、そういうわけには行かない
toDelegateで過去ログを検索しる
binding win32apiでSwitchToFiberを使おうと思ったのだが、static if(_WIN32_WINDOWS >= 0x410) となっていてSwitchToFiberがバイパスされる。const _WIN32_WINDOWS = 0x410とすればいけるはずだか これはどこに記述すればいいの。自分の作ったファイルだとmoduleが違うので効果無かった。
>>311 version=WindowsXP
ってコンパイラスイッチで指定すればOKなはず。
>>303 それでもいいや
D3 is written by D2 って感じでさ
熱い更新が欲しい
やっとgdc(mingw vista)がビルドできた。 2ヶ月くらいかかった。 罠が多すぎる・・・
やり方を教えてくれるととても助かる
317 :
315 :2008/08/27(水) 00:48:42
基本は一応gdc同梱のマニュアル通り。 ポイントが多すぎて一々全部覚えていないので、 覚えているものをいくつか。記憶違いがあったらすまん。 ・インストーラ版のmsysを使うとうまくビルドできない(vista特有?)ので1.0.11のファイルを全て落として手動インストール ・m4、automakeは最新のものをソースからビルド。sourceforgeのものを使ったところ謎のエラー。 ・gcc-4.1.2、gdc(Rev.243)の組み合わせでうまくいった。他のバージョンは不明。 ・../configure --prefix=c:/msys/gdc --disable-shared --enable-languages=c,d --host=mingw32 --target=mingw32 --with-gnu-ld --with-gnu-as --enable-threads --disable-nls --disable-win32-registry --disable-shared --enable-sjlj-exceptions ・--prefixはwindows風のパスを与えないと、ビルド後にphobosが見つけられない不良品になる ・ビルドフォルダ/gcc/Makefile中のORIGINAL_LD_FOR_TARGETがおかしくエラーで止まるので"ld"に修正 ・printf("%n")がダメらしく(vista特有)無限ループに陥るのでgcc/genmodes.cを修正。放っておくとディスクを食い尽くすので注意 ・com.dのComObjectで謎のエラーが出るが、コンパイルオプション-O2を消すと通る
ありがとう!俺も色々試してみるわ
gdcのメンテナになるべき
更新まーだー?
gdc が D ver.2 対応になっていれば移行できるんだけどなぁ… gdc のソース読むしかないのか。
gdcのsvn、D 2に対応してるよ
おぉ・・・まじだすげぇ 重いDescentよりも軽いPoseidonのほうに期待している俺としては朗報だ…
元々日本語ファイルあったじゃん 完全日本語になったというわけでもないし
327 :
デフォルトの名無しさん :2008/08/28(木) 20:47:40
Descentってなんかぬるぽ発生して落ちるんだけど Poseidon最新版はいいね
そんなことより聞いてください。 今日、職場で破壊的な仕様変更があったんです。 この一年の仕事が全てダメになるようなそんな変更。 当然、みんな怒りました。 誰の口からも出るのは愚痴、愚痴、愚痴。 でも、俺には そいつにうぉるたんが降臨したんだ、うぉるたん、ラブ!(・∀・) って思えたんだ。 こんな心に余裕のある人間にしてくれてありがとう、D言語
降臨っていうか、そいつうぉるたんじゃね?
>>328 そのプロジェクトは俺の生活インフラに関係ないと信じたい
>>328 俺はまだコードを書いていていいんだ!
気に入らないところを直すチャンスだ!
と考えたらいいとかなんとか乙
Dも本来はメンテナンスの容易さを意図してるのになw まあ破壊的変更がなくなるほど自コードのメンテナンスも必要なくなっていく…… pureマダー?
をるたんはとっととscope周りのバグを直すべき
ここでmacroとかきたら面白いと思う
スライドで全く触れられていない機能が突然搭載されるとかでもいいな
ここで唐突にAOP
AOPはないわ・・・
じゃ、Hibernate で
phobos用のコレクションライブラリ作るっていってた奴どこいっちゃったんだよ
gdc使ってるとcore吐いてばっかりで、でかいプロジェクトを支えるものには 到底なりえないと感じる。あんまり使われてないのかなぁ。
ククク、dmdならcore吐かないなどと思ったか……
Access violation. の度に鬱々としてくるぜ。
void main() { auto x = { asm { nop; } }; } デリゲートリテラルのなかにasm書いたらDMDが落ちる… auto x = delegate(){ asm { nop; } }; //もダメ。 auto x = delegate void(){ asm { nop; } }; //こっちは大丈夫 ついで、 auto x ={ asm {} }; //はなぜかシンタックスエラー
getMembersマダー
allMembersみたいな?
windows bindings って、なんだかコントロールとかのあたりにかなり抜けがあるね・・・ 単純にリストビュー使いたいだけなのに、 自分で定義してやらないといけない構造体とかが けっこうあるわ
dflのイメージリストがリストビューだけってなんでよ。 絶望した。
dflのイメージリストはリストビューだけでしか使えないってことか?
ようやく構造体のコンストラクタ来るみたいだね
どこ情報だよ
だれかstd.openrjの使い方を教えてくれ
353 :
デフォルトの名無しさん :2008/09/01(月) 22:38:21
やっとglutがまともに動いた OMFやらimplibの罠やら勘弁してくれ
>>354 そんなとこでも更新チェックできるんだな
-profileで作成されるログファイルのシンボル名をデマングルした状態で出力する方法ってありますか?
std.demangle使って自分で変換プログラムを書く
1.035 & 2.019 きたー
New/Changed Features * Added struct constructors. * Special member functions _ctor, _dtor, etc., now have two leading _ in order to not conflict with the user identifier space. Bugs Fixed * Bugzilla 1322: foreach bypasses invariant * Bugzilla 1615: inout is allowed in foreach of string literal * Bugzilla 1627: ICE with a method called _ctor * Bugzilla 1633: Nonsensical "C style cast illegal" message with !is * Bugzilla 1771: dmd fails to execute on linux * Bugzilla 1773: excessively long integer literal * Bugzilla 1785: Mixing in an incorrect array literal causes infinite loop. * Bugzilla 2176: Assertion failure: 'sz == es2->sz' on line 1339 in file 'constfold.c' (concatenating strings of different types) * Bugzilla 2183: Bad formatting in std.c.stdlib * Bugzilla 2190: toHash documentation is deprecated [D2.0] * Bugzilla 2232: DMD generates invalid code when an object file is compiled -inline * Bugzilla 2241: DMD abort * Bugzilla 2243: const bool = is(function literal), badly miscast * Bugzilla 2262: -inline breaks -lib library * Bugzilla 2286: movmskpd compiled incorrectly * Bugzilla 2287: std.conv should accept structs defining toString * Bugzilla 2289: Stack overflow on very large BigInt to string. * Bugzilla 2308: CTFE crash on foreach over nonexistent variable * Bugzilla 2311: Static destructors in templates are never run * Bugzilla 2314: Crash on anonymous class variable instantiation * Bugzilla 2316: std.file docs are out of date * Bugzilla 2317: asm offsetof generates: Internal error: ../ztc/cod3.c 2651
イマイチだな。また一ヶ月まちか…
C/C++は魔物だ。偏在するすべての言語がC/C++に返っていく。 原題はLispだったと思うけど。
これで struct に interface が適応できるようになったら class 使わなくても何とかなるんじゃね? 継承には opDot を使うとか。
struct ctorできたらstatic opCallいらんよね?
確認してないけど、これでやっとコンテナがまともに作れるわ
>>365 struct S {
private int x;
this(int x) {
writeln("S.__ctor");
this.x = x;
}
static S opCall(int x) {
writeln("S.opCall");
S s;
s.x = x;
return s;
}
}
void main(){
S s = 100; // (1) S.opCall
s = S(200); // (2) S.__ctor
s = *new S(300); // (3) S.__ctor
}
たぶんバグだが、opCallを定義しないと(1)で100が迷子になる。
というわけで、当面は構造体に static typeof(*this) opCall(Args...)(Args args) { return typeof(*this)(args); } とか書いとくといいと思う。
それって無限ループにはならないの?
>>370 S(...)ではコンストラクタが優先して呼ばれるようになった。
コンストラクタが一つも定義されてなければopCall、
opCallも定義されてなければ構造体リテラル、になる。
tango.io.Conduit -> tango.io.device.Conduit (trunk) 他の Conduit 系も移動するようです。Mango の trunk にも反映済。 さすが Tango、俺らの期待を裏切らない破壊的な変更だぜ。
参照さえあれば、俺はC++地獄から解放されるというのに…!
デストラクタでメンバのオブジェクトをdeleteしたい… C++に慣れてしまった俺にはGCは刺激が強すぎるお
>>378 scopeはメンバ変数には使えないんじゃないか?
scopeクラスのscopeフィールドをコンストラクタのscope引数で初期化できるようにしてくれるよう、をるたんに頼むしかない。
そういえば、scopeグローバル変数のデストラクタも呼ばれないな。
なぜかコンパイル通らんと思ったらsharedが予約語になってた。
2.018から、リンカが落ちてビルドできないバグが出るようになったんだが、2.019でも直ってないな。 気長に待つしかないか。 ライブラリをビルド(dmd -libでビルド)したときにライブラリ内に作られると思われるシンボルの依存関係の記述が、どうやら壊れてしまうみたい。 ライブラリの他の所で使われてはいるが主プログラムからは使われて無いシンボルが、「使われてないシンボルはリンクしない」というリンカの機能で消えちゃう。 そうすると、リンカが落ちると。
sharedに期待
何をsharedするんだ?やっぱマルチスレッド関係かな?
デストラクタの時点で、メンバへの参照が既に無効なんだっけ?
>>386 イエス。
ただし、手動でdeleteした場合や、scope変数のスコープアウトで開放された場合を除く。
>>383 俺も似たような状態だな。
その推定は向こうでも議論されてるの?今自分で探してみたけど見つからなかった。
リンカがクラッシュするという深刻度の高いバグという気がするので議論されてると思ったのだが。
>>387 なんでだろ。デストラクタで参照残ってると、なんか不都合があったっけ?
>>389 たとえば、二つのオブジェクトがお互いをメンバに持っている場合、
ガーベジコレクタはどっちかを先に解放しないといけない。
すると、後に開放された方のメンバは無効だよね。
Dって弱参照はないんだっけ?
392 :
383 :2008/09/06(土) 16:32:03
>>388 議論は無いみたい。
だからバグレポでも挙げようと、バグが出る最小のコードを見出そうといろいろいじくってみたんだけど、なんか落ちたり落ちなかったりが微妙で、よく分からなかった。
結果分かったのは、383の推定は間違ってるということだけ。
応急処置としていじくったときに、落ちなくなった様子から383の推定をしたんだけど、原因は別にあるみたい。
コードを削って落ちる原因となっている所を見つけても、該当部分を取り出して別個にビルドしてみると落ちなかったりして、原因は分からず。
また変なバグでてるよ… struct S(bool b) if(b) { } struct S(bool b) if(!b) { } void main(){ S!(true) s = S!(false)(); }
>>393 すげぇな・・・これがDか
まったくわからん・・・
395 :
393 :2008/09/06(土) 19:30:18
や、これもコンパイル通っちゃうよ… をるたん助けて struct S { } struct T { } void main(){ S s = T(); }
typedef int myint; void main(){ myint x = 1; } 構造体型・整数型の変数の初期化子が他の構造体型・整数型の値を受け入れてしまうバグのようだ
しばらく見ないうちにC++を超えたな カオス度が
>>393 なんじゃこりゃw
これどういう構文なの?久々に来たからさっぱり分からん
>>397 完成してなおカオス度が増してるC++よりはマシじゃね?
そのうちEffective DとMore Effective Dを読みこなしてからでないと コーディングがはじめられないことになるんだろうか。まぁ、マイナーなうちは 後方互換捨てて言語のほうを直して対処されるだろうから今から気にしてても 仕方ないのだろうけど。
Cとの互換性も捨ててしまえば色々綺麗になりそうなもんなんだがな
互換性捨てすぎてPythonとかHaskellみたいな文法になったりってことはさすがにないか
Dはこのままメジャーバージョンアップする度に 互換性をまるっと捨てた方が色々実験できて良いと思う
次回バージョンはD 3000だな
破壊的変更まだー?
二重比較演算子 if (0 < x < 100) とか付いちゃったりしてな
たまにたまらなく欲しいな二重比較。
>>400 ,402,405
Mの多さに吹いた。
x in 1..100で
408 :
406 :2008/09/06(土) 22:56:23
安価ミスw 最後は
>>404 ゴメンね、M扱いしちゃってゴメンね。
>>401 何でもかんでも最終的には構文木になって、LISPになっちゃうんだけどね。
いいえ、Adaです
>>409 構文木があればlispというのは極論すぎ。
使用者から構文木が完全に隠されてる言語では構文木は本質じゃない。
デリゲートリテラルを使って継続渡しスタイル!
コンパイル時C++コンパイラ
比較演算子がもっと進化してこうなるとか if( x*s-4*x-5 > 0 )
>>414 sってなんだ?
ラプラス変換された微分方程式でも扱えるようになるのか?w
>>414 は、数式の値域が判断できないかなって言ったんじゃないのかな?
f(x) = x*x-4*x-5 {x|x∈R}
としたときf(x)の取りうるすべての値が0以上であるかどうか、という意味で。
Mathematicaみたいに数式処理をサポートしない限り無理かと思うが
>>420 >数式処理
expression templateで木を作っちゃえばなんとかなるんじゃね?
C++だと全部パターンマッチでやる必要があってむちゃくちゃ苦行だが、
Dなら比較的実用的なものも可能そう。
廃止きたww
いやっほーーーーーーーーーー
ますます参照が欲しくなるな
rangeとiteratorは後付だし、なおざりっぽさ漂ってたからな−。 C++寄りの人間としては嬉しい。うん、廃止も、お前らと同じ一人のマゾとして嬉しいよ!
>426 422のリンク先に > There are also a few bugs in the compiler and > some needed language enhancements (e.g. returning a reference from a > function); Walter is committed to implement them. とあるから、関数が参照を返せるようにはなる。
バージョン2が出てバージョン1が完成したように、 バージョン3相当の様変わりをしたときにバージョン2は完成するんだろうな。 まだまだワクワクが止まらないぜ!
Dこそが100年後の言語
dmd1 dmd2 dmd3 dmd4 ... というようにバージョン分けで派閥が生まれたりしてな
LISPと同じ道をたどると予言してみる
うぉるたんがヒゲを伸ばせばすべて解決する
>>432 Dの場合、いろいろ拡張加えて滅茶苦茶にしてるのが原作者だから手に負えない
D++へのフラグが立ったな
て言うかみんなはメチャクチャになってるって認識なの? 俺はそんなでもないと思うんだが・・・
>>435 そしてD#や並列処理に特化したParallel-Dなどが生まれるんですよね
滅茶苦茶にしてるっていうか 滅茶苦茶やってるって感じ D自体はいい方向に進んでるんじゃない?
opApplyが廃止されるだけでforeachは存続?
そのうちerlangやscalaに対抗しますとか言い出すな
>>424 最近そういう系の機能(mixin?)について感じるのだけど、
ソースコードを文字列として切り貼りするのって、確かに強力だけど何かヤだなぁ……
無理やりなハックがまかり通って、誰にも読めないコードが氾濫しそうというか、実も蓋もなさすぎる感じ。
そこにせっかくコードが書かれてるのに、IDEも色分けとかしてくれなさそうだし。
適用範囲をシンボル名あたりだけに限定しても、シンプルかつ十分なんじゃなかろーか。
template mixinじゃなくてほんとにmixinを使うべき場面って、
「クラスを使う側がプロパティの名前を決められる」とかくらいしか思いつかない。
もはやコンパイル時evalとでもいうか。乱用したら危険だけど、 railsみたいなすごいのを生んでくれる可能性も・・・。
Javaはバイトコード(オブジェクトファイル)すら、動的に書き換えたりするけどね。 でもD言語はシンプルにC++の欠点を排除しただけの、 ネイティブ実行可能コードを吐いてくれる言語であって欲しい。
言語レベルでmixinなりimportなりできるのもいいけど、エディタレベルで、 参照してる他のモジュールやクラスの関数やメンバの定義をiframe的インターフェイスで編集したい。 -- file1.d int func(int x){ return x*2; } ってあったら -- file2.d import file1; void main(){ int n = 10; printf("%d\n", func(int x: n){ return x*2; }); } って表示できて、file2.d内でfuncの定義を書き換えるとfile1.dの中身も書き換えてくれる、って感じの。 (ファイルが実際に書き換わるんであって、file2.d内だけで定義上書きとかではなし)
>>439 opApplyのままかどうかは分からんが、
おそらく内部イテレータが廃止されることはないだろう。
opApplyはなんかdelegateとかつかっててオーバーヘッド大きそうな気がしていた。 特に繰り返しってなると小さいことでも大きく出そうだからなぁ… 実際計測とかはしたことないけど。
今回の件は内部イテレータと外部イテレータを統一的な構文で扱えるようにするのが目的なんじゃないのかなあ。
ジェネレータてなんなの
Pythonのジェネレータなのかな。
>>424 の例はフィボナッチ数列……? 実装されたとしてこれってどう動くの?
>>448 opApplyが正にジェネレータな気がするんだが
>>451 砂糖がかかってなくて構文こそ無骨だけど、
実質はPythonのジェネレータやC#のEnumeratorと同じだよね。
opApplyはpythonよりrubyに近い希ガス 実行途中で止めてまた再開とかできないし
> auto fib = generate!("a[0] + a[1]")(1, 1); int i = fib(); こうしたらフィボナッチ数列の値が呼び出す度に順に得られるのかな 無限リストとか本当の遅延評価とかそんなもん? generate!()を作ってみようとしてめんどくさくなってやめたw
auto generate(alias F, T)(const(T)[] a...) { auto i = a.length; return new class { T opCall() { if(i) { return a[$ - (i--)]; } else { auto val = std.functional.unaryFun!(F)(a); a = val ~ a; return val; } } }; }
よく考えたら匿名クラスにする必要はなかった auto generate(alias F, T)(const(T)[] a...) { auto i = a.length; return { if(i) { return a[$ - (i--)]; } else { auto val = std.functional.unaryFun!(F)(a); a = val ~ a; return val; } }; }
なんだ!D言語って!!
多少の無駄は気にせずこう書いたほうがエレガントで好き。 auto generate(alias F,T)(const(T)[]a...){ return{ scope(exit)a = a[1..$] ~ std.functional.unaryFun!(F)(a); return a[0]; }; }
459 :
454 :2008/09/11(木) 01:51:06
>>458 なるほど!
returnの後に処理したかった
そうすればいいんだな
ngのrangeに関するスレッド長すぎて読むの辛い…
>461 メソッド名をどうするかの議論が多いね。 典型的なbikeshedだと思うw
フィボナッチ数列って0から始まるんじゃなくてよかったのか
どっちでもいいんじゃね。一緒だし
tangoにstring型ないの?
>>465 ない。普通にchar[]使っておけばいいよ。
467 :
デフォルトの名無しさん :2008/09/12(金) 12:00:24
中国でalexaは人気だったはず ツールバー入れてる人も多いんじゃないかな まあ、調べ物してると中国のサイトがヒットすることが多いから日本よりは関心強いんだろうけど
「D言語?C++0x最強に決まってんだろwww」って言われたときのためのコピペ作ろうぜw
C++0xが最強だと思っているなら、C++0x最強を使えばよい。 荒れるだけなので敢えて張り合う必要はない。
C++0xスレはベテランプログラマがワイワイやってる印象がある しょーもない煽りは効かないんじゃね
C++0xスレに煽りに行くとかいう話じゃないと思うが
>>475 バーの考え方って何?
yellowは右の図の色だと思う(別にメソッドとかを表しているわけじゃないかと)
>>475 yellow は、NOTE に書いてあるように、
そもそもメソッドを提供すべきか、だとするとどういう名前をつけたらいいのか
という話だよね。
r と s の領域 and だから単純に r.and(s) でいいような気がするんだけど、
そういうもんでもないのか?
それより、head-toe より、head-tail じゃねーのとか思うんだけどなぁ。
いや、まぁ、言葉がちょっと違うとかどーでもいいレベルなんだけどさ。
479 :
475 :2008/09/13(土) 08:44:17
>>477 rangeをrとsとそれらの論理演算で扱うbefore-and-after conceptという考え方って新しいのかなと
yellowが右のバーの色なのはわかるんだけどなんでyellowだけyellowなのかと
>>478 メソッド名や提供するかどうか自体を決めかねてるからか
head-tailの方がよく聞くっちゃ聞くように思うな
function型にdelegateとかopCallを定義したオブジェクトとか渡せない? functionとdelegateとopCall可能オブジェクトを一緒くたに受け取る方法とかない?
auto call(Func, Args...)(Func func, Args args) { return func(args); }
>>481 コンパイラがassertionfailureでしにやがる…
全部デリゲートにするしかないかな?
>>483 boost::functionみたいな方法もあるけど、多分デリゲートのがいい
>>481 ReturnType!(Func) call(Func, Args...)(Func func, Args args) {
return func(args);
}
これなら落ちないのにねぇ。まったくDって子は…
そこが可愛いんですけどねウフフ だがマスコットキャラ、テメーはダメだ
同感w
488 :
475 :2008/09/14(日) 11:48:54
ただデリゲートにするとオブジェクト作りまくることになって遅くない?
あれ?戻り値がvoidの関数でもreturnに渡して良かったんだ 最初からそうだっけ import std.stdio,std.traits; ReturnType!(F) call(F,TL...)(F f,TL args){return f(args);} void foo(){} class A{void bar(){}} class B{void opCall(){}} int buz(){return 1;} void main(){ call(&foo); call(&(new A).bar); call(new B); writefln(call(&buz)); }
>>488 オブジェクト作るのは避けられないと思うよ
std.variantみたいに解決できるかもしれないけどよくわからん
>>489 void a(){}
void b(){
return a();
}
こういうこと?
>490 そうそう ・・・もしかしてC/C++からそうだったりする?
>>490 初期の頃はわからないけど普通にできたはずだよ
493 :
492 :2008/09/14(日) 12:35:12
>>491 Cでは未定義。
C++98ではvoid型の式に限りreturnに書ける。
SDL じゃなくて、Direct3D を使って 画像ファイルを読み込んで表示・・・ するだけでなんだかえらくしんどいのだけど これって仕様?
それは修業が足りないだけ。 DirectX SDKのポーティングでもして鍛えてきてください。
仕様。初期化も2D描画も面倒なのでちょっとしたプログラムなら ラッパーライブラリが使われることが多い。
native Direct3Dとかめんどくさすぎて触る気になれん俺
結局汎用的に使えるsdlがいいんだな
だれかNGのrangeに関する議論を要約してくれ…
D言語の本ってどこで買えますか?覚えてみたい。
言っとくが、ずっと前に出たD言語の本は今となってはあまり役に立たんからな
大きい本屋のプログラミング棚の一番下とかで買えるけど、内容は完全にout-of-dateだよ。 有限会社オングス「D言語パーフェクトガイド―Windows Linux FreeBSD対応」技術評論社、2004、ISBN 978-4774122083 最近出たの(半年以上たったからもうかなり変わってるけど): Kris Macleod Bell, Lars Ivar Igesund, Sean Kelly, Michael Parker "Learn to Tango with D," Apress, 2008, ISBN 978-1590599600
2004年じゃもう予約語レベルで違うんじゃね?w v2と比べたら既に別の言語だよなあ。 入門者はテンプレに幾つかリンクあるから参考にすればいいと思う。C/C++orJava辺り経験があれば問題ないはず。 プログラミング自体の入門者向け文書で古くなってないのは、Hの人のしかないのかな。
505 :
デフォルトの名無しさん :2008/09/15(月) 02:30:51
これいいわよ www.kmonos.net/alang/d/d-jp080911.chm
D言語パーフェクトガイドってどの辺が古い? 自分はこれで入って未だにこれ以上の知識はないが、 今のところ普通にコンパイルできてたりする・・・。 スレの話題がさっぱりわからなくて困るというのはあるけど。
D言語パーフェクトガイド読んでないから分からないけど 恐らく今だともっとDっぽい書き方がある気がする
あぁ快感だな 「Dっぽい書き方」とか
DっぽいHello WorldとかDっぽいFizzBuzzとかあるんかい
>>506 boolがbitのaliasだったり、
.sizeofを.sizeって書いてり、
===がまだ使われてたような頃じゃないの?
511 :
デフォルトの名無しさん :2008/09/15(月) 10:46:33
D言語パーフェクトガイドはかなり最初の方のサンプルコードがDMD2.0でコンパイルが通らない char[] hoge = "hoge"; これで小一時間詰まったのは良い思い出 現在だと公式の言語仕様ページを見るしかない C言語の知識が必要だが まあD言語に手を出す変態なんてC++とか余裕ですよね!
そもそも、std.stream.stdoutを使ってるからHelloworldのサンプルも動かない。
その更新は俺にも分かるいい更新だったな
>>414 遅レスだけどoptimizerレベルの問題じゃね?
C#みたいにシンタックスツリーを値として取得できるようになれば、そのあたりは何とでもなるだろう。
>>512 もしかしてバージョン2とかじゃそれ使えない?今日入れてみたけどなんかどこ探してもstdoutが無かったんだ・・・
>>517 バージョン0の間に消されたから、バージョン1でも使えない。
まじすか。じゃあ標準出力のトレンドでも聞こうか
>>514 これこのスレの奴が作ってたやつ?
コンパイル時にとかすごすぎだよな…
どっちか std.stdio.writef*(); std.cstream.dout.writef*(); 俺は自作した奴使ってるけど
ほんとだ
まだ関数オブジェクトとかクロージャを展開してはくれんのか
>>514 くそ・・・!実用性など無いのに胸がときめく!俺も変態か・・・
適当にstd.stdio.writefln()使ってたけどdout使う方がいいかなー Stream継承してるし
俺も自作だなあ。phobosはstd.encodingを基にしたフィルタストリームを作るべきだよ。
>>514 コンパイル時にFizzBuzzとかマジで変態だな…
DにもC++のconst_castみたいな区分が導入されないかな。 const(char)*をconst(ubyte)*にキャストするときとか、ついついconst書き忘れる
530 :
デフォルトの名無しさん :2008/09/15(月) 23:59:16
お前ら便利そうなモジュール作ったらどんどん晒そうぜ
だめだ。資料無さ過ぎ仕様変わりすぎ。文字列に数字を連結するのすらできんかった。
文字列変換関連はものすごくカオスになってるよな
おまえら、ゲームとかテレビとか興味ないの? もしかして、一日24時間365日ずーっとD言語のこと研究してるのか?
>>533 バージョンアップしたときにざっといじるくらいだよ
あとは普段からD使ってるから
>>529 なんでただ検索しやすくするためだけにcastにしたんだろうな
>>531 //for D2
import std.conv;//to
void main(){
string s = "train";
s ~= to!(string)(999);
}
入出力はtx使ってる……のは、え、俺だけなのか? 自作がトレンド?
片方はkinaba氏だったりして
>>535 サンクス
数字連結するだけなのに気持ち悪いな・・・。なんかDってJavaほどでもないしC++程でもなくて
中途半端って感じだな。
C++も似たようなもんでしょ。 Boostのlexical_castって0xには入らないの?
こっちのほうがお好みか?w import std.string; void main(){ string s = "train" ~ .toString(999); }
ほら、記号と英字と数字の入り混じり方が最高に入力しづらくない?ベストはJavaみたいのだけど まぁ、個人の意見なんで、気にしないでください。 あれ?もしかして演算子のオーバーロードで解決できる?
JavaでいうStringやStringBuilderの他に 最近ではRopeって構造が着目されてるけど、 こういうのをファクトリで使い分け可能にしてくれんかな。
「もうropeとか死ねばいいのに」を思い出した。
~ とか & とか . とか色々と無意味な派閥が出来るのは望ましくないな。 "n = " + 1 + 2 とかやった時のわかり難さを解決しようってんだろうけど、 演算子増やされるくらいなら意識的に()で囲う方がマシ。
>>544 同じ演算子にしたらリストへの要素の結合とリストの要素への加算が区別できないだろ。
>>544 Dには配列に対するベクトル演算も実装されているから+で結合を表すと不自然なことになる
ああ ~ は、文字列結合じゃなくて配列結合なのか。
std.cstreamのdinをforeach使って foreach(ulong i, string line; din) ってやったんだけど、stringじゃなくてchar[]じゃないとだめだった。 std.streamのonApplyのExampleだとstringで良さそうなのに。 あと、std.cstreamのこれだとlineに改行文字は含まなくて、std.stdioの foreach (string line; lines(stdin)) ってやつだと改行文字含むんだよね。これは仕様をよく読めば間違わないんだけど。 ライブラリの更新計画はないんだろうか。Tangoで置き換えとかどうなったんだろ。
いつかばっさり修正する、ってのじゃなくて、 だんだんすりあわせしてくよ、って感じなのか。納得した。
dflでGUIだけど ポインタで落ちまくりなのがなんかはまる はまるって熱中するほうな
ライブラリってdsssで落とせるものはまず使えないのな。 svnで落としてきて、ビルドなり動作なりするリビジョンを探さないといけない。 もしかしてこのスレだと常識?
auto func(auto x) { return x * 2; } みたいに書ければいいのに。
>>556 これで十分だし、構文糖を追加するほどのものでも無いような。
auto func(T)(T x) {
return x * 2;
}
TangoのCircularListって名前おかしくない? これって循環リストっていうより双方向リストだよな?
>>558 V get (uint index)
ってメンバ関数あるでしょ?ランダムアクセスできるんだよ
実装は動的にサイズ拡張するリングバッファだと思うよ
560 :
559 :2008/09/18(木) 17:53:14
ってあるぇw O(n)ってなってるwww ランダムアクセスとか嘘ですごめんなさい
>>554 dflはかなり使い勝手いいんだけど、結構やばそうなところいろいろあるんだよね。
D&Dの挙動が怪しくて、テストでボンボンファイル放り込んでいたら落ちて、
放り込んだファイルが全部消えたことがあって、すげーあせったw
あとスクロールバーみたいなスライドさせるコントロールがないんだよね。
それに気が付かないで途中まで作って、今後の方針で悩み中w
544 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/19(金) 02:06:49 D言語って来ないの? みんなC++0xに行っちゃうの? 545 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/19(金) 02:28:58 VisualStudio並のIDEが出来たら行くよ 546 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/19(金) 04:04:49 GCを簡単に取り外す方法が用意できたら行くよ
D2.0の安定版とC++0xの実装とどっちが早く来るかのう
C++は複雑になりすぎてもう終わり
終わってんのはおまえの頭の方
IDE全部はいらんが、バックグランドコンパイルだけはちょっと欲しいな
IDEなんてゆとりだと思うんだが、使ってみると意外と便利なのかな?
道具を便利に使えるかどうかの一部は、使い手の力次第。 それこそ、ゆとりには便利に使えないかもね。
Emacsの作者でさえNetBeans使えって言ってるしな。 実際の所、IDEを使ってるとリファクタリングがかなり楽でいいよ。
IDEなんていらねと言うのは使いこなせるようになってからが筋というもの そもそもIDEがいるいらないじゃ全然わからんので 何それの機能がいるいらないという話になるべき
インテリセンスさえあれば後は何も要らない 統合デバッガはあれば嬉しい
このあたりがあって実装がまともなら、それのためにOSから揃えるかもしんない。 ・Emacs系の拡張にあるような地味に便利な類の豊富なテキスト編集機能 ・あるファイルの編集窓を別のファイル中に埋め込み編集できる機能 ・ファイルの違いを意識せずに任意のモジュールやクラスや関数を連結編集できる機能 ・日本語文字エンコード対応 ・HTMLのいわゆるWYSIWYGエディタさながらのDDoc変換閲覧サーバ機能 ・テキストのアンチエイリアス表示
>572 ・あるファイルの編集窓を別のファイル中に埋め込み編集できる機能 がイメージできないんだけど、どんな感じ?普通に分割ビューじゃなくて?
>>573 HTMLのiframeみたいな見た目で、かつ同一ビューのテキストとしてシームレスに編集できるような感じ。
インライン関数やインラインの無名クラスなんかをあとから別モジュールに切り出すときに、
こっちが構文の修正なんかしなくとも、IDEがその部分をiframeっぽい見た目に自動変換して
「インラインっぽいのに別モジュール!ふしぎ!」ってなことをうまい具合にやってくれると、
場当たりプログラミング的には楽になるんじゃないかなあと思って。
(その機能を当てにして、とりあえずインライン単一ファイルで書いておける、とか)
BTRONの実身仮身ですね、わかります
元のファイルをいじると貼り付けた先のソースにも変更が反映されるようなコードスニペットってこと?
mixinでいいじゃん。mixin
578 :
デフォルトの名無しさん :2008/09/20(土) 17:55:59
eclipseレベルのリファクタリングブラウザは、一度使うともう到底後戻りできんわ。 コードを範囲選択してキーボードポンでダイアログ表示、 メソッド名打ち込んで引数名確認したらEnterでメソッドが完成。 自動的に決まった引数から”どのメンバであるべきか”とかが何となく分かるから、今度はメソッドの移動。 メソッド名とかも後で簡単に変更できるって分かってるから、 使われ方を必死に予測して適切な名前をひねり出す必要がない。 頭がすげー楽。 D言語はあくまで静的に解決することにこだわってるから、 そういうIDEの機能とも相性が良さそうなのよねぇ。 その分規模がでかくなるから、なかなかまとまった実装をする気にならないけど。
duck-typingしてる場合とかでも、名前の変更できるものなのかな。
import std.string; import std.date; void main(){ .toString(getUTCtime()); } Assertion failure: '0' on line 5222 in file 'expression.c' abnormal program termination これってなんですか
バグです
5222 ファミ通のクロスレビュー
糞ゲーにも程がある
高評価は信用してないが低評価は信用してる。
>>578 >eclipseレベルのリファクタリングブラウザは、一度使うともう到底後戻りできんわ。
Javaではそれができるの?Dはないよね?
質問です。 import std.stdio; interface A{} class B: A{} void main(){ A a = new B; writefln(a.classinfo.name); } このような場合の、 writefln のところで B と出るようなやり方はないのでしょうか?
それは、ただのバグです。 本来ならBとでます。
>>586 writefln((cast(Object)a).classinfo.name);
>>586 ,587
構造体がインターフェイスを実装できるようにする計画もあるみたいだから、現在の実装で正しいんだと思う。
クラスはclassinfoを持ってるけど構造体にはないから、インターフェイス自身のclassinfoを返すしかない。
もとがクラスオブジェクトだと断言できるなら
>>588 のようにキャストすればいい。
Information about an interface. (中略) .classinfo for this interface (not for containing class)
>>590 それはInterface構造体の説明だろ
592 :
586 :2008/09/23(火) 21:55:53
>>588 なるほど、Objectにキャストすればいいのか。
ありがとうございます。
>>587 俺もバグかと思った。
>>589 たしかにカンファレンスのネタであった気がするな。
構造体でinterface実装って、POD型維持したままで出来るものなの?
POD型に純粋仮想関数を継承させるくらいC++でやってまんがな 多重継承をinterfaceにやらせる話は値側の多重継承を捨てるという話なんで、 構造体自身が継承できない仕組みなのである程度なんとかなるのでは。 C++と同じくrefと書きまくらないとならんとか面倒もあるかもしれないが。
pure関数が実装されるらしいね。 何でもpure関数はスレッド安全だとか関数呼び出しを減らせるとか非同期に実行できるとか。
ここの住人なら順関数は常識だろ
最近Dを使い始めたばかりの初心者ですが、質問です。 Poseidonを使って何とかビルド、実行までできたのですが、 デバッガを起動しようとすると Debug Error! Try compiling and linking with -g とエラーが出てしまいます。 プロジェクトのプロパティのコンパイラオプション、ビルドツールオプションの 追加オプション両方に-gを加えてみたのですが、全く変わりません。 どうすればよいのかどなたか教えて下さい。
リンカオプションは?
598 :
596 :2008/09/24(水) 11:54:00
一通り探してみたのですが、リンカオプションの設定をどこで行えばよいのか分かりません。 ビルドツール設定 = リンカ設定と思っていたのですが、違うのでしょうか?
-L-g ?
>>593 refってC++/CLIのことか?ややこしいから省略するなよ全然別物だろ
const int[]とconst(int)[]とかの違いをまとめたページとかある?
今のところ const char[] と const(char)[] は一緒じゃなかったっけ?
604 :
596 :2008/09/25(木) 09:43:08
>>599 御回答どうもありがとうございます。試してみたのですが、やはり同じ結果になってしまいました。出力は
C:\dmd\dmd\bin\dmd.exe File1.d File2.d -ofProject1 -debug -g -L-g
のようになっていますが、指定方法が間違っているのでしょうか?
605 :
604 :2008/09/25(木) 09:52:20
すいません。自己解決しました。デバッガの設定でフルパスを入力していないのが原因でした。 お騒がせして申し訳ありませんでした。
>>601-603 ちがう。
前者のconstはストレージクラスで、後者はタイプコンストラクタ。
変数にconstストレージクラスをつけた場合は、次に来る型全体をconst()で囲んだのと同じになる。
つまり、 const char[] a; は const(char[]) a; に等しい。
const(char[]) = const(const(char)[]) ≠ const(char)[]
ローカル変数のアラインメントを指定する方法ってないでしょうか
608 :
デフォルトの名無しさん :2008/09/26(金) 02:22:48
http://www.kmonos.net/alang/d/2.0/dll.html のサンプル「DLL内のDのコードを呼ぶDのコード」で
test.d の DYNAMIC_LOAD 版の main() 内で、
c = (*getMyClass)();
より前に
new Object;
と書くと、全部終わった後にAccess Violationがでてしまうのですが、
これは回避できるのでしょうか?
ちなみに、FreeLibrary(h)を実行する前に new したやつを delete したり、
std.gc.fullCollect()を実行してその後使わなければ
一応いけてるみたいですが、、
ないと思うよ。宣言した数だけ宣言の順にスタックに領域が確保されるってわけじゃないからね。 まあ、素直に構造体に入れとけばいんじゃない。
610 :
608 :2008/09/26(金) 02:51:30
ないのかーorz ありがとうございました。
612 :
608 :2008/09/26(金) 03:19:53
>>323 色々あって gdc でやっと D ver2 使えるようになったんだけど
そういえば GUI 使いたいと思ったら
DWT が Tango+D ver1 だと気がついた。
Tango ぶち込んだら使えるんかいな?
>>609 ありがとうございます。やっぱりないですか。折角インラインアセンブラで
SSEが使えたりするのに勿体ないですねぇ。
Dにはパッキングを調節する機能はあっても、アライメントをあわせる機能はない。 newすれば16バイト境界にならぶけど。
そもそも構造体の頭からなんぼのところにあわせるかの指定だから、 構造体自体がずれてたらどうにもならない。
ビットフィールドってどうしてついてないんだろう。 使わないから?
621 :
617 :2008/09/26(金) 18:55:39
すまん、Internal Server Error 返ってきたから2回投稿しちゃった。
>>620 そうでしょうね。
無くても困らないし。
構造体が関数を持てる以上、必要ないんだろう。
つ std.bitmanip まあ、使わんけどw
TCPヘッダをいじくるものを書いているのだが、 フィールドにアクセスする関数を作るのが面倒でならない。 ビットフィールドはぜひとも欲しいと感じているんだが、 なくても困らない人たちはどういうコードを書くのか、 参考までに教えていただきたいのですが・・・。
無圧縮のチャンクを扱うこともめっきり減ったのは確かだのう
やったーOpenSSL使ってSSLするSocketStreamできたよー\(^o^)/
うpしてあげると誰かが喜ぶとおも
TangoのWebDavStream?に期待しているのだがなかなか実装されない
Streamじゃないや VFSだった
静かだなあ
とりあえず、今のDで最強IDEはなんですか?
Descentじゃね。文字列mixin対応してるという意味で。
636 :
628 :2008/09/29(月) 01:55:52
そんなに進化してたのか >Descent いまだにテキストエディタでしこしこ書いてる俺。
二番手がPoseidonかな。こっちのが軽いから期待してる。 まあ、俺もエディタですが。しかもビルドツールはmake
>>636 うp乙
>>635 DescentはすばらしいのになんかEclipseが使いにくいんだが・・・
>>638 ビルドツールはDSSSがいまいちまともに機能しないのでbudを使ってる
640 :
388 :2008/09/29(月) 09:07:55
>>392 やっとこかなり小さい再現コードが書けた
---- 以下のモジュールで静的ライブラリを作成
module test;
import std.random;
Mt19937 gen;
uint nonThreadSafeRandom() {return gen.next;}
---- 以下のモジュールを前述のライブラリとリンクして実行ファイルにしようとするとOPTLINKか落ちる
import test;
void main() { uint a = nonThreadSafeRandom(); }
---- 以下のようにすると通る
import test, std.random;
void main() { uint a = nonThreadSafeRandom(); }
641 :
392 :2008/09/29(月) 16:04:32
>>640 こちらでも確認した。
このバグのバグレポあがってないみたいだから、挙げといたほうがいいかも。
ということで、お願い。
>>641 Issue 2378に。
また追ってご報告。
643 :
392 :2008/09/29(月) 18:46:15
楽しそうだがpython文法が好きというわけではないから個人的にはスルー 変数を全部Variantにしてコンパイラブルpythonを作ったぜ!とかいうなら向こうの人が喜びそうだが。
>>644 ものすごく気になるんだが、Linux限定か?
そういえばTangoのカンファレンス終わってるけどあれって詳細でないのかな?
最近なぜC++にプロパティやmixinや自動初期化がないのか疑問になってきた interfaceは純粋仮想クラスでいいとしても
しかし関数ポインタ/デリゲートのオーバーロードってできないのかな? 名前ハイジャックのルールを適用して int function(int) f; int delegate(int, int) f; void f(int,int,int){} int f(int) = &someFunc みたいな
変数のオーバーロードってちょっとキモイ。
int v; string v; string v = "hoge";
オーバーロードで思い出したけど、tango.text.Textの、 final char[] toString (char[] dst = null) はオーバーロードされてないことにいい加減気づいてほしい。 …狙ってやってる…わけないよなぁ?
654 :
653 :2008/10/02(木) 22:14:32
オーバーライドか。間違えた。
D言語せんといかん
静かだな 次は何がくるのか
wxDは2.0に対応してないの?してないみたいだけど
時期的にもうじき来そうな気がするんだけどなぁ。 ところで、Tangoにメルセンヌツイスターが追加された模様。 しかし…random系のはclassにするべきじゃないかと思うんだがどうか。
構造体にしとく理由とか欲しい 明確な理由があれば従いやすくなるし
前スレか前々スレあたりでその話題が出てた。 乱数は速度が必要なことがあるから、仮想関数の呼び出しコストのことを考えてるんじゃないか、みたいな話だったかな。 個人的にはクラスにして欲しい。 大体、そこまで速度的にタイトな場面でメルセンヌ・ツイスタやら線形合同法使わないだろと。 特殊なシーンだと思うし、標準がどうであろうとたぶん自分で実装すると思うんだよなあ……。
長周期の乱数が必要になる場合ってのは、シミュレーションなんかで 超大量の乱数(数億とか)が要求される状況とかじゃね? そうすると、デフォで手軽に高速な方がいいかもしんない。
struct S { int i; void func(){++i;} } class C { int i; final void func(){++i;} } この二つでベンチマーク取ってみたけど、ほぼ同等の速度で実行されたよ。 中身が乱数生成するような多少複雑なものになれば、差は無視できるんじゃないかな? 本当にstructでやる意味ってあるのかな?
とりあえずRandomだけでもオヌヌメの乱数をラップしたクラスにしてくれ Random使ってて速度が欲しいはねーって
コピーが簡単だとか
構造体はC/C++とのブリッジとかだけに使うべしとしてほしいわぁ。 単なるデータ構造が欲しいならクラスに統一してほしい。
たぶんウォルたんはスピード狂だし・・・・・・
オブジェクトをスタックに置ければ概ね代用になるのかな
それはscopeのことか?まぁ完全ではないけど。
gdcのD2.0版はまだすか?
はやくコミッターになるんだ
dmdでコンパイルできるのにposeidonでコンパイルできない。 C:\test.d: module Documents cannot read file 'C:\test.d' なんぞこれ
>669
SVN最新版が対応してるとの話なんでマニュアル通り試してみたんだけど(於:Ubuntu 8.04)
% tar jxf gcc-4.1.2.tar.bz2
% cd gcc-4.1.2/gcc
% svn co
http://svn.sourceforge.net/svnroot/dgcc/trunk/d % cd ../
% ./gcc/d/setup-gcc.sh --d-language-version=2
% ./configure --enable-languages=d
% make
で
(略)
checking If /home/(アカウント名)/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/gdc
-B/home/(アカウント名)/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/ -B/usr/local/i686-pc-linux-gnu/bin/
-B/usr/local/i686-pc-linux-gnu/lib/ -isystem /usr/local/i686-pc-linux-gnu/include -isystem
/usr/local/i686-pc-linux-gnu/sys-include can compile D sources...
/home/(アカウント名)/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/cc1d:
/home/(アカウント名)/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/libgcc_s.so.1:
version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
no
configure: error: can't compile D sources!
make[1]: *** [configure-target-libphobos] エラー 1
make[1]: ディレクトリ `/home/(アカウント名)/gcc-4.1.2' から出ます
make: *** [all] エラー 2
となってエラーになる
gcc-4.1.2/host-i686-pc-linux-gnu/gcc/gdc は一応生成されてるみたいなんだがよくわからない
何か手順間違ってるかな
すまん。解決。 URIにスペース入ると駄目なのね。
>>672 msys上で1も2もいけることは確認した。
Linuxはわからん。
エラーから察するに、C++が入っていないのかな?
./configure --enable-languages=c,d,c++
とかで通ったりしない?
>674 >./configure --enable-languages=c,d,c++ これでやってみたけど、結果は同じでした。 gcc4.2.0を要求されるのがよくわからない…
>>672-675 @@ -3524,7 +3524,6 @@
GDC=$CC
GDC=`echo $CC | sed s/xgcc/gdc/`
+GDC="env LD_LIBRARY_PATH=`pwd`/../libstdc++-v3/src/.libs/ $GDC"
echo "$as_me:$LINENO: checking If $GDC can compile D sources" >&5
echo $ECHO_N "checking If $GDC can compile D sources... $ECHO_C" >&6
ああ、phobosのconfigureに当ててね
Tangoのsvnの2.0対応版が更新されてたから試してみた。 ちょっと修正必要だけどなんとかコンパイルに成功。 まだconstとかinvariantとかがカオスだけど、 これでやっとTangoでD2.0の恩恵が受けられる!
>>679 おおーまじか
それはめでたい
しかしDFLがいまだ2.019で使えなくて俺涙目
ところで、これまでのアップデート間隔を考えるとそろそろ次が…
>677 回答ありがとうございます、遅くなってすいません ですが、 ./configure --enable-languages=c,c++,d の直前にgcc-4.1.2/gcc/d/phobos/configureを677のとおりに書き換えてもやはり同じエラーになってしまいます。
D言語ってSSEのイントリンシック命令とかないの? std.intrinsicは貧弱すぎだろ・・・・
FORTRANチックな配列演算のところに 「ベクトル命令を活用することが期待されます」っつー感じなんでどうかなあ。 実際実装されてないようだし。
>>685 asmはvec4クラスとか超軽量のものに使うにはオーバーヘッドがでかいので
intrinsicの代わりにはならないなぁ
同じ場面で__forceinlineも欲しかったりするけど・・・
688 :
687 :2008/10/10(金) 16:05:10
うぉるたん曰く Jason House wrote: > Did anyone make a tally ofhow many votes different things got? If so, > what are they? I was surprised to see my remove SFINAE proposal > showing up at all. It didn't even make my top 5 > > For Walter's inner circle, what conclusions were drawn from the poll? > I saw comments like "consider it done" about the whole Tango/Phobos > runtime thing. Are there any other items getting serious > consideration? At the moment, the highest priority items are: 1. tango/phobos integration 2. fixing foreach so it works with iterators 3. implementing the threading model 4. fixing bugs 5. function returns by reference 6. invariant => immutable
>>689 ま た 代 替 わ り か
eclipseDとかDDTとかdescentとかMmRnmHrmとか、eclipseプラグインの系譜はなかなか壮大だな……
今日字句解析器書いてて気づいたけど、writefln(\n)とかって通るのね。
writefln(\©); とかもね。
和訳の言語仕様の字句の構成のところに書いて有るけどちょっと判りにくいよね。
OggVorbisを使おうとして試行錯誤してて詰まったんだが 構造体OggVorbis_Fileにdoubleとかfloatが含まれてて、 それをimportして変数を宣言すると、OggVorbis_File__initZが無いっすってリンカに怒られる 浮動小数点をNaNに初期化したいんだろうけど、こういうところでかなり困る
Mmrnmhrmってなんて読めばいいの
スターコントロールに出てくる種族だろ
まーだー?
耐えろ…きっとD3.0のフラグ…
実のところD言語0.6くらいでしかない、この言語を、 おまえら良くついていこうって気になれるな。
保守モードのdmd1.0系は普通に使えると思うけど
ぶっちゃけ lisp/scheme とどっちがいい?ていうかどっちが実用的に使える可能性を秘めているのか? lisp/scheme の信者っぷりはよく知っています。emacs とか‥‥‥。
何の話だ
Dとschemeどっちが実用的に使えるのって質問だろ 俺はDだと思うけどマシってだけだ
アプリケーション開発に使うとしたら間違いなくDだが まず「実用的」の定義を教えてくれ
>>703 もっと話を具体的なところに落とせよ
誰が使うのか、何に使うのか、どういう環境で使うのか
そんなんでわかるかw
>>709 それはemacsをしらないということですかね、もぐりですか?
そんなにひっぱる話題かよ
>>711 本当にそう考えるのならレスつける必要もないのでは?
>>711 自分のレスが思った以上に馬鹿だったらしいと気付いて
必死に「最初から煽ラーだった」ように見えるログ作りに精を出してるんだろ。
俺は馬鹿だったんじゃない、釣ったんだ、ってね。
ここまで俺の自演
ここからも俺の自演
それがどうした? その発言も意味分からないぞ
また比較厨か
ID欲しいなぁ・・・
いかん、スレが荒れている。新バージョン性仕様変更欠乏症に違いない。 早く患者のDコンパイラを新しいものと取り替えるんだ!
>>721 申し訳ないです。そのご返事のhumorに自ら降伏し、haskell 習得を中断してしばらくdやります。
DMD 1.036 and 2.020 releases
釣りだろうと思って見に行ったらやっぱり釣りだった
Tangoって本当にPhobosに置き換わるのかね? 早いとこ決まらんとPhobosでもTangoでも積極的に 使いづらいんだ。
phobosベースになるんじゃないかなーと思ってる ちゅーかtangoがただのライブラリだったらそれでいいんだよ・・・
727 :
デフォルトの名無しさん :2008/10/14(火) 19:49:19
template OpCallConstructor() { static typeof(this) opCall(Args...)(Args args) { return new typeof(this)(args); } } interface I { I f(); } template X(T) { mixin OpCallConstructor; T f() { writefln("X"); return this; } } class C { mixin X!(C); void g() { writefln("C"); } } int main(char[][] args) { auto c = C(); c.f.g; // => "X C" return 0; } 関数の実体が増えるのだけが気になるが。
↑変則的なCRTPをやる際にもエレガントにいくという話です。 Dではクラスはどうせ参照型なのだから、 thisを返すパターンは派生先で勝手に派生クラスにしてほしいといえば欲しいが…… inabaさんのブログに以前貼ってあったような? ところで、テンプレートまわりはいろいろ変な機能が付いてますが、みなさんはどうお使いですか?
class B { } class D1: B { } class D2: B { } D1[] a_d1 = new D1[1]; B[] a_b = a_d1; a_b[0] = new D2; writeln(a_d1[0]); //D2 こういうキモいことになるのは、仕方ないの?
配列の共変性は厄介だなあ。ポインタでも同じ問題はおきるが… C++ではどうなってるんだっけ?
DMD(1.030-linux)で作った実行ファイルがgdbでステップ実行 できないんだけどうちだけですか
>>732 それは言語仕様上の欠陥といわれても仕方がないなあ。
class B { }
class D1: B { void e(){ } }
class D2: B { }
D1[] a_d1 = new D1[1];
B[] a_b = a_d1;
a_b[0] = new D2;
a_d1[0].e; // Access Violation
>>733 クラスが値型だから
a_b[0] = new D2; ← ここでコンパイルエラー
.NETとJavaはどちらも配列はcovariantだが、ランタイムに型のチェックがある。 Dの配列はlightweightなのが大切なのかも知れんが、あまりに危険すぎるな。 デバッグビルドだけでも、型チェックコードを生成できるようにならないか。
>>735 そうか、そうだった。
C++だと、D*→B*は暗黙に変換できるが、D**→B**は変換できないよな。
新バージョンはまだなのか… いったい何が起ころうとしている…?
どかんと来そうだなwktk
参照いいなあああ やっとかあ
C++へともどっていく
参照を返せるっていうのは引数のrefみたいなことが出来るってことでいいの?
俺もわかんね 誰かどんなときに使いたいのか教えてちょうだい
コンテナの要素とか参照で欲しくない?front,backとか
ああ今は値型の場合はポインタで受け取るしかないのか
その辺は結構最適化されると思うけどねえ
getMatched(array, regexp) = hoge; なんて感じで関数の戻り値を左辺におけるようになるのかもしれない
foo()=bar(); それはややこしい
obj.foo=bar(); Dならできるはず
obj.length+=1024; Dならできるはず
構造体の演算子オーバーロード時に参照返しできると嬉しい あとコンテナを標準ライブラリ化してくれ
>>688 確かに最近TangoのD2.0の更新が頻繁だな。
つい40分ほど前にも更新が…
相変わらずちょっと直さないとコンパイルできないけど
DM謹製 x64コンパイラがほしー
> Based on Sean Kelly's hard work, Phobos has been split into two libraries, > druntime.lib and phobos.lib. This will enable better integration with Tango. > The user source code changes are: んと、もともと Phobos(druntime)とTango(druntime)みたいな状態だったものが druntime.libとして抜き出したことで PhobosとTangoが同列というか、一緒に使えるようにしたってこと?
ついにTangoが
D1.0のほうに今回の更新が含まれないってことは、 D1.0のほうはTango+Tangobos使って頑張れってことだろうか
こんなどでかい変更でもバージョン番号は2.019 -> 2.020という素っ気なさw 言語仕様に近い部分がdruntime.libに分離されたのかな。 お、linuxでobject.dが読めないって言われた。dmd.confが間違ってるっぽ? -I%@P%/../src/runtime/importの部分を -I%@P%/../src/druntime/importに修正したらコンパイル通った。
バージョンアップしたら dmd\samples\dの中身も更新してほしいよ サンプル動かないよ dmd\src\druntime\src\build-dmd.bat を実行して作られた dmd\src\druntime\libってどしたらいいの? dmd\libへ移動? sc.iniを書き換え?
てっきりTangoも同梱されるのかと思ってた druntimeをPhobosとTangoで共有できるからTangoは自分で持ってきてねということ? Tango入れたことないのだけど試してみるか
むしろTangoを動かすのが難しくなった…… core.exceptionにSyncExceptionが無いあたりで詰んだ。
immutableどこだ
>>761 ん?
2.020用に、Tangoは更新されてないでしょ?
>>765 ええ、ですので、2.020でPhobosとcore部分を共通にして動作するように
書き換えているのですが…
object.di に Cutf8 がないからと const(char)[] にすべて置換して
同様にCutf16, Cutf32, Mutf8, Mutf16, Mutf32を置換して
tango.core.Exception等の代わりにcore.exception等を使うようにして
..\tango\core\sync\Barrier.d(12): import SyncException not found
このエラーで詰んだ。
v2.020 import std.stdio; void main(){ writeln(typeid(long)); } これが動かない。
>>766 当たりが多すぎるので
さすがに今回は、更新されるまで待ったほうが
>>763 いまのところinvariantストレージクラス/タイプコンストラクタのエイリアスみたい。
Windowsだけど、そもそもobject.dが入ってなかった。 2.019から持ってきたらとりあえず動いたけど。
よくわからないのですが これで、PhobosとTangoの確執が終わり ライブラリがいろいろ使えるようになってくるわけですね?
配列のプロパティに括弧がいらなくなってる! ref T head(T)(ref T[] a) { return a[0]; } void main(){ int[] a = [1,2,3]; a.head = 4; writeln(a); // [4 2 3] }
>>770 object.diがあるからそっちとlib使うんじゃねえの?
>>767 動いたけど
> type a.d && dmd a && a
import std.stdio;
void main(){
writeln(typeid(long));
}
long
>>774 んー動かんな
もしかして、druntimeのビルドしないとあかんのか。
>>773 object.diも見つからなかった。
druntime.libってのも見つからなかったから、なにか勘違いしてるのかもしれん。
dmdのバージョンがちゃんと2.020になってるのは(実行して)確認した。
地雷リリースか!お前ら頑張れ!
opIndexで参照を返すってやってもopIndexAssignは必要なのか… そのうちopIndexAssignはなくなるんかね? import std.stdio; class Hige { int a; ref int opIndex(size_t idx){return a;} } void main(){ auto hige = new Hige; hige[0] = 1;//Error }
ああ分かったぞ。古いのに上書きするとなんかおかしくなるみたいだ。
>>773 ,779
druntimeフォルダだけコピーされなかったという、自分の謎のミスでした。お騒がせしました。
コピーしなおしたら、>767のコードはとくになにもしなくとも動いたよ!
sc.iniを書き込み不可にしていると それ以降のコピーが実行されないケースがあるから 各自自分の環境に注意のこと
それで結局、druntimeは自前でビルドする必要あるの?
あと今回sc.iniが書き変わってるから 前のを残したままじゃちゃんと動かない
>>783 中身テキストエディタでdruntime.libとphobos.libを開いてみたら、
どうやらphobos.libにdruntime.libの中身も含まれているみたいな感じだった。
公式でもdruntime projectのページでもいいから導入マニュアルを書いて欲しいな
警戒してdmdのフォルダだけ削除してから入れ替えたら特に問題もなく動いたぜ druntimeに入りそうな機能を何も使ってなかっただけだが
Tangoが更新されて 他のライブラリも更新されたら 俺、使い始めるんだ
俺gdc0.25が出たら使い始めるんだ
>>790 ライブラリが更新されない、gdc0.25が出ない、ってフラグですね
久々にカオスで楽しめるw
nazodaneさんとこ見たんだけど、 こんな構文が許されるようになってる… void f(T)(){ writeln(typeid(T)); } void main(){ f!Object; }
class C(T) { } に対して、 new C!int とかもできるようだ。
いっそのこと型もファーストクラスオブジェクトにしちゃえばいいのに
(hoge)がタプルとして扱われてるって事かね 知らんけど
>>793 こういうの見ると
Dらしいプログラミングスタイルってどんなんだろうか、と思いを馳せてしまうんだが、
俺には言語能力が微塵も無いので勉強したいんだが、
Dスタイルなプログラミングが勉強できるサイトとかってある?
新し目の構文とかは無理だろうけど 日本にはゲームプログラマがソース公開してる人が多いからそれ読めば
writefln = ""; これが使えなくなったなw
ちょっと前から使えなかった気がするが
ああ そうなのかー
Linux上でversion識別子Posixがpredefinedになったけど、 明示的に-version=Posixってするのをエラーにまでする必要はあるんだろうか……
ここ1年くらい特にD言語でコーディングもせずこのスレを流し読みしてると C++以上の変態言語に進化してるように見えてならないのだけど実際のところどうなんでしょう
C++0xと五分五分 C++と聞くといつもDTLのことが思い出される
template X(string s) { enum X = "X" ~ s ; } void main(){ auto x = X!"aaa"; writeln(x); } まるでC++0xのUser-Definedリテラル!
さすがに、 void foo(alias F)() { F("hello"); } void main() { foo! (string msg){}; } みたいなのは無理か。 世界が広がる気がしたんだが。
うぉるたんが演算子にUnicode文字を採用したがっているようです
Fortressみたいになんのか?
入力しにくいだろ
auto s = q{hoge}; これ覚えてる人いるのかね
覚えてるよ。 mixin用にコードを書くときとか便利。
トークン文字列か。Dとしてvalidなトークンだけを受け入れる文字列リテラルの一種なのね。 話逸れるけども、例を見せてコードで語るときは、なるべくautoは避けてもらえるとありがたい。 q{hoge}が文字列になるという情報が省略されてちゃ、変数に代入可能な何かだとしか読み取れない。 autoって可読性を損なう誤用がたくさん生まれそうでちょっと怖い。 書きやすいより読みやすい方が大事だぜー。
void _do(string x)() { mixin(x); } void main(){ _do!q{ writeln("Hello, world"); }; }
>>814 rubyのブロック付き関数呼び出しみたいなことができそうだな
おまいら楽しそうだなwおいらもまぜてw
どんどん変態言語になっていくw
カッコで囲まないだけでこんなに変態ちっくになるなんて
>>813 >q{hoge}が文字列になるという情報が省略されてちゃ、変数に代入可能な何かだとしか読み取れない。
ごめん
ヒントなしで聞いてみたかったもんで
qはいったいどこから来てるんですか。 っていうかいったい何なんですか。 説明求む
Rubyからじゃないかなぁ
>>815 この例だとあまり意味ないけど、使い道はなきにしもというところだね
void main() {
auto a = new Array!(int);
a.a = [0,1,2,3,4,5,6,7,8,9];
a.each!q{ |i|
writefln(i+5);
};
}
void getRubyStyleBlockArgument(string s, out int begin, out int end) {
foreach(int i, const char c; s) { if(c=='|') {begin=i+1; break;} }
if(begin==-1) static assert("There is mp Ruby Style Iterator Argument");
else foreach(int i, const char c; s[begin..$]) { if(c=='|') {end=i+begin; break;} }
if(end==-1) static assert("There is mp Ruby Style Iterator Argument");
}
string getRubyStyleBlockArgument(string s) {
int begin=-1, end=-1; getRubyStyleBlockArgument(s, begin, end);
return s[begin..end];
}
string getRubyStyleBlockExpressions(string s) {
int begin=-1, end=-1; getRubyStyleBlockArgument(s, begin, end);
return s[end+1..$];
}
class Array(T) {
T[] a;
void each(string x)() {
mixin("foreach(ref "~getRubyStyleBlockArgument(x)~"; a) {"~getRubyStyleBlockExpressions(x)~"}");
}
}
書いてみたはいいが、Alexandrescu先生の奥が深すぎてビビる
>>824 これはひどいw
構文がほぼ拡張されている
これだとむしろqがあった方がいいなー なかったら何やってるんだかわからなさすぎる
>>824 これは変態過ぎるwww
|hoge| ってDの構文としてvalidなんだな
うわーなんか急にクソみたいな言語になったな… Ruby化とかマジ勘弁して欲しいわ
>>828 q{}が受け入れるのは、構文としてvalidなものじゃなくて、トークンとしてvalidなものだから。
いやこれ遊びでやってるだけだし
ううむ失敗 関数テンプレートはfunc(array) => array.func 変換できないんだっけ? void main() { [0,1,2,3,4,5,6,7,8,9].each!q{ |i|writefln(i+5); }; } void each(string x,T)(T[] a) { mixin("foreach(ref "~getRubyStyleBlockArgument(x)~"; a) {"~getRubyStyleBlockExpressions(x)~"}"); }
>>832 本来はできるが、!の形式でテンプレートパラメータを与えるとできない。多分バグ。
いつの間にか()いらなくなってたんだな void main(){ [1].f(); [2].f; } void f(T)(T[] a){}
import std.algorithm; [0,1,2,3].reverse; これが通るのは気持ちいいな。 型の自動推定ができるとテンプレートでもこれがいけるのか。 しかしstd.algorithmあたりはソースを覗くと結構魔窟。 >824をいじってて気づいたが、実行時関数実行ではassertがstatic assert並に動作するのね。 当たり前といえば当たり前だが。 あとstd.string.toStringがコンパイル時動作しないとか……動的配列を使ってるんだろうけどね。
冷静に考えると、コンパイル時実行できるパーサを書けば何でもできるな。 書いてて面倒になってきたのでやめたが、 formula!q{ Σᵢ₌₁ⁿ(i^2) } を reduce!("a + b")(0, map!("pow(a, 2)")( i[1..n]) )) に変換する程度ならたぶん書ける気がする Unicode文字がつぶれてたらすまん
文字列内部のインテリセンスはIDE開発者を自殺に導きかねない要素だな
それでもDescentなら…Descentならきっと何とかしてくれる(AA略
いっそDSLを読み込んでDの言語要素を生成できるコンパイラ用プラグインの仕組みが欲しい。 コンパイル時に文字列いじり回してDソースにトランスレートするよりよっぽどスマートだ。 あとrubyのブロックはフツーに欲しい。
やはりジェネリックデリゲートが必要だな。 最低限でも、デリゲートの引数の型を推論する機能は必要だ。
>>838 HTML周辺はPHPやらRuby(ERB)やらJavaScriptやらで地獄だろうな、と思ったけど、
そういやかつてはD言語もHTML埋め込み可能だったな。意味合いが違うけど。
>>841 class A{]
class B:A{}
A delegate() x = B delegate(){return new B;};
void delegate(A) y = void delegate(B){};
その前にこれが欲しい
間違えた こうか class A{} class B:A{} A delegate() x = delegate B(){return new B;}; void delegate(A) y = delegate void(B){};
>>843 void delegate(void) x = function void(){};
そのまえにこれがほしい
間違えた こうか void delegate() x = function void(){};
次のスレタイはさしずめ「変態D言語 Part20」といった具合か 外国でも"The Programing Language H(entai)"とか根ざそうか むしろTPLHのパイオニアとして君臨するのも
変態すぎてperl並にフリーダムになりそう。
そんなに変態化を心配(むしろ歓喜か?)を心配しなくても一般ユーザーからは見えにくい領域だろ
Dゲンガーは9割方C++を経由してるから変態具合は心配しなくていいと思う
俺数少ない一割だw
一割はさすがに少なすぎだろ
>>850 いや、その理屈はおかしい
変態が嫌になってD大陸に移住したのに、そこもまた変態の国だったなんて勘弁してよ
いきなりレス増えてると思ったら新版出てたのか ところで、モジュール名と関数名が文字列として欲しいんだけど、 何とか手に入らないもんかな。 ソースに静的文字列として毎回書かないとダメですか。
foreach (moduleinfo; ModuleInfo) writefln(moduleinfo.name); これで使っているモジュール名が取れたりするけど *Info系はまだまだ充実してない気がする
変態グラマ専用 D言語 Part20 でいいよ
かなり微妙だけど… import std.stdio; alias std.stdio hoge; void main(){ writefln(f!main); // "main()" writefln(f!f); // "f(alias F)" writefln(f!(std.stdio)); // "module stdio" writefln(f!(hoge)); // "module stdio" } string f(alias F)(){ return ((F)).stringof; }
>>850 俺Java
ネイティブ行けるJavaみたいなの期待してたんだけど
こんなんならJavaのネイティブコンパイラの改良を期待した方がよさそうだぜ…
そもそも、boostという超変態ライブラリが開発されたC++より テンプレートが強化されてるのがD言語だぜ? いつかこうなることは分かってたはず
これは無闇にテンプレート引数のカッコ省略するのが流行る流れ
ネイティブでリフレクションできる言語として期待している
SafeDのコラムを見るといいかと思う。
ちょっと気味悪い書き方「も」できるだけで、
>>849 の言うように
一般ユーザーはより可読性が高い安全な書き方をすればいいと思うよ
それじゃPHPよろしくスパゲティまっしぐらじゃないですか
ここ最近の話は解読しようとしてヘコタレた 俺の言語マニア度からするとfreebasicあたりにしといたほうがよさそうだ
>>855 おぉ、そんなアンドキュメンテッドな仕様があったのか。マジで知らなかった。
ただ、欲しいのは自分のモジュール名、自分の関数名なんで
このままではちょっと使えないか。
気味悪いと言いつつ面白いと思ってしまう自分が嫌だ こんな書き方使わないっちゅーのにw
phobos.libにsetjmpとlongjmpが隠れてたんでこっそり使ってみたら setjmpはいけたが、longjmpでAccess Violationと怒られた なんとかなんないすか?
そりゃ、Cの大域ジャンプは、Cで規定されてる環境しか保存しないから、使うのは難しいだろ。
869 :
867 :2008/10/27(月) 21:58:35
なるほど、うぉるたんも隠すわけだ コルーチンを実装したくて色々試してたんだけど、 Win32のファイバを使ったらなんかうまくいったからいいや
std.arrayが無い……だと……。
tangoにFiberあったりするんだな 実装見た感じD特有のなんかってものはなさそうだけど・・・
コルーチンってガーベジコレクションとの相性はどうだろう コルーチンのスタックもスイープしないといけないはずだか 言語レベルでサポートしてくれないとうまくいかないと思う
>>827 コルーチンのスタックのアドレスをcore.memory.GC.addRootするだけだと思う
スタックを自分で確保すると言うこと? スタックポインタまでは面倒見てくれないので無駄が多いのと Win32のファイバには使えない
自前のスタックとスタックポインタをスイッチする実装のコルーチンって昔にD研究室にあったね。 コンパイル通すのもそんなに難しくなかったし、GCについても大丈夫な根拠が書かれてた気がする。 ただ例外が飛んだりメモリが溢れたりすると無言で死ぬ。
D研究室みてきた 仮想スタックをすべてスキャンする方法だ スタックポインタを超えてスキャンするので無駄は多い 300バイト程度を想定しているみたいで少数スレッドなら問題ないと思う 言語レベルでの実装であれば本物のスタックと同様 スタックトップまでスキャンするように実装できるはず
>>875 >ただ例外が飛んだりメモリが溢れたりすると無言で死ぬ。
Dの例外がWin32構造化例外を使ってるかは確認してないけど、少なくともD研究室のは構造化例外が出た時点で死ぬと思う。
理由はThread Information Blockの書き換えが不完全なせいなんだけど(実スタックとTIBのスタックが一致しないので
スタックの範囲チェックで死ぬ)、書籍になったC++版だとそれを回避するために、確かスタックに巨大な配列を用意して
それを使うとか酷い方法で回避されてた気がする。
TangoのはTIBの書き換えもやってるしWin/Linuxで動くしTangoの使っておくほうがいいかと。
インスタンスとメンバメソッドのポインタのペアを使って、C++の->*みたいなことがしたいんだけど、どうすればいいの?
879 :
869 :2008/10/28(火) 23:53:36
コルーチン内のexit用に例外を発射してるんだけど、うまくいってるみたい
コルーチンのエントリー関数(?)で全部finallyして処理してやればいいんじゃね?
>>871 tangoは盲点だったわ。嫌いで使ってなかったんだ。
dmdのtango仲良し政策でいつか使うかもしれない
>>878 物足りないかもしれないけど、デリゲートを使うとか?
>>880 VBのさいつぁいですかいな。いや、pythonにもあるけどさ。
オーバーロードどうなる?
名前付きパラメータを導入するなら 構造体の要素の名前付き初期化と構文を統一して欲しいな ってことで破壊的変更まだー?
>>883 tango入れるの面倒だし命名気に入らないしな俺に超朗報。
いまだにTangoの命名規則気に入らないとか言ってる人って多いのかね
>>883 てか、日本語もう更新されてるのか すげぇ
名前付きパラメータが必要だと思うくらいになったら、 メソッドシグネチャがきっとすごいことになっているから、 素直に連想配列引き渡したほうがいいと思うなぁ。
連想配列で渡すのは型付けの弱いLLだからできる芸当だろ。 強い型システムのDとは相容れないよ。
引数順序や省略箇所の制約は単に文法の都合だけだろうから、 名前付きパラメータでそれらの制約を緩和してもいい気がする。 自分や他人が眺めるときの可読性の向上にも役立つだろうし。 さらに発展して、 func.paramtuple t; t.x = 3; t.y = 4; t.z = "hoge"; func(t); //func(x:3, y:4, z:"hoge"); とか。
こんなときこそメタプログラミングの出番なきが…
引数の受け渡しに構造体使えばいいのでは…?
メタプログラミングって…
文字列処理のことだよな?
C#4で名前付き引数とかが入るらしい。 参考にしてみたらどうだろう
896 :
895 :2008/10/29(水) 22:59:44
>>889 のようにタプルを整理すれば綺麗になりそうだなあ。
Pythonの**みたいに
>コンパイラを.NET Framework上で実装し,プログラムから利用できるようにする。 こっちのが気になった。メタプログラミングのためにeval相当を入れるって あんまり筋が良いとは思えないな・・・。
>>898 現状ではライブラリは、実行時にテンポラリファイルにC#のソースコードを書き出して、
それを(CUI用の)コンパイラでビルドして参照・実行するという方法をとってる。
コンパイラのコア部分が直接操作できるようになれば、事態はかなり改善されるよね。
>>891 C++にはいらない派の主張はそれと,仮引数の名前の問題が主なものだったような?
Dでも構造体にすればいいのはわかってるけど時勢はin-placeに書く流れのはず.
無名関数とか.
struct X{int* x;} alias const(X) CX; static assert(is(typeof(CX.x) == const(int*))); // static assert is false これって推移的なconstに反するのでは? あと、ほんと↓みたいに書きたかったけどこっちはコンパイルエラー struct X{int* x;} static assert(is(typeof(const(X).x) == const(int*))); ここら辺仕様なのかバグなのかいまいち判断付かん…
const(X) cx; に対しては、ちゃんと typeof(cx.x) => const(const(int)*) となってるし、 alias const(X) CX; に対して typeof(CX.x) => int* になるのは仕様から考えればバグだろうな。 typeof(const(X).x) は typeof((const(X)).x) と書けば通るが、 これも本来なら前者も認められるべきだと思う。
905 :
デフォルトの名無しさん :2008/11/01(土) 19:07:02
2.021
まだです
すごく・・・コンパイルエラーです
>>732-737 あたりのことで考えてたんだけど、
invariant(Derived)* -> invariant(Base)*
invariant(Derived)* -> const(Base)*
const(Derived)* -> const(Base)*
Derived* ->const(Base)*
の変換は安全なんだよね。
この辺を上手く整理できないかなあ。
910 :
907 :2008/11/01(土) 23:10:43
>>908 それもそうなんだけど、それ以上に
alias invariant( char)[] Iutf8;
これを勘弁してほしい…
せっかくPhobosがTangoに歩み寄る感じで変更が加わったのに、
Tangoはそれを完全無視した路線を突っ走っているというこの事実…っ!
immutableってどうなったの?
>>911 たぶんそのうち置き換わる。
なかったことになっても、immutable->invariantは単純な置換で書き換えられるから、
いまのうちからimmutable使うようにしてもいいかもね。
TangoはPhobosの何が気に入らないって言うんだ? 小さいD言語コミュニティを分断させようとしてるようにしか見えない
両方使えるようになったんじゃなかったんですか?
invariantじゃない限り次の瞬間には書き変わってるかもしれないと思わないといけないんだよね?
Microsoft涙目ですね
>>916 utf-8の文字列を明示するものとして使うならあり(typedefの方が良い気がするが)。
asciiの文字列と区別できるし。
919 :
918 :2008/11/02(日) 14:46:31
補足するとアプリケーションハンガリアンとシステムハンガリアンの違いね。
そもそも、charはUTF8だと決まってるわけで。 ASCIIのほうこそubyteをtypedefして使うべき。
そこはstrong typedefがあるからtypedef char ascii;で良いだろ。 あとstringは仕様では決められていなく、ライブラリレベルの問題。
>>917 彼らには型のサイズが不定なCの上でバイナリ互換を保つ必要があるって事情が
あるだけで別に涙目にはならんかと
ん?結局TangoはPhobosを無視してはいないってことなのか? charはutf8じゃないときがある。stringも同じ。 utf8だと保証する意味でIutf8とするのはあり、ってことなら。 それに両方使えるようにするのを目的にobject.d辺りの ライブラリと言語機能の癒着をいくつか断ち切ったんだよね?(読めてないけど) だったら今回の変更を無視してはいないんじゃないかな。 あとDでOS書くのも楽になってるんじゃないのか。
>>924 現状windowsのvoid main(string[] args)のargsには
utf8じゃない文字が入るんだ・・・
あとstd.windows.charsetではchar*にutf8以外を入れてしまっている
typedef invariant(ubyte[]) sjis; とかやればいいんじゃね
複数のインターフェースを継承する際に、 継承元に同名の関数がある場合はどうしますか。 名前分けろと言われればそれまでですが、 関数ハイジャック並にうまく解決できればなあと。 interface X { int f(); } interface Y { int f(); } interface Z { string f(); } class A : X, Y, Z { int f() { return 1; } // X, Yの各f()の動作を分けるには? string f() { return ""; } // 返り値がnot covariantとなる問題を避けるには? } そういえば、そもそも class A { int f() { return 1; } string f() { return ""; } } これが通ったりするんですが、 A a = new A; writefln(a.f()); と書いたりすれば当然両方の関数にマッチするので、この解決ってどうやるんでしょうか。
>>928 の答えではないが
class A : X, Y, Z {
// interface X
void f(){}
// interface Y
void g(){}
// interface Z
void h(){}
}
俺はいつも上のように書いてるから
class A : X {...}, Y {...}, Z {...}
と書けてもいいなという気がしている
class A : X { // Xの実装 }, Y { // Yの実装 } { // その他のメンバ } ってなるのか?
それはきもい
932 :
929 :2008/11/06(木) 09:12:15
ああそうか このままだとA本体の実装を書くところがダメになるのか・・・
void func() in {} out {} body {} 式に class A : X, Y body {} override X {} override Y {} とか
組み込みの cfloat, cdouble, creal, ifloat, idouble, ireal を置き換えるモジュールワロタ
次のバージョンから構造体のthisがポインタではなくリファレンスになるらしい
Dはどこへいくのだろう・・・
それじゃあ、構造体のnewもリファレンスを返してほしいな。 T s = new T; が通ったり通らなかったりするのは気持ち悪い。
一人で好きな設計を考える場合の欠点だわな
下記のようにスコープを分けても同名の内部クラスを定義するとリンクエラーになってしまいます。これは仕様通りなのでしょうか?コンパイラはdmd2.020です。 void main() { { class CTest{ this(){} } } { class CTest{ this(){} } }
void main() { (){ class CTest{ this(){} } }(); (){ class CTest{ this(){} } }(); } ちょっとJavascriptを思い出した
確かにJavascriptと同じやり方だが見た目の気持ち悪さが半端ないなw 全体を括弧でくくらなくていいってのは良いのに
(){}() シンメトリーって美しいな
顔文字みたい
p^o^q
入ってこないのも多いじゃん。 一通り揃うまでに早くて3〜5年はかかるのかねえ vcよりもdmcの++0x対応のほうがDには直結していると思うけど 何かアナウンスってないの>ウォチしてる方々
949 :
947 :2008/11/08(土) 15:21:41
>>948 ---
>DMCは今度のC++標準の改正を取り込むの?
時間が許すときに。いくらか変更を加えるつもりだったけれど
最後の(C++標準化委員会の)会議で多くの仕様変更があった。
>64ビットについてはどう?
まだ知らない。
---
翻訳ソフトの結果を弄ってみたけどこんな感じ?
(最後のI don't know yet.のニュアンスがわかんない)
C++0xの64bit対応の話だと思って「そんなもん知らん」って書いたんじゃない? 記事名的に考えて
ああ仕様の話として返事したわけか。 てっきりDMCへの実装がどうなるかの質問としか思ってなかったので... 投げやりなのかユーモアなのか不気味に思えてた。 (dmcが64ビットexe生成対応せんことにはdmdもそうならないだろうし)
勉強中なのですが教えてください。 ---- test.d ---- private int test1 = 100; private enum { test2 = 200, } ---- main.d ---- import test; void main() { assert(test1); // エラー assert(test.test1); // OK(*1) assert(test2); // OK(*2) } *1と*2がコンパイルエラーにならないのですが、これは正しいのでしょうか? 両方ともprivateなので通らないと思っていたのですが…。 使用したコンパイラはdmd.1.036です。
Dをつかってしばらくたつが未だprivateが良くわからん… private import win32.windows: HWND; とかやっても別のところで名前がconflictしてるよって言われたりするし。 ひょっとしてバグなのかもしれない。 現状はとりあえずそういうもんなのかと思って諦めて使ってるけど…
>>952 モジュールに限らず普通のクラスインスタンスのprivateメンバもアクセスできるね
これてっきりmixinのバグかと思ってたら、もっと基本的なところのバグだったんだなぁ
956 :
952 :2008/11/09(日) 08:34:35
カスタムアロケータの代わりにファクトリをやらたいがどうだろう 仮想関数の中身だけ違う派生クラス群をstatic opCallで製造しているのだが、 なんとなくnewにしたいときもある。 C c = C(1); abstruct class C { static opCall(int x) { switch(x) { case 1: return new D; ... } ... } class D : C {...}
委譲でいいんでね
委譲か opDotのおかげで委譲は異常な簡単さになったが、 ちょっとオーバーヘッド計ってくる
文を以上で〆れば完璧だった
最適化オプション入れたうえで計ってきた 関数呼出しオーバーヘッドは確実に2回分になるけど、 メンバ変数に代入するコスト1〜2回分=メンバ関数を参照するコスト10〜20回分くらいなんで、 inlineにしたいくらいのシビアさを要求されない限り気にならないかなというところ。
しかしそれでもそういう場面(メンバ関数に1〜2回代入するが、10の6〜10乗のオーダーでループさせる)で使う関数だから気になるんだよなあ。
そんなコアな部分でswitchとか信じられん
そういえばopDotってあったなw template A(int N) if(N%2==0) これこのまま残るのかねえ
ifじゃなくてwhereとかにして欲しかったが、もう遅いのだろうか
遅いことはないと思うが別にifでいいような
ifの後ろにはelseが書けないとムズムズする。 template A(int N) if(N%2==0) { alias "偶数" A; } else { alias "奇数" A; }
これがあるからなあ元々いらんのだが template A(int N) { static if(N%2==0) {} else {} }
な、なにをやっているの・・・?
ifだと分岐で、whereだと条件って感じがするから、俺はwhereのが好みかなあ。 まあどうでもいいけど。
インライン化ってされてますか……
-inline
ありがとうございます。気付いていなかった。
非staticだとインライン化されないとか、 メンバに書き込むと遅くなる(=書き込まなければ早い)とか、 結構細やかに最適化が行われているんですね。
いってこよう
ラベルのアドレスが欲しいんだが、なんかいい方法ないか?
>>983 そもそも、ラベルのアドレスをランタイムで手に入れてどうするのかと思うけど、
asm 文で拾えないか?
>>984 ちょとしたパーサかいててジャンプテーブルが作りたい、要するに
>>985 なんだけど、
asmでも取れないみたいなんだよねえ…
ネスト関数使えば同等のものを書けなくもないんだけど、
コードフローがぐちゃぐちゃになるし、ほんと痒いところに手が届かない。
ラベル付きcontinueとかたまに使うが、確かにミドルウェアみたいなものを書くときにはラベルのアドレスが欲しいかもね ところで参照の配列みたいなものを返したいのだが、定型的方法はありますか? boost::multi_indexみたいな感じで、Rangeに別のビューを持たせたいなあと思うわけです。 ポインタを返してもいいがユーザサイドとしては面倒かなと。
>>986 無名デリゲートで配列をつくるとか
void delegate()[NUM_CMD] tbl;
tbl[CMD_PRINT] = {
writef("Hello World");
};
tbl[CMD_COPY] = {
writef("こぴー");
};
こんなコードばっかり書いてるとC/C++に戻れないぜ
C/C++に毒されすぎた俺にはそんな発想が出てこないw
バグにvote ktkr
ほう じゃあコマンドライン引数の中身がutf8じゃないのをお願いしよかな 何に票が集まるのか楽しみ
static, renamed, and selective import is alyways public. これが一番人気か
一番不人気の間違いじゃないかとw
2位もひでーなー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。