>1の変更点はldcと前スレ部分
以上
4 :
デフォルトの名無しさん:2009/02/11(水) 23:51:18
>>1
乙です
なんか気がついたら1000きてた、みたいなまったりさが好きだ。
>>1乙。
まーくあんどすうぃーぷ
全ての関数の返値は第一out引数にしよう!
そうすればopCastオーバーロード問題も一気に解決!
>>8 一時期世代別が実装されそうな雰囲気になったけど
druntimeが抽出された時にどこかへ行ってしまったw
>>12 7 :デフォルトの名無しさん [↓] :2008/11/15(土) 16:36:07
おっさんだぜ?
おいおい夢を壊すなよ
その壊された夢がすごく気になる…
[1] 授業単元:D
[2] 問題文(含コード&リンク):
1から9までの数字を縦横方向に同じものが並ばないように下記の例のように並べる
並べ方が全部で何通りあるかとその並びをすべて列挙する
[3] 環境:特になし
[4] 期限: 明日まで
[5] その他の制限:
例
534681297
685293714
948367125
153472869
426538971
261759483
817945632
379126548
792814356
マルチ乙
どこの大学でDの授業があるのか教えてくれたら、解いてやるよw
return net.hatena.quest("1から9までの数字を縦横方向に同じものが並ばないように並べる\n"
"並べ方が全部で何通りあるかとその並びをすべて列挙する").primaryAnswer;
ループ中にGUIを更新したいんだけどdflではどうしたらいいの?
C#で言うところのDoEventだっけかな。
>>21 今ちょっとヘルプ見てみたら、dflにApplication.doEvents()ってあるらしいよ。
確認してないけど、使えるんじゃないかな?
でもdflは意外と地雷があったりするから、凝ったの作ろうとする場合は
気をつけて。
>[1] 授業単元:D
??!
24 :
21:2009/02/14(土) 02:04:10
>>22 Application.doEvents()で上手くいきました、どうもありがとう。
25 :
赤西仁:2009/02/14(土) 15:39:21
1年間悩んでます。お力をお貸しください。
アークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッドUは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃ嫌なんです。どうか皆さん、お力をお貸しください。
バージョンアップまだー?
1.xだけver upだと!?
* Added Mac OSX support.
* Separated bin and lib directories into windows, linux, and osx.
* No longer need to download dmc to use the windows version.
Macサポートは有難いけどページがまだ出来てないし
やはり2.xでのサポートが待ち遠しい
正式なアナウンスきたね
2.024はどこに行ってしまったんだろうか…
>>30 Extrawurst wrote:
> Very nice, but what happened to version 2.024 ?
test version
Version D 2.025 Feb 14, 2009
New/Changed Features
Added Mac OSX support.
Separated bin and lib directories into windows, linux, and osx.
No longer need to download dmc to use the windows version.
Use version(OSX) for Mac OSX. Although version(darwin) is also supported for the time being, it is deprecated.
Bugs Fixed
Bugzilla 2448: template return by reference causes seg fault
目玉はmac対応ってことくらい?
CEにも対応してもらいたいんだが。。>うぉるたん
binのパス変わってるのね
Mac対応、どれだけ待ち望んでいた事か!
次にどかんとくるとしたらRangeライブラリあたりかな?
バージョン更新でMacへ移植いけるぜ!
しかし更新してコンパイル部でコードは通らなくなったがな!
さすが言語の破壊王だ!
Internal error: ..\ztc\cod4.c 357
dmd 2.024〜
struct Bar { real x; }
class Foo {
Bar x;
const(Bar) func() {
return x;
}
}
コンパイラエラー
Internal error: ..\ztc\cod4.c 357
# Barの要素にrealだと再現する(doubleなら通る、Intel向け)
# funcの返値型がconst(Bar)ではなくBarなら起きない
# return cast(const Bar)(x)としても起こる
# 中間変数を入れてconst Bar y=x; return y;とすると起きない
D2.0の更新見てみたら
2.024飛ばして2.023から2.025になってるんだけど
どういうこと
42 :
デフォルトの名無しさん:2009/02/16(月) 18:09:30
ウォルたんのことを思うと胸のドキドキが止まらない
やっぱりhigeがないとなぁ
みんながソースを提示するときに hoge を hige と書けばいんじゃね?
hige hage piyo
getcwd()を使うとカレントディレクトリとexeのパスがくっついた文字列が帰ってくるんだけど、なんで
49 :
48:2009/02/17(火) 14:31:52
別の場所でexeのパス表示してたww
どん☆まい
51 :
デフォルトの名無しさん:2009/02/17(火) 17:07:58
exeを起動しても正常に終わるのに、exeにファイルをD&Dするとなぜか途中で終了してしまいます。
どうしてでしょうか?
import std.stdio , std.file;
void main(string[] files){
string ini = cast(string)read("_.ini");
for(int i = 0 ; i < files.length ; i ++){
writefln(files[i]);
}
writef("end"); readln();
}
BigIntを言語ネイティブにいれてくれー!
じゃあ僕はdecimalを
俺は四元数を
>>52 ini を読む前にカレントディレクトリを表示してみるとどうだろう?
えーい、101キーボードでアンダースコートの入れ方がわからん!
58 :
52:2009/02/17(火) 19:41:08
>>56 exe起動だとカレントディレクトリなのに
ファイルのD&D起動だとDocument and setteing\userを表示する
なんでだろ
>>58 windowsの場合、現在のカレントディレクトリがファイルのD&Dで
D&Dされた先に変更されたりしないからかも。
以前VC++でコードを書いていたとき、同じような感じで悩んだことがある。
そのときはフルパス取得して処理したんだっけな?
ファイルのD&Dで起動したときのカレントディレクトリが%USERPROFILE%だからじゃないのか?
実行ファイルの場所 == カレントディレクトリ とは限らない
61 :
52:2009/02/17(火) 20:11:22
よく見ると知らないうちにDocument and SettingフォルダにD関係で処理してたファイルがたまってた
とりえあず
>void main(string[] files){ ... }
のfiles[0]にexeのパスが入ってるから、そこからiniのパス作って見ようと思います
どうもありがとうございました
>>56 アンダースコアならalt押しながら95入力して放せばいいんじゃね。
earthquake changes of std.regexp to come
In the upcoming releases of D 2.0 there will be rather dramatic breaking
changes of phobos. I just wanted to ask whether y'all could stomach yet
another rewritten API or you'd rather use std.regexp as it is for the
time being.
Andrei
earthquake changes
ガクテカ
英語わかんないなりに翻訳するとぶっ壊すよ、ってこと?
アンドレイ詩人過ぎる
元スレッドからざっくり訳すと
今のstd.regexpは設計、命名規則、実装、全部滅茶苦茶なんだよwww
streamも撮れないとかutf-8しか認識しないとかカスすぎるwww
俺が根っこから全部書き換えてやるから、トラブりそうなやつは今のうちに挙手しとけwww
という感じ
で、onigu組み込んだらワロス
初歩的な質問ですが、
バイナリファイルを指定サイズずつ読み込みたいんだけど、phobosだとどの関数使えばいいんですか?
ちょwstd.rangeどうなったw
>>68 oniguruma をDで焼き直して実装ならそれはそれでうれしいかも試練。
下手に独自仕様でこられると逆に厄介だ。
正規表現は方言多すぎなんだよ…
QtのDバインディング、来てて嬉しーすげーと思ってたのに
Tango使ってんのな・・・
Phobos使用者にとっては、導入の敷居が高い。
利用者数ってPhobos<Tangoなの?
>>72 これよくわからんよなぁ。
Tango使ってる人が布教に熱心なのかPhobos使ってる人が無口なのか。
いつまでたっても次期標準ライブラリなTangoよりPhobosの方が安心なんだが貧弱だからなぁ。
>>69 std.stream.InputStream の readExact とか?
使った事ないから、違ってたらゴメンね
std.stream.File.read(指定サイズのubyte配列)で適当にやってちょ
正規表現はECMAScriptの規格になると思われ
phobosはad hocくさい実装と、練ってレビューを受けた実装が入り混じっているからなあ。
Tangoは網羅的で労力は頑張ったなという感じだが品質が保証済みかというとそうでもない。
Java、.NET、Pythonにあるような無駄にでかい、標準扱いのライブラリがちょっと欲しかったり。
Deimosという名前で。
77 :
69:2009/02/19(木) 11:59:50
>>75なんとか読み込めました、ありがとうございます;
ubyte[1000] dat;
Stream file = new std.stream.File(path);
while(!file.eof()){
file.read(dat);
writefln(dat);
}
sleep(3);
file.close();
でもこれ、(読み込んだサイズ < ubyte[1000])の場合前回の情報が残ったままみたいですね
while内にいれれば大丈夫だった、0x00で埋まってるけど
Stream file = new std.stream.File(path);
while(!file.eof()){
ubyte[1000] dat;
file.read(dat);
writefln(dat);
}
79 :
75:2009/02/19(木) 14:49:04
read は実際に読み込まれたバイト数を返すみたいだから
while(!file.eof()){
auto len = file.read(dat);
writefln(dat[0 .. len]);
}
にした方がいいんじゃね
>import core.thread;
って書くと
>test.d(2): module thread cannot read file 'core\thread.d'
って帰ってくるんですが
コアってどこにあるんですか?
心の中にあるよ
83 :
69:2009/02/19(木) 19:51:38
>>80 うまく末尾の0x00を切り捨てられました、ありがとうございます。
>>67 Tangoもそうだけどなんで増築じゃなくて改築なんだろうな
リンカを通すって特徴をわざわざ殺すやり方ばかりするのが理解できん
Dが互換性に配慮し始めたらおしまいだと思う
>>84 意味不明。
変なコードを標準ライブラリに残しておく意味なんてないだろ。
変なコードでもそれに依存してるものがある以上できるだけ壊すべきじゃない。
ランタイムライブラリが必要な言語は古い物と新しい物の両方を抱えると実行時の
パフォーマンスに影響しかねないけど、Dは使ってないものに関してはオーバーヘッドが
ないようにできるわけだから、そこをもっと生かすべきじゃなんじゃないかなぁと思うんだ。
>>87 言いたいことは分かるし共感も出来る。
ソフトウェア製作においても重要なことだと思う。
でもね、このスレでその発言はおかしい。
っつかD2.0系はAlpha扱いだしな。
普通に言語仕様に破壊的変更が起きるし、正規表現なんざ屁の河童だろ。
>>87 残念なことに、今はなるべくそうしようという方向に進んでいるようです。
Version D 2.020のあたりのcore.threadとかはその前兆かと。
すでにPhobosですら隔離されつつある。
TangoはまだD2.0に対応する気はなさそうですが。
std.regexpという貴重なパッケージ名を占有されたまま居座られても困るしね。
ダメなコードを消せるって幸せなことだよね……
いろいろわかるが(むしろそっちの方が常識的だが)
過去のしがらみに縛られないのがDのいいところ
そして永遠に誰も使わない
ネット上の情報もただでさえ少ないのにD1/D2.0、phobos/tangoで分かれてるし
標準ライブラリが2つあるという状況自体が既に色々と終わってる感がある
でもそんなDが・・・僕は・・・っ!
>>87 完全手探りのアルファ版の段階で互換性気にしてたら、
ほんとぐちゃぐちゃでわけわかんないことになるぞw
Walter Bright wrote:
> Dejan Lekic wrote:
> > When can we expect 64bit version of DMD?
>
> Nobody's ever satisfied <g>.
>
> It has to be done sooner or later. Probably sooner.
100 :
デフォルトの名無しさん:2009/02/20(金) 11:44:37
>>96 D1はD1でひとつの言語だと考えるといいと思う
あとD2に対応してない時点でTangoは使えないんだよなー
今のところD2やるならPhobosしかない
配列の s[0..2] って s[i..i+2] みたいな書き方できなかったっけ
102 :
101:2009/02/20(金) 17:10:57
あっ、できた
おめ
ファイルパスに日本語があると読み込めない
主語と目的語を
//test.exe
import std.stdio , std.file , std.stream;
void main(string[] files){
foreach(path ; files){
writefln(path);
if(std.string.count(path,"test.exe") > 0) continue;
Stream fs = new std.stream.File(path);
writefln(fs);
fs.close();
}
}
これのexeに日本語パスのファイルをD&Dすると途中で終了してしまいます。
パスに日本語がなければ動くし、直接日本語を含むパスを入力しても動くのに、D&Dだけ動かないみたいです。
当方XPのdmd2.025だけどテスト.txtやフォルダ\テスト.txtをD&Dしても途中で終了せず…
txtの中身も「あいう!」にしてSJISとUTF-8形式で保存してD&D試してみたがforeach抜けた後のコードに到達する
108 :
107:2009/02/21(土) 20:10:59
フォルダをD&Dしたら落ちたけどそれは別に日本語フォルダじゃなくてもそうなる
109 :
106:2009/02/21(土) 20:53:51
レスありがとうございます
一瞬だけど、 ERROR invalid UTF8 sequence とかなんとか表示されて落ちるから文字がらみだとおもうけど・・・
一度通ったファイルを "コピー〜test.d" にしてD&Dしても落ちるから中身は関係なさそう。
>Stream fs = new std.stream.File(path);
の部分で止まってしまうようです。
XPでdmdは最近落としたものです。
-g -debug -profile -unittestでコンパイルしても
-release -O -inlineでコンパイルしても
中身は問題なさそうと言われつつも「このスレを全て選択→コピペ→SJISで保存」したものに中身を変えても
>>109で出てきた"コピー〜test.d"というファイル名に変えてD&Dしても
2バイト目が0x5cな文字と半角カナと半角スペースが混在した二重拡張子の悪質なファイル名
(コピー 〜 ニーモニック 一覧表.d.txt)にしてD&Dしても…ダメだ、落ちない
パス名はUTF-8で記述されていますか?
112 :
106:2009/02/21(土) 21:53:59
WinはANSI?だったから違うと思う。
コンパイルは
>C:\Dev\DSciTE\bud.exe -DCPATHC:\Dev\DSciTE\dmd\bin -IC:\Dev\DSciTE\lib -I.. -I..\.. -full -release -unittest -w test.d
>Exit code: 0
こんな感じです
113 :
107:2009/02/21(土) 22:21:15
ちょっと待て、いつの間にか
writeln(x"82A0 82A2 82A4 82A6 82A8");
がERROR invalid UTF8 sequenceで落ちなくなってるぞ
こんなの俺の知ってるwritelnじゃない、おかしい、おかしい
もし
>>106のwritelnが俺の知ってる以前のwritelnだとしたら…そういうことだ
writeln(x"82A0 82A2 82A4 82A6 82A8");
の挙動を試してみるべし
114 :
106:2009/02/21(土) 22:40:22
「あいうえお」でした
115 :
106:2009/02/21(土) 23:03:13
> Stream fs2 = new std.stream.File("D:\\Programing\\D\\あ.txt");
直打ちで通るから、D&Dで受けた文字コードを変換できれば通りそうだけど。
>>109 一瞬メッセージが出てくるということは、例外拾って例外をどこかに吐かせればいいのではないか。
>>106 druntime導入以降のphobosなら通る。
とりあえずwindowsでクリップボードに吐かせるSnippet
っても検索して引っ掛かったやつをそのまま移植しただけだが。
最新版ではuser32.libとか付属するからヘッダだけ落としてくれば動くはず
import std.string, std.utf;
import win32.winuser, win32.winbase, win32.windef; //
http://www.dsource.org/projects/bindings void setClipBoard(string str) {
if(OpenClipboard(NULL)==0) throw new Exception("failed to open clipboard.");
HGLOBAL wintext = cast(HGLOBAL)GlobalAlloc( GMEM_MOVEABLE, str.length+1 );
const char* strz = std.string.toStringz(str);
char* wintext_ptr = cast(char*)GlobalLock( wintext );
lstrcpyA(wintext_ptr, strz);
GlobalUnlock(wintext);
EmptyClipboard();
SetClipboardData(CF_TEXT, wintext);
CloseClipboard();
}
>>119 素晴らしい。
scope, enforceの使い方のお手本みたいな感じですな。
しかしこういった小物コードのいい集積所はないものか
>>119 これは・・・本物のD言語か
C++と変わらないパチモンコードを書いてた俺に衝撃が走った
C++もどきくらいの方がいいと思うよ
Dの機能フルで使っちゃうとバージョン変更に極めて弱いコードができてしまう
バージョン変更が怖くてフルに機能を使わない人がD言語を扱うのは難しい
実用的にD1.Xで充分と思っているが。
scope 演算子で質問。
scope(exit) {
// A
}
scope(exit) {
// B
}
と来たら A と B はどちらが先に処理されるの?
A と B の順番は言語的に保障されているの?
ありがとー
128 :
デフォルトの名無しさん:2009/02/23(月) 04:11:55
あ,URLをコピペしたら見られた
>>119 enforce か。初めて知った。
D2 って良さそうだなぁ・・・
D言語にしちゃスレの伸びが速い
>>130 真偽値として扱える任意の型の引数を取り、
真偽を判定して真ならそのまま返して偽なら例外を出すだけなので、
C++でも問題なく書ける。
T enforce(T)(T value, lazy Exception ex)
{
if (!value) throw ex();
return value;
}
T valueが真偽を判定されるべきものなのかどうかチェックする機構はない。
まあCとのバインディング用が主たる用途だろうからそんな機構を付けてもしょうがないのではあるが。
GDCの引き継ぎはまだかー
個人的にはDDLとかも開発を続けてほしいなぁ
引数に配列演算突っ込むとaccess violationと言われた
不便だ。もっと変数みたいに扱わせてくれ
137 :
:2009/02/23(月) 20:08:33
Dって普通に使ってたらめったにコンパイラのバグなんかに遭遇しない?安定してる?
コンパイラはオープンソースなの?
>>137 D1.0ならめったにコンパイラのバグには遭遇しない。あるにはあるけど十分回避可能。
何を指して安定と呼ぶかによると思うけど、なぜかたまにリンカが死ぬ。
よくタスクマネージャで殺したりしてる。あまり問題に思ったことはない。
コンパイラはオープンソース。コンパイラに同梱されてる。
140 :
:2009/02/23(月) 21:18:59
誰かdrutimeの導入方法をテンプレに書いてよー
誰かdruntimeの導入方法をテンプレに書いてよー
導入方法って何のこと?
よく分からないけどぼくのdmdだとcore.とかうごかない
145 :
141:2009/02/23(月) 22:10:48
>>145 druntimeは既にdmd.zipに導入済みなんだけど?
build-dmd.batなんて実行しなくてもcore.*は使えてるよ
あとdmd2.025ではdmcはいらなくなったみたいだよ
147 :
141:2009/02/23(月) 23:03:32
まじですか?ファイルが見つからないんでダウンロードからやりなおしてみます。
なんという恐ろしいOS……
D3.0はまだか…
D言語で 64bit OSって、素敵すぎる.
要gdcクロスコンパイラ(構築?)だったりで、
敷居高くて手がだせないけど.
※ソース、fxで落とせたけどieだとダメぽい?
XMLリテラルよこせよ
いらねえよw
まあ複素数リテラルに比べたらw
ボード線図とか描くときめちゃくちゃ使ったけどな。複素数リテラル。
XMLリテラルあったらどう便利なん?
>>139 配列を引数にとる関数meanofを作った時
double mean = meanof(arr[]);
は動くんだが
double sqrmean = meanof(arr[]*arr[]);
みたいな引数にすると動かない
arr[]+1 にしてもダメだった
環境はWinXPでD2.025
wxD・gtkD・QtD(・etc)、使うならどれが良いと思う?
AkinatorがDのマスコット知らなかったから教えておいた
>>161 俺はlinuxとwindowsで使うツールをgtkDで作ってる。
windowsだとちょっともっさりとしてるけど、一応使えてる。
マルチスレッドと相性が悪いらしくて、マルチスレッドと絡むとたまにウィジットが真っ白になったりするけど、気にしなければどうということはない。
165 :
161:2009/02/25(水) 01:47:33
>>162 Dには常にwktkで溢れてて貰いたいですね
>>164 やはりマルチスレッド周りは不完全ですか・・・
しかし諦めも肝心ですよね、gtkD使いたいと思います
ありがとうございます
DWTも選択肢に入れるとよろしいかと。
JavaのSWTにある程度サンプルが多いから、資料の点であんまり困らない。
ttp://www.dsource.org/projects/bindings/browser/trunk/win32 >(checked in by SnakE, 1 day ago)
>Fix for 'forward reference to CPtr!' in winnt.d
>The forward reference was caused by mutual import of winnt.d and
>basetsd.d. basetsd was only needing HANDLE definition from winnt so I
>just moved its definition to basetsd instead of importing winnt. This
>should cause no problems since winnt publicly imports basetsd anyway. The
>HANDLE definition should stay visible everywhere it was visible before.
そういえば前スレあたりで誰か困ってたけど、とりあえず対処がなされた模様。
つながった、ありがとう
>>168 非文字外のバックスラッシュ付き文字を文字列リテラルとする仕様を外し、
デリゲートのシンタックスシュガーに使うと。
こんな感じか?
array.map \(ref i) { i+=1; }
widget.onClick \{ doSomething; }
widget.onClick = delegate void() { doSomething; }
widget.onClick = delegate () { doSomething; }
widget.onClick = () { doSomething; }
widget.onClick = { doSomething; }
これだけあるのに
widget.onClick = \{ doSomething; }
わざわざ文字数増やす意味がわからないんだけど
ソースが増えてきたんだけど、
import folder/hello2;
とか無理なの?
例がよく分からないけどJavaみたいに
import folder.*;
みたいなのがしたいってこと?
ファイルがmain.d m1.d m2.d m3.d …って増えて20以上になりそうだから、
m1.d m2.d m3.d をフォルダmの中に入れて管理したくなった。
VC#はできたんだけどJavaは知らないです。
base\main.d -> module main;
base\dir\d1.d -> module dir.d1;
base\dir\d2.d -> module dir.d2;
base\dir\d3.d -> module dir.d3;
--------------------
module main;
import dir.d1;
import dir.d2;
import dir.d3;
void main() {...}
--------------------
bud main.d -Ibase\
やっつけだけどこんな感じで階層化できた気がする。
モジュールでこんな感じでできました、ありがとう
//hello.d
import std.stdio , mod.hello2;
void main(char[][] args){
writef(hello2);
}
//mod\hello2.d
module mod.hello2;
string hello2(){
return "hello";
}
でもhello2に()つけ忘れて実行したけどこれでも動くんですね。
>>173-174 いや、そこに書いてあるのはラムダ式。
auto square = \x => x * x;
とかだろ。
>>180 Dでは引数がない関数は括弧を省略することが出来る
string hello2() return "hello";
こうですか?
あんまり面白くないな
>>181 ラムダ式しか書けず、ラムダ計算できるが最終的にはデリゲートとして扱われるリテラル、という感じ?
auto square = x => x * x;
ラムダ式はC#風にこれでよくね?
他のことに使うとしたら何があるだろう
Dscite使ってるけど、もっといいエディタないかな・・・
ぽせいどん
\がバックスラッシュの形に見えないせいでまた日本人は苦しむのですね!
うぉるたん鬼畜!
Dに複素数演算があってよかった
工学系で複素数演算を使う人は多いと思うんだが、どうだろう。
いや別に構造体と演算子オーバーロードでいいし・・・
確かにユーザー定義リテラルがあればね。
浮動小数点が単にNaNのときってどの演算子を使えばいいんだろう?
n !<>= 0.0
とやっているが、正しいんだかどうだか
is式とnanプロパティ使って
n is n.nan
でよくね?
n == n
std.mathのisnan?
198 :
デフォルトの名無しさん:2009/02/28(土) 01:25:28
>>167 >そういえば前スレあたりで誰か困ってたけど、
それは俺。
とりあえず2.025でコンパイル通りました。
directxフォルダはまだ無理っぽいけど。
いい情報をありがとう。>167
あの14種類の比較演算子ってギャグだよな?
200 :
デフォルトの名無しさん:2009/02/28(土) 08:08:02
200
>>199 ギャグではないとおもうよ。必要な物だし。
あれが最善の表現方法かどうかはわからないけど、
少なくとも関数スタイルにするよりはなんぼかましだとおもう。
x.isLessThanEqualToOrGreaterThan(y) とか、
fpcmp(x, y, FpCmp.LESS | FpCmp.EQUAL | FpCmp.GREATER) とか、どうよ。
すごく
きもいです
あるいは名前をつけて、fpcmp(x, y, FpCmp.ORDERED) とかか。
演算子よりぱっと見で意味はわかりやすいが、いずれにせよ煩雑だな。
<(より小さい) >(より大きい) =(等しい)の組み合わせて出来てるんだから
比較不能を表す何かがあればいいんだよ
今は!の否定で無理矢理表してるからわかりにくい
Less, Equal, Greater, Unorderedの和集合は浮動小数点数全体に一致するの?
×浮動小数点数全体
○二つの浮動小数点数の関係の全体
でした。
それ以外にどんな二項関係があると思うの?
それがわからないから聞いているんです。
考えてみれば実数どうしで比較して、比較不可能ってのなんかおかしくね?数学的に。
>>209 Dの浮動小数点数 = 実数 ∪ {非数}
だから、なにもおかしくない。
ddbgを単独でGUI表示できるプログラムってある?
BOFに1000人くらい集まるようになれば来るかもね
しかしリンカが良く死ぬ。
回避方法とかあったりします?
ささやき えいしょう いのり ねんじろ
216 :
デフォルトの名無しさん:2009/03/05(木) 09:29:29
初歩的なことで恐縮なのですが…
dmdでコンパイルしたら.exeではなく.objが生成されました。
で、それを実行出来ないのですがどうすればいいでしょうか?
-c付けずに実行すれば実行ファイルができると思うが。
あるいは後に何も残らないが-runつけるとか
>>216 objは中間ファイルなので実行できません。
コンパイルした段階でなんかエラーメッセージ出てませんか?
何もエラー出てない限り実行ファイルは生成されないと思います。
219 :
デフォルトの名無しさん:2009/03/05(木) 15:03:55
>>216です。自己解決しました。
dmd.zipの他にdmc.zipも必要だったのでした。
そしてdmd.zipを解凍して出来た\dmdと\dmの\dmを
dmc.zipを解凍して出来る\dmに置き換えてやればいいとのこと。
その中のlink.exeが必要だったみたいなのです。
そして無事コンパイル出来ました。
皆さん有難うございました。
ついでに言っておくと、.exeのほかに.mapと.objも生成されました。
220 :
デフォルトの名無しさん:2009/03/05(木) 15:13:04
dmc.exeってC言語のコンパイラーなんですね。
ちゃんとコンパイル出来ました。
D言語と違ってそのままでも日本語を表示出来ました。
またD言語と同様に.exeのほかに.objと.mapが生成されました。
私は普段C言語はGCC&Cygwinを使っていますがそれでは.exeだけです。
だからびっくりしました。
DMD1系?
DMD2.025からdmc不要になったはず。
っつかCでも.objはできるような気が。
そうでないと分割コンパイルする意味がない。
ビルダがリンク後に自動で消してるだけだろ。
>>219 dmは置き換えるんじゃなくて一緒にしてしまえばいい
224 :
デフォルトの名無しさん:2009/03/05(木) 17:46:02
>>220です。
調べたらヴァージョンは2.011でした。
もっと新しいの使えよw
ちょ、さっき2.025ダウンロードして Hello,world コンパイルして確認したところだったのに。
Added buildable dmd source.
これ、ついに dmd のソース公開ってことですか?
Version D 2.026 Mar 3, 2009
New/Changed Features
* Escape string literals deprecated, see Bugzilla 2658
* Tripled speed of exp, expm1, and exp2. std.math is now less dependent on the C standard library.
* Added nested structs.
* Added buildable dmd source.
* Many changes to std.math for speed, accuracy, and Tango compatibility:
o Improved accuracy of exp, expm1, exp2, sinh, cosh, tanh on Mac OSX, and tripled speed on all platforms.
o Now using IEEE754-2008 camelCase names for isNaN, isFinite, isNormal, isSubnormal, isInfinity. Aliases for the old names have been retained.
o The non-functional nan(char[]) is replaced with NaN, getNaNpayload.
Bugs Fixed
* Bugzilla 1603: String literals bind to pointer types
* Bugzilla 1629: Link error: Previous Definition Different: blablah__initZ
* Bugzilla 1662: Falls back to libphobos if -debuglib isn't used when -g is
* Bugzilla 1681: cast(real) ulong.max == 0
* Bugzilla 2416: Slice of typedef'ed array should preserve the typedef'ed type
* Bugzilla 2597: auto return doesn't work for a variety of cases
* Bugzilla 2612: immutable not accepted wherever invariant is
* Bugzilla 2619: Locally-instantiated structs are not instantiated locally
* Bugzilla 2621: ref binds to rvalues of user-defined types
* Bugzilla 2622: ref returns not allowed in complex template
* Bugzilla 2623: Function type drops ref spec
* Bugzilla 2670: std.file.read() should read files of 0 length
* Bugzilla 2673: Static constructors sometimes do not run when compiling with -lib
* Bugzilla 2675: cannot foreach structs with copy constructor
* Bugzilla 2676: alias parameters not matched in concept if clause
* Bugzilla 2677: Alias type parameters not visible in concept-if clauses
* Bugzilla 2678: for loops are already assumed to terminate
* Bugzilla 2679: Spurious "warning - " messages and erratic behaviour with is(typeof({void function}()))
* Bugzilla 2684: Associative arrays have wrong opIndex signatures
* Bugzilla 2690: DMD aborts with MALLOC_CHECK_ set
要するにこれSymantec C++の一部だよね?
こんなすばらしいコードが見られるなんて、ありがたいことだ。
ありがたやありがたや
みんな気に入らないところ直してパッチ送ろうぜ
234 :
デフォルトの名無しさん:2009/03/06(金) 08:20:59
dmdはdmcで出来ている?
dmd本体はC++で作ってる。コンパイラがdmcかどうかは知らない。
dmdの出力をCOFFになるように改造できないかねぇ
>>236 この前から本家フォーラムで「optlinkは死ね」というタイトルで論争やってて、
いつまでOMF使ってんだとかそんな感じの話が展開してたから、
そのうちボランティア作業でなおる気がする
さりげなくバックスラッシュ文字列リテラルを多用してたんで直すの苦労したわ
今年はD3へ向けて色々変わりそうだ
optlinkって悪いの?何のリンカならいいの?
たまにドジしちゃうoptlinkちゃんかわいい!
うひょーとうとうビルドできるほどソース公開されたかー
うちのARMなGlanTankでも通らないかなぁ。やってみようかなぁ。
ARMでdmd使えたら面白いね
GUIとかどうやるのか知らないけど
x86しか生成できないから無理だろう。
一から書き直す覚悟が要ると思う。
これを期にGDCとLDCが活発化することに期待
static opCallを使った構造体をref付き引数を持つ関数に指定できなくなった
これってバグ?それとも仕様変更?
struct A {
int x;
static A opCall(int _x){x = _x;}
}
void func(ref A a)
{
}
int main()
{
func(A(3));
}
function main.Game.func (ref A a) does not match parameter types (A)
Error: opCall(3) is not an lvalue
248 :
247:2009/03/08(日) 11:28:13
いろいろと間違えてた失礼。正しいコードはこっち↓
struct A {
int x;
static A opCall(int _x){A a = {_x}; return a;}
}
void func(ref A a)
{
}
int main()
{
func(A(3));
return 0;
}
エラー内容(dmd v2.026):
function a.func (ref A a) does not match parameter types (A)
Error: opCall(3) is not an lvalue
>>247-248 struct A{
int x;
static A opCall(int _x){
A a={_x};
return a;
}
}
void func(ref A a){}
void main(){
auto a = A(3); //
func(a);
}
ref ってことは、昔の inout で、出力先がないとあかんってことだよね。
lvalue ではないってのは代入不可能ってこと。
逆に今までそんなコード書いていて大丈夫だったのかが気になるな。
251 :
247:2009/03/08(日) 12:56:01
opCallの戻り値を値型にしとけばスタックに確保されるんじゃ?
関数のほうは実はopAssign(ref)とかだから問題ないと思うんだ
C++だと構造体のコンストラクタとこういうことができたんですよ
Dはなぜかコンストラクタを持たせると怒られる
252 :
247:2009/03/08(日) 13:06:28
Dの構造体にはコンストラクタを持たせられない
そう考えてた時期が俺にもありました・・・・・
ちくしょー! うぉるたんまたやってくれたな!
ちょっと前のは怒られたのに、今のはこれで通った
struct A {
int x;
this(int x_){x = x_;}
}
void func(ref A a){}
int main()
{
func(A(3));
return 0;
}
なんか解決してしまいました。スレ汚しスマソ
DMCのBasic Utilitiesに含まれるcl.exeがAVG先生にワームだって言われた(´・ω・`)
>>253 avast先生も怒ってたなぁ
何でだろね
十分に進化した構造体はクラスと区別がつかない
Dでは最初から構造体は一応PODのつもりで設計されていて
今でもそれは変わらないと思う
構造体を操作するときに若干便利な機能が付加されただけだよね
#define class struct
初期のC++だとこんな実装があったとかなかったとか
>>247 構造体リテラルがあるよ
struct A {
int x;
}
void f(ref A){}
void main() {
f(A(3));
}
>>252 ChageLog見れば分かるけど2.019から構造体コンストラクタ使えるよ
Dで書いたものをC++に移植しようとしているのだが……
テンプレートミックスインでどうしても引っかかる。
マクロ使うしかないのか?
仮想関数の継承をミックスインでやってたので、
設計をいじるかマクロ使うかの二択なもんで。
安全テンプレート付きマクロって何気に使いやすいなあ
継承じゃない、オーバーライドだった
>>265 interface I {
void f();
}
class D : I {
mixin T;
}
template T() {
void f() { }
}
auto d = new D; //OK
d.f; //OK
C++でtemplate Tをただstruct Tとして継承してusingしても無理で、
struct TがIを継承していないとならない。
thisを返すCRTPで、かつ何かのインターフェースを継承するときにはこっちの方がはるかにやりやすい。
この連想配列にどうやって明示的にキーを足すんだろう
string[2][string] hash;
// 以下全部コンパイル可 RangeError
hash[begin] = new string[2];
hash[begin] = null;
hash[begin][0] = "";
ついでながらこれらもコンパイルエラーにならない
特に後者は言語仕様上のバグである気がする
hash[begin] = "";
hash[begin] = [0,0];
>>267-268 何かおかしくね?それだと、2つの連想配列でしょ?
3つ目にしたかったら、連想配列追加しないとだめじゃないかい?
もしくは、連想配列に2要素の何かってことなら、添え字が逆。
>>269 いや、そこはあってるんじゃないの。
C風の書き方すれば
string hash[string][2];
でしょ。
>>270 え!そうなのか??
ROMってるだけじゃおいてかれるな。すまない。
string[string] hash[2]; で
hash[0]["x1"]="";で
hash["x2"] = cast(string[2][string])hash["x1"]; が増長キャストかな??
Dまたは日本語でおk
うーん???
import std.stdio;
void main() {
string[2][string] hash;
writefln(typeid(typeof(hash["key"])));
writefln(typeid(typeof(["a","b"])));
hash["key"] = ["a","b"];
}
immutable(char)[][2]
immutable(char)[][2]
core.exception.RangeError@a(7): Range violation
バグレポートあげといてよ
どうなるべきなのかがよくわからんのですが・・・
string[][string] hash;
hash[ "key" ] = ["a", "b"];
writefln( hash["key"] );
=>[a,b]
これなら行くのね(D1
string[2][string] hash;
でやると、
main.d(7): Error: cannot assign to static array hash["test"]
というエラー。
静的配列が問題なのかな。
おお
なるほど
D2でも[2]を[]にして動的配列にしたら動いた
GJ
with内で、現在withで参照中のthisにあたるデータにアクセスできたらいいのにと思う。
↓こんなときのために
with (new Control) {
text = "mycontrol";
dock = DockStyle.FILL;
with (new Control) {
text = "childcontrol";
width = 200;
dock = DockStyle.RIGHT;
parent = with.outer;
}
with.outer.controls.add(with.inner);
}
with.outer.controls.add(with.inner);
こうじゃなくて?
...
parent = with.outer;
with.outer.controls.add(with);
}
...
公式で「MyDll D言語DLLの書き方デモ」として例示されてるコードを参考に
適宜修正しながらDLLの作成と静的リンクに挑戦してたんだけど、2.026だと、
リンク先のdllにstatic thisが含まれてると
Error 42: Symbol Undefined _D5mydll12__ModuleInfoZ
って感じのエラーが出る? 2.025にしたら大丈夫だった。
あと、gcstub.objをリンクしないと実行時に
object.Error: Access Violation
ってエラーが出るようになる? こっちは2.025,2.023でもダメだった。
>>281 もうちょっと妥協するとして、
with(auto o = new Object){ ... }
が通るようになれば楽だな。
Control c;
with(c = new Control){}
これなら通るけど?
たしかに内部クラスとおなじにするならそうなるかも
なんか意味的にキモく感じたからinnerとか付けたけど
皆さんはこういう場合にはどんな感じに書いてますか?
そもそも、with はキモイから使わない。
超短期スコープ以外で使うのはダメだろう。
withなんて有ったのか
VBにもあったよな懐かしい
流れるようなインターフェース(fluent interface)
(new Control)
.text("childcontrol")
.width(200)
.dock(DockStyle.RIGHT)
.parent(with.outer);
setterは値返さないからthis返すように設計しとけば使えるけど
そういうやり方もあるという
setterは値返してくれないと困るだろ…
setterの仕事はsetしたら終了じゃないの?
ゲッターロボ
textbox1.Text = textbox2.Text = s;
とか書けないじゃん。
>コマンド・問い合わせの分離
でも皆
if ((fp = fopen("smpl.txt", "r")) == NULL)
みたいなコード書くんだよね
constで思い出したんだけど、constメンバ関数の場合でMutexオブジェクトのロックとかしたいときってどうすればいいの?
C++ならmutable修飾子つければ行けたけど…Dではそういうのはなかったよね?
それはイディオムだからなぁ
こんな風に書いたらかえってわかりにくいだろ
fp = fopen("smpl.txt", "r");
if (fp == NULL)
ifの中にいっぱい文字があるのがやだから
fp = fopen("smpl.txt", "r");
if(fp)
みたいに書くわ
D言語的には、ifによるnullチェックをやめてtryと例外使えってこったな。
ライブラリ側が対応してない場合にはstd.contractsのenforceとか?
>>294 それは状態を変更しない問い合わせメソッドを用意しろと言う話であって、
状態を変更するメソッドが値を返さないことはさほど重要ではないと思うのだけど。
301 :
294:2009/03/15(日) 20:55:13
setterの実装に値をセットする以外のコードを書かされるのは嫌だなぁ……
かと言って
>>293が通らないってのも、変数代入との一貫性が失われちゃうのか。
プロパティのgetter/setterって概念をきちんと言語に盛り込んで、
textbox.text = sはsを返すって仕様にすれば両立できるのかな。
C#とかは
>>293みたいなコード通ったっけ?
>>297 俺はまとめる方が分かりにくいよ
代入文と条件式を一まとめにできる事自体どうかと思う
イディオムの読みやすさはそれがイディオムだから読みやすいだけで
イディオムだと知らなかったら読みにくいでしょ
RPCとかまで考えると、setter が無闇に値を返すのはまずい。
setterは右辺値そのまま返せで良くね?
DにはDのsetter/getterの作法があるんだしC#と同じでいいやん
textbox1.Text = textbox2.Text = s;
は
textbox2.Text = s;
textbox1.Text = textbox2.Text;
と等価ってことで
textbox2.Text = s;
textbox1.Text = textbox2.Text;
は
textbox2.Text(s);
textbox1.Text(textbox2.Text());
と等価ね
>>304 mono入れて実験してみたけど、getterは呼ばれなくない?
obj.prop = exprがexprとして評価されるだけだと思う。
dmd2.0.25でstd.process.spawnvpにオプション引数を設定しても、オプション引数が渡されないんだけど、バグかな?
>>312 std.process.spawnvp って何?
だめだ、エスパーできんw
関数呼び出しのスタックから大域脱出するのに例外を使うのはやはりお行儀の悪さを感じてしまう……
つtypedef Exception GlobalExit;
馬子にも衣装ですね、わかります。
C++0xってIEEE 754は対応しないんだよな?
何故?
今そんな話を?
.NaNと.infinityをモリモリ使いたいんで、
C++で全部再現するのが面倒だったなあと。
interface IA{void a();}
interface IB:IA{void b();}
interface IC:IA{void c();}
class CB:IB{void a(){} void b(){}}
class CC:CB,IC{void c(){};}
これでコンパイルエラーでないのおかしくね?@dmd 2.026 & 1.041
これのせいで2日くらいハマった…バグが出る時とでないときがあるらしい…
どこがおかしいのかわからねえ
323 :
321:2009/03/21(土) 02:57:05
>>322 説明不足スマン…
仕様だと継承するinterfaceをスーパークラスとは別に指定した場合、interfaceの関数は継承しないことになってる。
> インターフェイスを再実装するには、その全ての関数を実装しなければなりません。 基底クラスからの継承はされません
つまり、
>>321のコードはCCにおいて、ICを指定したためにIAのa()関数が継承されないことになる。
本来なら
class xxx.CC interface function IA.a isn't implemented
とか出るべきでは?ということ。
D言語研究の既存のページが編集できないのはなんとかならないんでしょうか
たまにスパムを見つけては消してるんで、新しいページ作成削除は誰でもできるみたいですが
バージョンアップまだ?
>>323 削ってみたけどこれでいいかな?
interface I1
{
void a();
}
interface I2 : I1
{
}
class C1 : I2
{
void a(){}
}
class C2 : C1, I2 // invalid-accept
{
}
>>329 それはアクセプトされるべきだと思うけどなあ
>>330 そう? interfaceの継承とは何かもっと詳しく定義しないといけないのかな
332 :
331:2009/03/22(日) 05:20:31
interface A{void a();} interface B : A {}
と
interface B {void a();}
のときBだけ見たら両方同じなのかなと思ったんだけど
IA 自体が基底インターフェースになってるから問題ないんじゃないの?
インターフェース単位で vtbl 作られるという形なので、
IC は IA に対する void a() が存在していればそれで問題ないと思う。
無関係のインターフェース間で同名の関数がある場合、
それは区別しないといけない。
意味論的にコンフリクトするケースか。
interface IB : IA
interface IC : IA
の IA は、同じものを指しているのか、違うものを指しているのか
ってことになるか。
同じものだ(ICはIAの拡張部分のみだ)とみなしているなら、
再実装を要求しないのはおかしくないし
(「IA自体」の再実装は class CC:CB,IA,IC と 書いていないので要求していない)、
違うものだ(ICの一部だ)とみなすなら、再実装を要求しないといけないと。
仕様には書かれてないよね?
>>333 それじゃ多重継承と同じ問題があるような…
インターフェースは「こういう関数を持って下さい」という事しか指定しないから
たとえ名前が被っても、その名前の関数を用意するだけなので問題は起こらないのだ!
多重継承なんかとは違うのだよwwwwwwww
ってのがインターフェースじゃん
名前が被ったら被ったインターフェースごとに同名の関数用意させられるんじゃ意味がない
>>333,335
interface IA{ void a(); }
interface Ia{ void a(); }
interface IB:IA{}
class CA:Ia{ void a(){} }
class CB:CA,IB{ }
で、Ia.aを実装したCAの派生クラスCBではIA.aが実装されてないといけないけど、
これで通るから、仕様はともかく実装上は区別されないっぽいな。
337 :
331:2009/03/22(日) 21:43:07
>>335 そうそう
interfaceはsignatureが同じなら同じメソッドと見なすもんだ
>>332は正しいので
>>329はコンパイルできるべきではなくて
>>312,323の言うように
class xxx.CC interface function IA.a isn't implemented
とでも表示してエラーになるべき
でOK?
interface IA{ void a(); }
interface IB:IA{ }
class Ca { void a(){};}
class CC:Ca, IB{ }
これも通る。
祖先クラスは関数さえ実装していれば祖先インターフェイスを継承している必要すらないみたい。
派生インターフェイス=祖先インターフェイスの関数が実装されていることを前提としたインターフェイス
って解釈すればこっちの実装もありかな。
>>340 > 派生インターフェイス=祖先インターフェイスの関数が実装されていることを前提としたインターフェイス
ごめんよくわからん
「CCはCaからaを継承しているからaの実装を持っている」→
「CCはIBの制約を満たしている」→「CCはvalid」
と言う論理なら
> インターフェイスを再実装するには、その全ての関数を実装しなければなりません。 基底クラスからの継承はされません
この仕様に違反しないか?
>>340-341 つまりIBのCCに対する制約には2つの考え方があって;
(a)「CCがvoid a()を持っていること」
(b)「CCで新しいvoid a()を定義すること」
今の仕様は(b)なのに実装は(a)になっているという問題か
>>341 「IBを実装すると言ったが、IAを実装するとは言ってない。だから、
IBの関数なら再実装するが、IAについてはキャストできれば十分なのだ!」
って理屈。
IAにキャストできるってことは、IAかその派生クラスを継承してる必要があって、
そして当然IAの要求する関数を実装してる必要もある。
だから結局IAの関数は実装されてる必要があるけど、キャストに必要なそれに
ついては(再実装の話じゃないから)基底クラスから継承してもおk、って感じ。
>>343 「
interface IA{ void a(); }
interface IB:IA{ }
class Ca { void a(){} }
class CC:Ca, IB{ }
IBの定義が空っぽなので任意の子クラスで実装しなければならない関数はない.
だからIBを継承したCCでは何も実装する必要はない.
ただしCCをインスタンス化するためには祖先のどこかでvoid a()を実装していなければならない」
ということかね.それなら
「a()をXで実装しなければならない」
interface IB {void a();}
class X : IB { ... }
「a()をXで実装するか,あるいは,a()がXの祖先クラスで実装されていなければならない」
interface IA {void a();}
interface IB : IA {}
class X : IB { ... }
を区別することができるが・・・デメリットや不整合になる点はないのかな
しかしacceptされるものだとしてもだ
何らかの条件でバグが発現するというのだからやっかいな問題だね
具体的に最初に言われたバグが起こるコードを示してもらえたらいいのだけど
346 :
321:2009/03/23(月) 17:50:26
>>345 頑張って再現してみた。
interface IA{void func();}
interface IB{}
interface IC: IB, IA{}
interface ID: IC{}
class CA: IC{void func(){}}
class CB: CA, ID{void func(){}}
void main()
{
ID c = new CB;
c.func();
}
これでバグ(Access Violation)が発生する@dmd2.026…バグを回避するにはIDを
interface ID: IC{void func();}
ってして改めて実装しなければならない関数を指定する。
……ここまで簡略化する際に気付いたけど、
>>321のとこのバグは関係ないね。
>>321に関連する議論に意味がないわけじゃないけど。
>>346 よく再現できたね
何がどういうバグなのかわからんのだがw
Visual Dがついに・・・
いや、やつならD#とかやりかねないな
D#よりD/CLIのほうがほしい
353 :
321:2009/03/25(水) 10:48:03
>>352 おぉ、ありがとうございます。バグ報告お疲れ様です。
CLR上で動かしたらオリジナルより速い、なんてな。
DとC#の速度を比べればそうはならんでしょ。
C#ではなく、C++/CLIのアンマネージドコードと比べるべきなのでは?
C++/CLIで書いてるとこをD/CLIで書きたいなぁ・・
Tangoもうじき新しいバージョンきそうだな
vimの補完機能ってD言語で使いたいんだけどどうすればいいの?
struct Waha {
int a;
ref int func(int L=__LINE__, string F=__FILE__)() {
return a;
}
}
void main() {
Waha w;
w.func();
}
________________
variable hoge.Waha.L only parameters or foreach declarations can be ref
variable hoge.Waha.F only parameters or foreach declarations can be ref
どういうこと?(´・ω・`)
funcのref外したら直るけど DMD2.026Win
型なしラムダまだー
Tango 0.99.8 Sean released
* Final refinement of the IO
* JSON parser/builder
* FTP adapter for the VFS by Lester L. Martin II
* Serial port support by Robin Kreis
* Inter-thread communication by Steven Schveighoffer
* /dev/null support by Fawzi Mohamed
* Random framework by same Fawzi
* BigInt by Don Clugston
* Updated for DMD 1.041, including Mac support
* Support for LDC
* OpenSolaris support by BlueZeniX
* New API docs courtesy of Aziz and Moritz
* More containers such as HashFile
365 :
デフォルトの名無しさん:2009/03/28(土) 01:03:46
Tango 0.99.8 前のバージョンは落とせないのか
これは…あんまりだorz
以前のバージョンを使うのか…?
あんなにみんなが焦がれた大量破壊変更なのに。
といっても、それほど苦労せずに移行出来ると思うけど…
Bufferの機能分岐がちょっと面倒だけど、基本的にそれ以外は難なく移行できたな。
* FTP adapter for the VFS by Lester L. Martin II
WebDAVまだー?
でも一番上のimport関係のバグが放置されてるんだよなあ・・・orz
すみませんが教えてください。
下記のコードがobject.Errir: Access Violationになってしまいます。
どこか間違えてますでしょうか?
dmd 2.026で確認しました。
import std.stdio;
int main(string[] args)
{
A foo = new A();
writefln("%s", foo.iX.y()); // 5
X* x = &(foo.iX);
writefln("%s", x.y()); // object.Error: Access Violation
return 0;
}
struct X {
int function() y;
}
class A {
this() {
auto dg = &b;
iX.y = dg.funcptr;
}
int b() {
return 5;
}
X iX;
}
writeflnの%sにintをぶっこんでるからじゃないの?
>>372 非静的なメンバ関数は隠し引数thisを持つ(EAX経由で渡される)が、その関数をiX.yに代入した時に引数が消えているから。
やったーtagsデキタヨー
376 :
372:2009/03/29(日) 22:59:35
>>374 thisの情報が消えてしまったから、という理解で正しいでしょうか?
ということはこのコードのように非静的関数をCへのIFっぽく静的関数として扱う
ことはできないということですね。
そういう場合は泥臭く(?)下記のように書くしかない?
import std.stdio;
A foo;
int main(string[] args)
{
foo = new A();
X x;
x.y = &func;
writefln("%s", x.y()); // 5
return 0;
}
int func() {
return foo.b();
}
struct X {
int function() y;
}
class A {
int b() {
return 5;
}
}
>非静的関数をCへのIFっぽく静的関数として扱う
ごめんわからんのでkwsk
378 :
372:2009/03/30(月) 07:37:24
>>377 わかりにくくてすいません。
要するに...
・関数ポインタの集合をもつ構造体を定義する(C,D互換性もたせて)。
・C側はその構造体を引数にもつエクスポート関数を実装したDLLを作成する。
・D側から(LoadLibrary, GetProcAddressして)そのDLLのエクスポート関数を呼び出す。
・C側からは構造体の関数ポインタを経由してDのメソッドを呼び出す。
ということがやりたいです。
すいません、サンプルコードかければいいんですが時間が…。
thisを別に渡せばいいのでは…?
Cではむしろこっちの方が普通だと思うのだけど…
import std.stdio;
int main(string[] args)
{
auto hige = new A();
X x;
x.y = &func;
writefln("%d", x.y(cast(void*)hige)); // 5
return 0;
}
int func(void* hige) {
return (cast(A)hige).b();
}
struct X {
int function(void*) y;
}
class A {
int b() {
return 5;
}
}
IFってインタフェースか?
たまに見かけるけどどこの業界でIFなんて略してるんだ
せめてI/Fじゃないとわからん
タスクトレイにアイコン表示するのってどうやればいいの?
>>381 Win32APIのタスクトレイ関連機能
そうか・・・
>267-280について。
ttp://d.puremagic.com/issues/show_bug.cgi?id=2732 real[2][int] hash = null;
real[2] v = [3,4];
*(hash[0])=1; // 代入できてしまう typeof(*hash[0]) -> real
write(hash[0]); // -> [1 0] 一方 new real[2] -> [nan nan]
real[1] w = [3,4];
// コンパイラは左辺と右辺の型を知っているのにコンパイル時エラーにならず、
// 実行時にobject.Exception: lengths don't match for array copy.となる
この二つの問題って既に報告されてたっけ?
385 :
372:2009/03/30(月) 21:20:10
>>379 D同士ならそのとおりやるし、C同士でもやるんだけど…。
Dで実装したクラスのメソッド(非動的関数)をCから呼びたい。
Cで作ったDLL
export int CFunc(struct _IF *if)
{
printf("%d", if->y());
return 0;
}
Dで作ったプログラム本体
int main(string[] args)
{
LoadLibrary(), GetProcAddress()でCFunc()をロード。
A a = new A();
X x;
x.y = &(a.b);
CFunc(&x);
return 0;
}
みたいに。
ちょっとちゃんとコード書いてきます。。。
>>380 わかりにくくてごめん。
でもInteface用のclassって class CFooIF みたいに命名しない?
しません。
388 :
372:2009/03/30(月) 23:14:38
>>387 おぉ、はい、そうです。
最初はそれを考えたんですが、C側でDのインスタンス(HigeHandle)を意識する
させるのがなんだかなぁと思って
>>376しか方法がないかと考えておりました。
ここまで手助けして頂けたので後は考えてみます。
どうもありがとうございました。
Tango次のバージョンではスタックトレースきそうだな
trunkでtango.core.stacktrace.*が追加されてる。
プログラミング初心者だけど、Dでランチャー作ろうと思ったけどWin32APIでウィンドウ出すところでつまずきました、完。
Alias Thisはポインタ取れたりするんだろうか?
ともあれ、静的に解決できるアダプタを作るのがかなり簡単になる面白い機能だな。
opDotと合わせると継承不要になる場面がかなり多くなりそう。
Qt使えるようにして
Windows + Rで呼び出してるからランチャーは要らない
いいかげんWindowsのサンプル更新しろよって話か。
一応更新履歴のページに書き換えの必要な部分について書いてあった気がする。
397 :
391:2009/04/01(水) 19:54:23
いままでD2を使ってたけど、D1の方がいいかと思い始めてる
>>397 自身を初心者だと思うなら、D1の方がやりやすいと思うよ
試験的実装について思考を奪われないで済む
もちろん僕はD1!
俺はD2一択だがな!
今回はバグ取りばかりだな。あとはOPTLINKの改善を持ってD2もいいところまで行きそうだ。
TangoのD2対応はどこまで進んでいるのかな?
>>400 相変わらずdruntimeをガン無視しつつ、Winで大量のエラーをはいてコンパイルできない状態って感じだな…
最新のコミットは1週間前
Merged from trunk -r 4021:4401 This did not include runtime (lib) which may no longer be built as it is now part of the compiler.
>>401 D2がbetaじゃなくなるまでサポートしない気なのかね
やっとalias thisきたか。
つぎはstatic引数だな。
dmdのフォルダ構造変わってない?dflはwindowsフォルダへ入れればいいのかな?
>>407 Macサポートがついてから変わったよ(実行ファイルの名前が同じになるからかと)
>>407 どこでもいいよ
dmd\src\druntime\importに入れておけばsc.iniを編集しなくてもいいけど
D1ってパスに日本語がはいってるを読み込んだりできるの?
できるけど
じゃあD!にかえよ
std.path.joinがWindowsだと引数を三つ以上渡しても無効なの、いつ直るんだろう?
>>413 patch書いてくれたら投稿しとくけど
415 :
413:2009/04/03(金) 02:18:33
*** C:\D\dmd\src\phobos\std\path.d Tue Sep 2 22:35:10 2008
--- C:\D\dmd\src\phobos\std\path2.d Fri Apr 3 02:14:45 2009
***************
*** 684,689 ****
--- 684,691 ----
}
version (Windows)
{ // The other version fails unit testing when under windows
+ if (!more.length)
+ {
if (!p2.length)
return p1;
if (!p1.length)
***************
*** 722,727 ****
--- 724,732 ----
}
}
return p;
+ }
+ // more components present
+ return join(join(p1, p2), more[0], more[1 .. $]);
}
}
416 :
413:2009/04/03(金) 02:21:16
patchとかよく分からないけど、これでいいのかな?
やってることは、linux版と同様にif (!more.length)とreturn join(join(p1, p2), more[0], more[1 .. $]);を付け足しただけ。
417 :
413:2009/04/03(金) 02:29:53
*** C:\D\dmd\src\phobos\std\path.d Fri Apr 3 02:27:19 2009
--- C:\D\dmd\src\phobos\std\path2.d Fri Apr 3 02:27:03 2009
***************
*** 686,691 ****
--- 686,693 ----
}
version (Windows)
{ // The other version fails unit testing when under windows
+ if (!more.length)
+ {
if (!p2.length)
return p1;
if (!p1.length)
***************
*** 724,729 ****
--- 726,734 ----
}
}
return p;
+ }
+ // more components present
+ return join(join(p1, p2), more[0], more[1 .. $]);
}
}
418 :
413:2009/04/03(金) 02:30:38
415は間違い
>>418 ごめんLinux環境がすぐ用意できないので遅くなる
>>413 こうなるでおk?
import std.stdio, std.path;
void main()
{
version(Windows){
writefln(join("d","dmd","src")); // d\dmd
}
version(Linux){
writefln(join("d","dmd","src")); // d/dmd/src
}
}
421 :
413:2009/04/03(金) 04:13:47
そう
Windowsだと第三引数以降が無視されちゃってる
んで、join関数のversion(Posix)の中身のように
if (!more.length)
{
・・・
}
// more components present
return join(join(p1, p2), more[0], more[1 .. $]);
というように囲ってあげれば、とりあえずは仕様通りになるんじゃないかと思うわけで
version(Linux)じゃなくてversion(linux) or version(Posix)か
了解
alias this使えばもはや強いtypedefとかほとんど必要なくない?
強いtypedefよりプロパティとか自由にできていい感じだ
typedefの方が軽量じゃね?
alias thisとかの使い分けのガイドラインが欲しいぜ
Effective D的な。
428 :
413:2009/04/04(土) 00:07:42
鯖が移動していたのに気づかなかった俺。専ブラのせいなのかしら。
あーMSあたりがDをパクったの出してくれんかなー。
文法は概ねD程度でいいから、ちゃんとGC・例外・テンプレート関係もサポートしつつネイティブが吐けて。
でもアプリケーション用に.netランタイム並の高機能な標準ライブラリが付いてて、
でもちゃんとリンカがあって必要な分だけ実行ファイルにリンクできるからランタイム要らずで。
俺はVisualStudioのフォームデザイナでd.winforms.FormのデザインをGUIで編集しつつ、
インテリセンスにべったり寄りかかってコード書きながら、
合間合間にリファクタリングブラウザでクラスやメソッドの設計を調整していくわけですよ。
そしてテストを実行してVisualStudio上で緑のバーが伸びきったことを確認すると、
生成されたネイティブなexeファイルを自分のプログラム用フォルダに放り込んで悦に入ると。
括弧の対応とかセミコロンを忘れてコンパイラが無限ループに
なっちゃうとき、どこが問題か見つける方法ってない?
alias thisはクラスや構造体をホイホイ扱うためのもので
typedefは移植性を上げるためのものだと思う
2.027@winがほとんど動かないのって俺だけ?
>>432 型に小さなラッパをつけたい場合の用途も結構大きいと思うが。
typedefで済むんならtypedefでいいんじゃね。一行だし。
仮にtypedefをalias thisで完全置換したらわかりにくくなりそうだ。
まあ必要ないってこともないんじゃないかなと思う。
intと等価な型を宣言したいときなんかはalias thisは使えないかな
>>433 ちょっと動くってことはimport関連のパス間違ってるんじゃないか?
sc.iniとか調べてみるといいよ。
動かないときは
全部消して入れ直すべし
あれ???
typedefした/された型同士は相互に代入できなかったんじゃなかった?
リテラルは暗黙変換されるのか
知らなかった
>>436 完全に等価なのは無理だよね
テンプレートでは外側の型が優先されるから
そこでも適切に化けないと引っかかったりする
誰かD言語wiki作ってよ
既存のwikiじゃ駄目な理由でもあんの?
導入方法とか詳しく書いてほしい
詳しく書かないとわからないような人が
この言語を使うのは難しい
>>444 最低限どの導入か書いてくれないと
dmdとかだと展開してPATH通すだけだし
今から新しくwikiを作ったり導入方法を書き下ろす必要があるのかな
既存の情報だけでこの10年近く大勢のの人間が導入できたというのに…
もうあるからいらね>wiki
イラネ
Dsciteどこいったの?
お亡くなりになりました
Version D 1.043 Apr 6, 2009
New/Changed Features
* Added FreeBSD 7.1 support.
Bugs Fixed
* Bugzilla 2796: Dependency on libstdc++-v3
そうか
バージョンアップはいいことだ
Dsciteのページが無くなった
Version D 2.028 Apr 7, 2009
New/Changed Features
Bugs Fixed
* Bugzilla 2812: sqrt(2.0) is about -2.7341e-53
早っ
そして酷いバグだ
四則演算を間違うバグの次にひどいかもしれんなw
ちゅうかテスト書こうよ・・・
DStressのD2版必要だよなあ
言語組み込みの単体テストは何のためにあるのかw
Internal error: ..\ztc\cod4.c 353
どうしたもんかな
unittest書きまくって送ったら導入してくれるだろうか?
店員「当店のポイントカードはお餅でしょうか」
おれ「えっ」
店員「当店のポイントカードはお餅ですか」
おれ「いえしりません」
店員「えっ」
おれ「えっ」
店員「まだお餅になってないということでしょうか」
おれ「えっ」
店員「えっ」
おれ「変化するってことですか」
店員「なにがですか」
おれ「カードが」
店員「ああ使い続けていただければランクがあがってカードが変わりますよ」
おれ「そうなんだすごい」
店員「ではお作りいたしましょうか無料ですよ」
おれ「くさったりしませんか」
店員「えっ」
おれ「えっ」
店員「ああ期限のことなら最後に使ってから一年間使わないときれます」
おれ「なにそれこわい」
店員「ちょくちょく来ていただければ無期限と同じですよ」
おれ「なにそれもこわい」
店員「えっ」
おれ「えっ」
そもそも、特定の値(ビットパターン)でコケるバグの unittest なんて
全ビットの組み合わせになるように書かない限り
どうやったって書けないぞ。
でも、最近はCPUパワーで何とかなっちゃうのかね。
32bitなんか一瞬でカウントしちゃうし、確かにそういうテストを書くこともあるんだが…
そこは別の言語の実装を使ってDのソースを書いてだな
別の言語の実装の標準ライブラリとリンクすれば…
いやいや、sqrtなんてマシン語レベルで1命令だろ。
だったらバグらなかったんじゃね?
逆にどこをどう間違えたらそんなバグが出るのか興味ある。
最適化かなんかのバグかね?
471 :
デフォルトの名無しさん:2009/04/11(土) 11:07:19
bugzillaの方を読むと、-O 有りの時に
リテラルをsqrtに渡した結果がおかしかったらしいから
CFTE周りだと思う。
>471
ageちまった、すまん。
言語自体がバグってるときにunittestって有効なのかな
今回の場合はさすがに意味ありそうだけど
コンパイラのコードに unittest 入れるってことだろ。
でも、dmd は C++ で書いてあるわけだが。
CppUnitとか使ってよね・・・
何も使ってないだろ今
うん。理想は素晴らしいのに、コンパイラ自体はダメダメ。
いわゆる医者の不養生。
andrei作の新phobos触った人いない?
感想とか求む
ええい破壊的変更はまだか!
バグといえば
Internal error: ..\ztc\cgcod.c 1549
とか出てコンパイルできないバグも全然直らないし
interfaceとclassを複数継承しているとき、
両方の型がある関数オーバーロードの解決ってどうなっているんだっけ。
曖昧だからダメといわれるのだろうけど、優先順位は付けられるのかしら。
http://www.kmonos.net/alang/d/2.0/function.html >もっともよく マッチする関数が選択されます。 マッチの適合度は以下の4段階あります
> 1. マッチしない
> 2. 暗黙変換によるマッチ
> 3. constへの変換によるマッチ
> 4. 正確なマッチ
>複数の関数が同じマッチ適合度にある場合、 partial ordering によって最適なマッチが決定されます。
> Partial ordering では、もっとも特殊化された関数が選択されます。
> 他と比べてより特殊化されていると言える関数が無い場合、 曖昧な関数呼び出しとしてエラーになります。
以上よりこんな感じに優先順位がつくはず。
interface A{}
class B{}
class C: A{}
class D: C, A{}
class E: B, A{}
void func(A){}// (a)
void func(B){}// (b)
void func(C){}// (c)
void main(){
func(new D);// 2. 暗黙変換によるマッチで、(a)より特殊化されている(c)が呼ばれる
func(new E);// 2. 暗黙変換によるマッチで、(a)と(b)であいまい
func(cast(B)new E);// 4. 正確なマッチで(b)が呼ばれる
}
>>481 ありがとう。
結局Eがやりたいのだが、やっぱ曖昧なままか。
派生を外してopDotやalias thisでどうなるかも試してみる
更新まだかなー
opInって使い道ある?
inの役割を踏まえたらopIn_rしか使わないような
00 名前:null[sage] :2009/04/17 12:37
☆ チン
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < D.NETマダー?
\_/⊂ ⊂_ ) \________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
他にもっとやることあるから.NETはまだいいよ
C#に契約プログラミングが導入されればなあ
言語仕様でunittestは神過ぎた
494 :
461:2009/04/18(土) 00:07:50
最小コードが抽出できた
Internal error: ..\ztc\cod4.c 353
struct S { real v; }
S f() { S s; return s; }
const(S) g() { return f(); }
再現条件:
Sのメンバにrealが含まれている
gの返り値はconst(S)である
fを直接gの返り値としている
古いコードで瑣末なエラーだが……
Dの言語仕様の中でC#に無い機能って契約とテンプレートしか思いつかなかったけど
なんか他にも言語仕様上ででっかい違いある?
クラス乱立vsそうでもない
typedef
スコープガードは?
phobosのsocketで構造体をsendしたいんですけどやり方がわかりません。。
socket.sendでvoid[]にcastしようとすると
'cannot implicitly convert expression '
って怒られるしどうすれば良いのでしょう……
S s;
auto d = (cast(void*)&s)[0 .. S.sizeof];
としてみたら?
foreach (v; s.tupleof)
できました、ありがとう!
再び質問なのですが、受け取ったchar[]なバイナリデータを構造体に戻すにはどうすればよいのでしょうか。
void[] data;
assert(data.lengh >= S.sizeof);
auto s = *(cast(S*)data.ptr);
エンディアンとか考えなくていいのか?
>>504 こういうチェックってassertでいいの?
それとも、普通にifで比較して例外投げた方がいい?
実行時にdata.lengh < S.sizeofとなる可能性があって、それが困るなら、
普通にifで比較して例外投げ。
コーディングのバグとしてしかありえず、それを検出したいのなら(関数の使い方が間違っているとか)、
assert。
enforce(data.lengh < S.sizeof);
Windows用というかC用のインターフェース関数を作ってるんだが、
MBSってどの型にすべきなの?
phobosではtoMBSz(string)はchar*になってるけど、ubyte*にすべき?
また、wchar*をwstringに変換する関数がないっぽいんだけど
みんなどうしてるの?
int len = wcslen(buf);
wstring str = buf[0..len].idup;
みたいな感じ?
ubyteだろうな。
俺は
typedef ubyte achar;
alias invariant(achar)[] astring;
ってして使ってる。
wchar*からwstringはそんな感じの関数を自作
phobosじゃないけど、使ってるライブラリでchar*だから自動的にchar*になってるな。
自分のソースコードにはTCHARとしか出てこないからあんまり気にしてないけど。
変換にはわなDのtchar.dを使ってるけど、それだとlstrlen使ってるな。
import my.windows.ansistring;でいいよ。
なるほどね、やっぱりubyte*にすべきなのね。
ありがとう。
charがUTF8で思い切ったのはいいけど、Cとの互換性が鬱陶しくなったなぁ。
Winなら、Unicode系の関数と、std.utf.toUTF16zとか使えばいいのでは?
いまさら98系に対応しています!とかいうアプリケーション作っても喜ぶ人はほとんどいない気がする。
そうするとCとかから呼び出す時に面倒じゃない?
さてubyte[]かubyte*か?
>Added template function literals
あんま破壊的じゃないなあ……
破壊的というよりは順調に便利になる変更な気がするけど、よく分からんから和訳待ちだなあ。
Fileにバグがあって云々、って文言からすると、あんまり間を置かずに2.030になりそうだけど。
きたー
破壊的ではないと思っていたら全然そんなことはなかったぜ
std.stdio.write(int)が使えなくなっている(エラーメッセージが分かりづらい)
std.randomが破壊的に変わりまくり(前のが無駄に分かりにくかったのは確かだが)
std.string.toStringがstd.conv.to!(string)になっていた(deprecatedメッセージが適切すぎてこの機能にありがたさを感じる)
しかし……単に数字を吐くだけのときはwrite(ln)を使っていたが、なんか面倒になったな。
deprecatedは地味に効いてる気がするよな
to!(wchar[])(100); が使えなくなってしもうた
to!(wstring)(100)でよくね? 必要に応じて .dup すべし
ちなみにD2.xで言ってる
rangeの書き方はどうなったのかな?
三角関数その他初等関数が早くなっている気がする
しかし各種特異点近傍の振る舞いもやっぱり変わった気がする
あとで確かめてみるけど
std.c.stdio.flush()どこ行ったの?
* Bugzilla 2812: sqrt(2.0) is about -2.7341e-53
Version D 2.028 Apr 7, 2009
New/Changed Features
Bugs Fixed
* Bugzilla 2812: sqrt(2.0) is about -2.7341e-53
どうして2回言うのカナ?
どうして2回言うのカナ?
大事なことだから(ry
>>531 core.stdc.stdio.fflush
2.028から2.029にしたら
object.d: Error: module object cannot read file 'object.d'
とか出てコンパイルできんようになった…
Windowsなら動いてるけど
>>535 動かないときは一旦全部消すのがdmd更新の定石
linux版使ってるけど、インストールのたびにdmd.confに書いてあるphobosとdruntimeの位置を修正してる
どうファイルを置くように想定してるのかいまいち分からない
string a = std.conv.text(1, "X", new A );
string b = std.string.format(1, "X", new A );
どっちがお好み?
意味的に前者かな。
後者を使うなら、やはりフォーマット文字列を与えるべきだと思う。
is({ /*code*/ }())
がきもすぎる。
542 :
535:2009/04/22(水) 23:49:10
パス名に空白入ってただけでした。死ねばいいのに
>>541 それ有効なDのコードかどうかを判定する is か?
std.rangeで使われてるね
>>542 パスに空白入れると面倒そうなものは
%SystemDrive%dev\とかにぶっ込むと無難。
>>541 is式の中にdelegateの呼び出しがあるのか?
どうなるコード?
>>546 デジゲートの中身にセマンティクスエラーがなければtrue、さもなくばfalse。
電子SFもののアニメかなんかに出てきそうだなw
デジゲートを通って現れる"is構文チェック"や"文字列テンプレート"などの変態的コード軍団。
人類オブジェクトの全配列は、やつらに処理を移譲してしまうしかないのか……!
みたいな。寝よう。
いや違う。そんなことはどうでもいいんだった。
> /usr/local/src/phobos/std/stdio.d(511): Error: template std.format.formattedWrite(Writer,F,A...) does not match any function template declaration
コンパイラ最新に変えて普通に再コンパイルしたらこんなんが出た。え? これphobosのコンパイルエラー?
こっちのコードに責任があるにしても、エラーメッセージにはまったく登場しないもんでどこを修正すりゃいいのやらさっぱりだ。
対して調べてないけど今日はもう寝る。
>>549 writefln(10)とか第一引数にフォーマット与えずに使ってるんじゃないの?
writeflnは第一引数にフォーマット必須
writelnはフォーマットなし
ちゃんと使い分けするようになった
D言語でC言語で作ったライブラリをスタティックリンクする方法ってありますか?
>>552 dmdに引数で*.libなり*.aなり渡してやるか、pragma(lib)つかえば、
特に複雑なことをしなくてもリンクできるはずだが。
うーん。
windowsでdmd2.0.26なんだけど
そのままだと Not a Valid Library File て怒られて、
coffimplibとやらで変換してもC側の関数をDから呼ぶと
undefinedになってしまう。
そのC言語のライブラリがDMCで作ったやつならなんの問題もないと思うけど、
VCだとほぼ無理だしBCBだと形式に互換性はあるけどちょっと工夫しないとリンクできなかったと思う。
DLLにしてインポートライブラリ作るならどのコンパイラで作ったやつでもリンクできるはず。
rangeって結構期待してたが,結局統一できてるのは読み込みだけなんだな.
今後,insertとかも追加されたりするだろうか.
558 :
sage:2009/04/25(土) 00:53:07
"helloworld"のサイズ比較をしてみた
dmd 2.029 --> 120k
gcc 4.3.3 --> 6k
20倍違うのね(;;)
dmd はビルドが速いっていいますけれども
どれくらい速いですか?
Delphiと比較して遜色ない程度に速い。
>559
ソースによっていろいろ変わってくるでしょうけれども例えばの話で、
gcc で 1時間 程掛かかる物が dmd だと 30分 程で済むという位ですか?
>>560 と言うかC/C++言語は基本的にコンパイルがむちゃくちゃ遅いので恐らく比較にならんです。Cで1時間ならDで5〜6分くらいでは。
gdcと比較してと言う意味なら大差ないんじゃないでしょうか。
Dで30分もかかるとなると、どれくらいの規模になるんだろう
そんなに速い物なのですね。
Delphiをいろいろ調べてきました、ほとんどコンパイル(やビルド)に時間が掛からなくて
ほとんど、あっという間に終わるってかいてありました。
すごいです。
とても使いたいですけれども、ただ、仕様が安定していないのとライブラリが少ないのが痛いです。
(SDLライブラリを使用しようと、SDL1.2.13のヘッダーを手動で変換してたのですけれども途中で疲れました。
dmd用のを探したけれども古い物しか見つかず、ヘッダーをbit→bool変換しなくてはいけなかったりlibがWIN用でしかも
2種類あったりで?。ビルド時エラー連発になったので、どうせならと新しいのをソースから落としてきました(Linux))
>>564 いろいろありがとうございました
ライブラリ、OpenGL関係もあって、めっちゃ感激でした。
>>558 Dのが実行ファイルのサイズがでかいのはガベージコレクタが付いてるからで、
特に無駄なコード生成してるというわけではないです。
gccであってもC++でiostreamなんか使うと200KB超えるのであまり気にすることもないと思います。
gcstubリンクするという裏技が
なんかネタないの?
>>569 解説って言ってもなあ…
なんか難解なとこある?
そもそもDってどういうときに使うと便利なんだ
バイナリ吐きたいけどC/C++はもうこりごりな時……とか?
>>572 サクッと短いアプリ(スクリプトではなく)作ったり
とか
軽くてシンプルなGUIライブラリがPhobosにあったらDだけで
生活できるんだがなぁ
無いならば 作ってしまおう ライブラリ
完成間近になったところで破壊的仕様変更ですね
賽の河原かよ
そろそろ標準GUIライブラリを決める戦争を始めようか・・・
DWTはマルチプラットフォームで使い勝手もいいが、SWTの移植だしDの利点をいかしきれない。そして重い。
DFLはDっぽいコードがかけるしGUIで外観作れて使い勝手がよく軽いが、Winのみ。あと手の込んだものが作りにくい。
標準というにはどちらも惜しい感じだ…
gtkDとかwxDとかってどうなの?
Win32API
>>580 DFLでは手の込んだものが作りにくいとはどういうこと?
DFLのようにせいぜい.NET Frameworkライクなライブラリならともかく
ベースになるライブラリが存在するgtkD/DWT/wxWidgetsを
標準にするなんてことができるのだろうか?
あ wxWidgetsじゃなくてwxDか
せっかくDの標準にするんだったらDらしいのがいいね
手の込んだものが作りにくいと言うのは、DWTと比べたとき、
DFLだけだとTableTreeとかCoolBarとか使えないから、そういうのは自分で作る必要があるってあたり。
そういうときはDWT使うけど、簡単なものはDFLの方が気軽に使えて好きだな。
最新版DMDを入れたら自作のリストコンテナがコンパイル通らなくなった。
どうもforeachが上手くいかない
どうやらメソッドにfront()があるとおかしくなるみたいで、
いままでopApplyでぶん回してたのが、なにやらRangeループに展開されてしまうようだ
エラー内容が突っ込みどころ多すぎてもうぬるぽ
import std.stdio;
class Test {
int a = 3;
int opApply(int delegate(ref int) dg)
{
int result;
for (int i = 0; i < 3; i++) {
result = dg(a);
if (result)
break;
}
return result;
}
ref int front(){return a;}
}
int main() {
auto list = new Test;
foreach (it; list)
writefln("%d", it);
return 0;
}
↓↓↓
Error: no property 'empty' for type 'test.Test'
Error: no property 'popFront' for type 'test.Test'
588 :
587:2009/04/29(水) 19:16:44
isInputRangeは
R r; // can define a range object
if (r.empty) {} // can test for empty
r.popFront; // can invoke next
auto h = r.front; // can get the front of the range
これだけ満たしてないとtrueにならないようにしてくれないと困るということか
DFLのイベントシステムはテンプレートを使って自分で
拡張できるようになっているから若干Dっぽいと言えなくもないんだ
でもまだ標準としては物足りないよね
591 :
587:2009/04/29(水) 22:30:12
DMDのソース覗いたらこんなんなってた
#if 1
{ "Fempty", "empty" },
{ "Fhead", "front" },
{ "Ftoe", "back" },
{ "Fnext", "popFront" },
{ "Fretreat", "popBack" },
#else
{ "Fempty", "empty" },
{ "Fhead", "head" },
{ "Ftoe", "toe" },
{ "Fnext", "next" },
{ "Fretreat", "retreat" },
#endif
つまり
foreach (e; range)
が
for (auto __r = range; !__r.empty; __r.next) { auto e = __r.head;
だったのが
for (auto __r = range; !__r.empty; __r.popFront) { auto e = __r.front;
こうなったということか
foreachにコンテナ指定すると、出てくるときには空になってるだと・・・?
>>591 rangeがForwardRangeならコピーをとってるから、foreachからでた後もrangeは同じ場所を指している。
ForwardRangeでないなら(たとえばソケットとか)、空になってしまうのは仕方ない。
仕方ないって言っても・・・
コピーをしないでイテレートしたいケースもなんとかして欲しいっしょ
確かに何が言いたいのかわからん。
まあ、ForwardRangeでないRangeもラッパかぶせればForwardRangeにできるけれども。
596 :
587:2009/04/30(木) 17:37:50
コピーをとるって、そのコンテナの要素に値を代入するときはどうするのかと
foreach (it; container)
はやめて
foerach (it; container.begin)
にすれば解決しそうだが、どうも納得いかないな
>>596 Rangeをコピーしたときに複製されるのはビューなはずだが。
コピーに破壊的操作をすれば、コピー元も変化する。
598 :
596:2009/04/30(木) 17:47:14
勘違いしてた、イテレータは関係ないじゃん
foreach (Iterator it; container) とやったときはイテレータループにすればいいんだ
問題は foreach (ref value; container) とやったとき
コピーしたやつを渡すとループ後に破棄されるからこまる
Rangeとイテレータは全く別物なのだが…
foreach前後でrangeの状態に変化してほしくない場合は、
コンテナ構造体の場合はコピーコンストラクタでRange状態をコピー元と別に持つようにして、
コンテナクラスの場合は、おとなしくコンテナとは別のオブジェクトをRangeとして実装しろ、
って感じ?
そういう使い方ができるrangeはそもそもclassで実装すべきじゃない。
boost::rangeでググってきた
RangeとはIteratorの開始点と終了点を持ったものらしい
利点はコンテナに対するアルゴリズムをそのまま使えるということ
D言語はRangeの前にコンテナを用意しろと
>>598 > 問題は foreach (ref value; container) とやったとき
> コピーしたやつを渡すとループ後に破棄されるからこまる
containerのfront関数やpopFront関数の返値型を、
ref int front() というように参照返しにしてやればいいっぽいよ。
ref front()だとダメだった。
コンテナくらい自分で作れよ… by Andrei
foreach (val; container.range)
か
foreach (val; range(container))
で我慢するしかないか
構造体で実装すれば何も悩む必要ない
const(char)[]をconst(ubyte)[]にキャストしたいんだけど、どうすればいい?
cast(const(ubyte)[])使うと、うっかりconst書き忘れそう。
もうここのやつらでコンテナ作ってウォルターに叩きつけようぜ
const_cast
途中送信
const_cast欲しいなぁ
Dがキャスト1つにしてる理由ってなんだっけ
参考にするからエディタ・コンパイラVer等、開発環境を教えて
2.029+サクラエディタ。
コンパイルツールは付属のmake使ったりとかしてる。dsssよくわかんねー。
D2.028+サクラエディタ+mingw-make+バッチファイル+writelnデバッグ
中途半端なツールを使うくらいなら、使わない方がすっきりとしててわかりやすい。
まあ、VisualStudioぐらいしっかりとしたものなら別だが。
dmdのバージョンアップは、大きく変化したときは様子見。
安定してきたなと思ったらする。
>>607 alias const(ubyte) cubyte;
const(char)[] x = "hoge".dup;
cubyte[] y = cast(cubyte[])x;
>>614 cubyteを誤ってubyteと書く可能性があるから、根本的解決になってない。
DMD2.025+xyzzy+コマンドプロンプトでmakeとかdmd -runとかだな。
IDEとかdsssとかは何度かチャレンジしてるけどダメだった。
mutable, immutable, constを変化させずに型だけキャストできたら便利だな
dmd1.043 + dsss(rebuild) + make + vim [linux/cygwin]
デバッガはgdb(cgdb)使ってたけど1.028かその辺でステップ実行できなくなり、
その後zerobugsを使ったけどフリー版が期限切れになり(それにクソ重い)、
結局ロギングコードを埋め込みまくるスタイルになった。
620 :
611:2009/05/02(土) 10:26:50
IDEが上手くいかないの俺だけじゃなかったんだな
dmd2.029 + Poseidon rev265 + ddbg
VSっぽく開発が進められて、なかなか安定感あると思う。なにより軽い!
でもPoseidonが参照返し関数があるモジュールの解析に
失敗して自動補完つかえなくなったりしてマズー
gdc1(Rev246) + mingw-make + サクラエディタ。
GUIライブラリはwxD。
わかってたけどgdcユーザ少なそうだな。
delegateオブジェクトが指すメンバ関数を所持しているオブジェクトを取得する方法ってありますか?
誰かDとIDEとGUIをまとめてパッケージにしてくれ〜
自分でやれよ
Visual Dまだー?
628 :
デフォルトの名無しさん:2009/05/02(土) 18:42:13
eclipseとか重くて使ってらんないからなぁ
そもそもdmdって(改変)再配布ってありなの?
ソースはあるけどオプソじゃないよね?
ライセンスはソースに同梱されてるものだと思うが
>>629 バックエンドの再配布はできないから、
OSI的オープンソースではないね。
632 :
デフォルトの名無しさん:2009/05/02(土) 22:14:51
dmd2.029 + nmake + emacs
>>624 623じゃないけどそんなのあるってすっかり忘れてた!
どうもありがとう!
void Func(){
byte Array[] = new byte[1024*1024*256];
delete Array; // あってもなくても駄目
}
int main(){
Func();
core.memory.GC.collect();
core.memory.GC.minimize();
while(1){
usleep(1);
}
return 0;
}
これでwhileの時点でFunc内で取得した256Mが開放されてないっぽいんだけど、この挙動は正しいのかな?mainの3行目でGCが開放すると想定してたんだけども。dmd2.025で確認。
どう確かめたか知らんけど、足りなくなったらmmapし、ゴミ集め時はプールに戻すだけ。
PowerShell使ってる人が一人ぐらいはいるだろう
俺は使ってないけど
某スレでD言語にもconcept的なものがあるのにって言われているけど
そんなのあったっけ
template A(T) if (これのことか?) {}
ごめん構文適当かもしれんw
D言語でメモリを開放しようなどと考えないほうがいい・・・
>>636 それであってる
省略した形でも勿論使えるので新しいPhobosでは積極的に使われてる
だがDにはconcept_mapがない。
そこで登場するのがこないだ実装されたalias thisだろう。
ラッパ構造体を作ってやればいい。
それっぽいことやってるサンプルコード書いてみてくれん?
>>643 const T min(const T x, const T y) if(isLessThanComparable!(T)) {
return x < y ? x : y;
}
template isLessThanComparable(T) {
enum isLessThanComparable = is(typeof(T < T));
}
alias thisの使い道がよく分からない
継承っぽいよね、継承でよくないの?
委譲だと思う
ダイナミックキャスト専用のswitch文みたいなものが欲しい。
でかいオブジェクトツリーを辿って型別に処理を書く場合、
else ifでキャストを羅列するか、visitorパターンを使うことになるが、
前者はパフォーマンスが気になるし、後者はツリーの型を増やす拡張がやりにくい。
Dのキャストの実装を見たところ、classinfoとインターフェースを辿って比較してるだけなので、
switch文中でそれをマージして無駄のないジャンプを作ってくれれないかなぁみたいな。
>>649 テンプレートを駆使してそれらしいものを作ってはみたが,毎度のごとくコンパイラのバグでコンパイルすらできなかった……orz
>>649 ちょっと例文を頼む
本家にポストしてみるわ
>>651 // こういうif elseがあったとして
if (auto c = cast(C)obj) { ... }
else if (auto b = cast(B)obj) { ... }
else if (auto a = cast(A)obj) { ... }
// 今はこういう処理になるはず
if (
foreach (cinfo; obj.classinfo_list) {
if (cinfo == C.classinfo) {
return obj;
}
}
// find interface ...
)
else if (
foreach (cinfo; obj.classinfo_list) {
if (cinfo == B.classinfo) {
return obj;
}
}
// find interface ...
)
>>652 (続き)
// こういう記述で
type_switch (o; obj) {
case C: break;
case B: break;
case A: break;
}
// こういう感じに展開してくれるといいかなぁと。
void* p = cast(void*)obj;
switch (obj.classinfo_list.depth) {
case 3:
switch (obj.classinfo_list[2]) {
case C.classinfo: auto o = cast(C)p; break;
}
case 2:
switch (obj.classinfo_list[1]) {
case B.classinfo: auto o = cast(B)p; break;
}
case 1:
switch (obj.classinfo_list[0]) {
case A.classinfo: auto o = cast(A)p; break;
}
}
>>652-653 念のためだが、classinfo_listはclassinfoのinterfacesとbaseをたどって作るrangeでいいんだよね?
それとも内部構造?
ふつうにclassinfoでswitchできればよくない?
switch(o.classinfo){
case C.classinfo: break;
case B.classinfo: break;
case A.classinfo: break;
}
新しい構文とか必要ないし、こんな感じの拡張の方が嬉しいな
>>654 baseを辿って作るrangeか配列で。インターフェースはこの配列自体を
複数持たせるとかが必要かな・・・。クラスの階層を使ったswitchを
やめてただのループにすればbaseとinterfaceを混ぜた配列でいいと思うけど、
折角使えそうなものを使わないのも勿体ないかなぁと。
>>656 それのcaseをダイナミックキャスト相当にすると現存のコードが動かなくなるんでは。
あと、キャスト後の変数の宣言も一回で済ませられると便利かなぁと。
>>656 ClassInfoの時だけセマンティクスが変わるのはよくない
>>657 oの型はそれぞれのcaseで決めるということは、
switch (o; obj)
{
case C:
case B: break;
case A: break;
}
この場合は
case C:
case B:
はそれぞれ展開するのかな?
テンプレート展開的に考えるとfall throughするルールとのマッチが一番難しいかも。
interfaceを交ぜると複数マッチするケースがかなり面倒なので、
基本的にはclass一本かなという気もする。
ひとまず、template展開で作れるか考えた方がいい気がするのでポスト中断。
template展開で作れたとしてもnativeで対応した方が良いのは確かだと思う。
あと予約語増やしてやって欲しい。
type_switch(o; obj){
case C: break;
case B: break;
case A: break;
}
あと以下も実装して欲しいかも?
type_switch(i; 10){ // 一番狭いものにマッチ、型は変えない(fall through対策)
case int: break; // int.min 〜 int.max
case long: break; // long.min 〜 int.min-1, int.max+1 〜 long.max
}
>>660 fall throughは考えてなかった。fall throughさせると変数宣言が
曖昧になるので、caseの後ろに変数宣言をつけられるようにするとかかな。
type_switch (obj) {
case C:
case B, b: break;
case A, a: break;
}
fall throughを考えるとswitch構文は向いてない希ガス
これでよくね?
static void delegate()[ClassInfo] typeMap = [A.classinfo:A_func, B.classinfo:B_func];
auto dg = obj in typeMap;
if (dg) (*dg)();
void A_func(){}
void B_func(){}
>>663 それだとAの派生クラスCを作ったときにtypeMapも更新しなくちゃいけないよね?
なんのためのコンパイルタイムリフレクションだと思ってるんだよ。
baseクラスへのキャストが考慮されてないし、typeMapを複数作りたかったら
無条件の登録はできないわけで、リフレクションがあったって大して変わらんかと。
ケースの数nに対して、O(n)オペレーション必要になるが、
>>659みたいなのでいいんじゃないかね。
また (new A).method(); を new A.method(); と書きたいと言ってる人がいる
いっそA.new.method()と書きたいなぁ
それなんてRuby?
AutoHotKeyいじってるんだけど
これ使えば好きなエディタを使ってIDEで使いたい機能のほとんど実装できそう
インテリセンスも辞書引きも、デバッガ呼び出しも
コード解析してdotにクラス図描いて表示も、クラスビューも
頑張ればほとんどの事が出来そうな気がする
言い出しっぺの(ry
dmd2.029を使ってコンパイルしたDLLをCのプログラムからLoadLibrary()すると
WinXP環境ではLoadLibrary()が失敗する。
Win7RCならいけたからたぶんVistaでもいける気がする。
DのプログラムからDで作ったDLLを読むとWinXPでも成功する。
GetLastError()で取り出したエラーコードは998(メモリロケーションへのアクセスが無効です)。
わけがわからん。。。。
GCまわりじゃねえの
win7でいけるのがおかしいのかもよ
>>668 むしろカッコがないほうが気持ち悪いよな。
C#だと、
new A().MethodOfA();
が通って
(B)a.MethodOfB();
が通らないのが気持ち悪くて、わざわざカッコを書いちゃう。
677 :
デフォルトの名無しさん:2009/05/07(木) 19:27:00
dsssを使ってるんですが、
Could not detect versions
ってなんでしょうか。
Descentを使ってやると上記のエラー文が出てくるんです。
最初は¥がだめなんだと思ってたんですが、違ってたようで、
コマンドラインでスラッシュに変えて打っても
DSSS config error: unrecognized line '[D:/d/main.d]'.
と出ます。
どうしやったらコンパイル通るんでしょうか?
>>676 new Class.Method;を認めるならこんなんも認めることになるかな
new Module.Class.Method();
new Class.StaticInnerClass.Method();
あとDではこれってどうなるべきなんだろう
new StaticClass.StaticInnerClass.Method();
DSSSは使ってみようとしたもののエラー出てから使ってないので
>>677 ドライブレターを削って相対パスにしてみるとかプロジェクト
ファイルとソースを同じパスになるようにしてみたらどうだろ。
新しいdsssだとだめだった用です。
1個古いやつで試したらあっさり動きました。
お騒がせしました。
Poseidonの最新版ktkr
パース失敗するバグが直ってた!
スクリーンショット付きでブログにて紹介してくれたら素晴らしいと思うw
684 :
673:2009/05/09(土) 02:49:08
やっと原因がわかった!
DLL_PROCESS_ATTACHで前のサンプルようにgc_init()とか書いてたけど、
新しいサンプルにあるようにRuntime.initialize()するようにしたら問題なく
ロードできた。
サンプルなんて変わってないだろーとチェックを怠っていた凡ミスだ。。。
前から謎だったんだけどstd.openrjって誰か使ってるの?
それは言ってはいけない
じゃあstd.demangle使ってる人は?
標準ライブラリにも準標準ライブラリがあってだな・・・
std.demangle微妙すぎない?
なんでデマングルだけなの?
マングル化も
ウォルたん作も思いつきで作ったようなやつが多いからな。
Phobosで信頼できるのはAlexandrescu先生の作品だけだぜ!
>>691 そんなのあったなぁ…。
プロパティかぁ。
static importをメインに使っていきたいんだけど
自動的にstatic importされるmoduleの書き方とかないの?
>>693 …なぜstatic importをメインに使っていこうと思ったのか詳しく
695 :
デフォルトの名無しさん:2009/05/10(日) 23:36:02
static import 使ってないけど、完全修飾にはした方が読みやすいのか?
とは思うな。
std.とかはいらないにしても 俺ライブラリの関数ぐらいは。
改名importでよくない?と思う
1つの関数だけをモジュールから改名importして
それ以外をそのままの名前で全部importする方法が欲しいんですけど
import std.stdio : p = writeln;
import std.stdio;
これすると衝突・・・しないじゃないか
なんてこったい
でもwritelnという名前は残ってしまうのはなんとかなりませんか
void writeln(T...)(T args) {
assert(false, "muripo");
}
static assert
できないですか
いい構文も思いつかないです
import std.stdio : !writeln;
みたいに…
すげーことするねw
なんかちょっと見ないうちに黒魔術度が深刻化しつつあるような
わけわからんw
なんかLispのマクロみたいになんでもできそうだなw
いったんテンプレート内でimportしてから選別して輸出するのか。
こんなことできるんだなー。
Version D 2.030 May 11, 2009
New/Changed Features
* added -vtls compiler switch
* classic global storage now defaults to TLS (Thread Local Storage). This is a big change, see Migrating To Shared.
* std.algorithm: added minPos. Improvements to Splitter suggested by Brad Roberts.
Splitter now is bidirectional.
Also Splitter has one extra trailing element if it ends with a separator.
Added variadic arguments for setUnion and setIntersection.
Added functions setSymmetricDifference and largestPartialIntersection.
Improved BinaryHeap's interface and implementation.
* std.array: Improvements to Appender. Now it works with string and other immutable-element arrays, and accepts ranges in put().
* std.format: added raw specifier for reading
* std.range: Added iota with two arguments. Added FrontTransversal and Transversal.
* std.stdio: added File.byChunk
* std.traits: Added isImplicitlyConvertible.
* std.tuple: Added Tuple.opComp.
* Folded in compiler changes by Unknown W. Brackets to support Solaris.
* added .typeinfo to ClassInfo Bugzilla 2836: Navigate from ClassInfo to TypeInfo
bug fixたくさん
>classic global storage now defaults to TLS
おお凄い。来てるな未来。
マゾも狂喜w
*'``・* 。
| `*。
,。∩ * もうどうにでもな〜れ
+ (´・ω・`) *。+゚
`*。 ヽ、 つ *゚*
`・+。*・' ゚⊃ +゚
☆ ∪~ 。*゚
`・+。*・ ゚
これだからD追っかけはやめられない
互換性完全無視なのが、うぉるたんって感じだな。
なんというか自分のコードを対応させることを考えるとわくわくしてきたぜ
やはり時代は並列プログラミングか。
でも、今回は大した互換性の崩れはなさそうだな。
同期処理ってもっとコンパイラに頑張って支援してもらえないのかな
おそらくsharedに対しては自動で同期する機能は入るだろう
日本初のD言語利用商用サイト作りたいんで早く安定してくれないかな
>>714 static int hoge;
static int* fuga = &hoge;
みたいなのが通らなくなってたのが互換性の崩れかな。
他のは何も考えず__gsharedしてしまえば昔と同じ(バグも同じ)か。
>>715 配列演算もまだ最適化できていない(むしろ遅い)んで、なんとも……
int i[3];
i = i[] + 5; // 遅い
foreach(ref u;i) u = u + 5; // 同程度に遅い
i[0] = i[0] + 5; i[1] = i[1] + 5; i[2] = i[2] + 5; // 早い
配列長は分かってるんだから展開してほしいが……
そこでstatic foreach…
どの程度の長さの配列まで展開すればいいのかね
コンパイルオプションで。
-array=256とか。
CTFEとかで展開する方が今は早いってことかね
CTFEでインラインアセンブラのコードを作って、文字列mixin
展開する関数作ろうと思ったけどインラインアセンブラまでわからんのでやめとくw
SSEなどに展開することと、
ループ用の処理のフットプリントを考えれば、
まあ4、8までは黙って展開していいと思う
実行時型情報をキーとする連想配列を組みたいのだが、
int[TypeInfo] typehash;
typehash[typeid(int)] = 1;
これを
typehash[int] = 1;
みたいにするにはどうしたらいいのだろう。
TypeInfoはClassInfoにしようかなとは思っているが。
それは意味解析的に無理だろ。
typehash.get!intとかで我慢するしかない。
まあ、この前の動的型情報に基づくswitchと同じようなもんを目指してはいます。
switchの代わりにhashを使うという方法で。
>>728 並列化の実装はとりあえずOpenMPに投げてしまってはどうでしょう。
デフォルトならばコア数で配列を分割するよう指示。
必要に応じてコンパイラオプションで分母の値を設定することも可能、とか。
数年ぶりに見に来たらD言語がよく分からないことになっていた
C言語で止まってる俺には理解できないw
組み込みのstringがあって、配列が便利で、typedefとaliasの使い分けができるCと考えても問題はない
コンパイル爆速は重要である
ちょっと便利なCとして使うのは楽かな。
お前らがDで一番好きな機能を教えて
よければその機能の便利な使い方とかも
>>739 配列関係の仕様全部。
長さの情報を他の変数で記憶しておかなくて良いし、連結も演算子ひとつでOKだし、部分抽出もコピーも楽ちん。
C++使ってた頃STLのvectorとstringとmap使いまくってたもんで、
それとほぼ同等の機能を言語仕様として取り込んでくれてる点も素晴らしい。
クラスが常に参照で、構造体と区別されてるのが一番好きかな。簡単で。
GCがあって、scope文があって、'->'じゃなくて'.'に統一されてて、
っていう周辺機能があってこそだけど。
コンパイル爆速は重要である
質問です
C/C++と比べて、D言語に大きなデメリットはありませんか?
いい加減C++に疲れてきたから優れているというD言語学んでみようと思ってます
>>744 GCに完全に依存しきったコードを書かなければならないこと。
よって、マイコン用のプログラムには不向き。
>>744 ・IDEとかの開発環境が微妙。
・ライブラリなんかはやっぱC/C++の充実っぷりが最強。
・コンパイラやライブラリにバグがあったり。
・バージョンアップでコンパイル通らなくなったりする。
まあ、最後のデメリットはさいきんあんまないし、あってもだんだん喜びに変わっていくんだぜ。
まとめると言語そのものはいいけど周辺と実装がやっぱなー、みたいな感じだ。個人的には。
開発環境はVCに比べたら微妙だけどUNIX-Cと比べるならたいして差はない
うぉるたんがカッコイイOS作れば流行るんじゃね?
Objective-Cみたいに
かっこいい
Digital Mars D-OS
アップデートの度に当然のごとくアーキテクチャや標準ライブラリに修正が入り、
全てのアプリケーションをコンパイルし直すどころかコードを書き直さなければならない。
そして、さっぱり使い道のわからないシステムコールが巨万とあるんですよね
ver.7 くらいになったらさすがに安定するんじゃないの?
GCと例外のおかげで自然なコードが書けるのが一番嬉しい。
もう関数呼び出しの度に結果用バッファを用意したり、
毎回戻り値をチェックしてエラーだったら何返そうかなんて考えるのは嫌だお
でもタイプセーフなのがいいし、ランタイムもできればないほうが嬉しいんだお
あと関係ないけどJava7からプロパティもクロージャも外されて超がっかりだお……
D言語の64bit変数ってビングエンディアンなの?
ulongをStream.writeBlockで出力したらビッグエンディアンだった件
755 :
754:2009/05/17(日) 18:40:51
どうみても勘違いでした。スマソ
このような、エンディアンの問題にしても、仕様としてversionで分けられるように考えられているところが好み。
Cでも定石で簡単に分けられるけど、言語仕様としてこういうのが入ってるのがいい。
ささやかだがtypedefで初期値を与えられるのがいい
配列作るときに重宝する
クラス名をコンパイル時にstringとして得る方法ってありましたっけ
.stringof?
ありがとうございました。できました。
本当はモジュール名込みでほしいのだが、まあ動くのでよし
>>760 this.classinfo.name
>>761 .classinfoがランタイムにしか取れんのです
ClassName.classinfo.nameは静的に決まっていてもいいはずなのにランタイム扱いなので、
実行時にclassinfoを取って比較したいのにできなくて困っていたという。
>>762 コンパイル時の話か。
ごめんね、ちゃんと読んでなかった。
struct A {
int x;
int opCmp(A o) {
return x - o.x;
}
}
int main() {
A[2] a;
a[0].x = -1;
a[1].x = 1;
a.sort;
assert (a[0] < a[1]);
return 0;
}
これのassertが落ちるんだけどバグ?
バグに見える。
-2になってtrueってわけではないのかなぁ。
最近、ROMってるだけじゃわからんくなってきたなぁ。
javascript風のイベント処理を書こうとしたら、
なんか違うものになってた。車輪の再発明っぽい
コンパイル時にアップキャスト可能か調べたりできたっけ?
class ObjectDispatcher {
struct Socket {
void function(in Object passed) callback;
}
private Socket[const ClassInfo] socket;
void append(T)(void function(in T obj) cb) {
if(cast(void function(in T obj)) cb)
socket[T.classinfo] = Socket(cast(void function(in Object obj))cb);
}
void exec(in Object obj) { socket[obj.classinfo].callback(obj); }
}
class onClick {}
class onKeyDown {}
void main() {
auto x = new ObjectDispatcher;
x.append = function void(in onClick e) { writeln(e.classinfo.name, "+"); };
x.exec(new onClick);
x.append = function void(in onKeyDown e) { writeln(e.classinfo.name); };
x.exec(new onKeyDown);
}
そういえば、下手な-inlineよりpureな関数の最適化の方が速いことがあるな
769 :
764:2009/05/20(水) 15:42:38
書いたやつだとopCmpが一度も呼ばれてなかったみたい。
で、いろいろやってみたら const int opCmp(ref const (A) o) { hogehoge; } にしないといけないらしい、面倒だ…
自己解決で申し訳ない。
>>770 > コンパイル時にアップキャスト可能か調べたりできたっけ?
の話は、コンパイル時にテンプレートやstatic ifで受け取った型があるクラスの派生かどうかを調べたい、というものです。
std.traits.BaseTypeTupleのうちから特定のクラスを探すには……というので簡単な方法があればいいのですが、
なければ自分で作るのかなと。
is ( : )
っすね。すっかり忘れていましたorz
isXxxxxx templateにしたほうがいいかもな
ややこしいのは自分様用に
なんだ自分様用ってwごめんw
じぶんよう^H^Hようなんだ・・・・
久々に触ってみたら構造体のthisがリファレンスになっとるんだね
普通に使ったら値型なのにコレはキモチワルイw
thisは参照!ってことだね
静かだ…
D/CLIまだー?
まず標準ライブラリだろうに
CLIになれば.NETが使えるよ
.NETが使えれば本格的なGUIライブラリがあるからさ
C#のポジションじゃなく、使いやすいC++/CLIというポジションなら、ありかもしんない。
Dの時代はあと何年後に訪れますか?
RubyのようにD言語にとっての海外コミュである日本から盛り上げるしかあるまい
久しぶりにD触ったんだけど過去に作ったの全部コンパイル通らなくなってた\( ^ o ^ )/
1.x系は安定してる?
破壊的バージョンうっぷは2.x系のみ?
そろそろ1.x系で自作アプリをごにょごにょ作っても大丈夫?
作るなら2.xで作ったほうが、D言語の旨味に浸れる
おまえらホントMだな
1.x用を後々2.x用に直すことを考えながら作るくらいなら
もう最初から2.x専用で作った方が楽だ
Javaだって今時は1.4無視してJ2SE5.0以降用に書くのが普通だからな
PHPだって5.2以降じゃないと動かないスクリプトたくさんあるし
過去のバージョンにも対応させる必要はないと思う
ちなみに
>>786の昔のコードって1.xどころかもっと前のでは?
だったらDではコンパイルできなくて当然
template eval(string code) {
version(D_Version2) mixin(code);
else mixin(convert_for_d1(code));
}
そしてD 3.0へ
std.rationalはまだですか。
多倍長整数型はあるのに有理数型がないなんて。
gdcどうなったん?
>>796 メンテナンスする人いなくて止まってる。
>>784 D2の時代なら3ヶ月後だそうです
D3を作り始める原因になる最大の破壊的変更はなんだろう
ソースが長くなってくるとファイルサイズもどんどん大きくなってくる
C#で作ったソフト移植してみたけど比較にならないくらいでかくなった
>>789 2007のカンファレンスでの内容としていまだ無いのっていったら
構造体のinterface継承、macro、暗黙変換の演算子オーバーロード、DTL
とかかな?ほかにも面白そうな機能まだ残ってるけど
ライブラリかなあ。なんだかんだ言っても.NETは強力。
>>802 以前からチマチマ話題に出しているコンテキストに応じた名前の選択がないかな
enum E { A, B, C};
void f(E e);
f(E.A); ← 現在は完全な修飾が必要
f(A); ← こうしたい
まあ言語としてはだいぶ洗練されてきたが、
標準ライブラリの弱さがどうしてもなあ。
JavaほどでなくていいがCよりは充実させてほしい
>>804 別々enum同士で同じ名前が定義できなくなりそうだ。C++みたいに。
なんで?
関数引数で列挙型要求されてるときに実引数として列挙型定数を渡す場合、
型名を修飾しなくていいようにしてほしい、って話だろうな。
C++のように常に修飾が要求されないのは気持ち悪い気がする。
>>806 関数がオーバーロードされていればそうなるかと
enum D { A, B, C};
enum E { A, B, C};
void f(D d);
void f(E e);
f(A);
>>806 enum E1 { A, B, C }; enum E2 { C, D, E, F };
void f(E1 e); void f(E2 e);
f(C);
これが曖昧になるって話だと思う。
もっとも、そーゆー曖昧なケースではエラーにすりゃいいだけだと思うんだが。
型推論さえあれば万事解決
>>809 その手の名前の衝突は列挙子のメンバに限らず、モジュールレベルでも起きうることだから、
今更とりあげて問題視すべきこととは思わない。
そうだなー
Overload Setsもあるし全く問題ない
でも必要性をあまり感じないな
dsource繋がらないっす
ドメイン変わった?
サーバ落ちた?
OpenMPみたいなのを言語レベルで対応とかしたらすげーな
>>813 逆に場当たり的に作られてきた“標準”ライブラリの多さにビビるな
andreiが各種コンテナについて言及してないのが気になる
あってほしいが、他をやって3ヶ月でいけるかな?
流石に誰か作ってるだろう?
A 「流石に誰か作ってるだろう?」
B 「流石に誰か作ってるよね?」
C 「流石に誰か作ってるだろ常識的に考えて」
結果誰も作ってませんでしたパターンがありそうで怖い
listとあと何が必要?
可変長配列(vector)って組み込み以外に必要なのかな
queueとstack、あとはsetみたいな木構造タイプのコンテナとか?
mapとhash(unordered)は連想配列で足りるな
list, queue, stack, deque, set, hash_set
あたりを全部組み込み型にしちゃえばいいんじゃないかな!
ライブラリでは不可能な最適化を行い、最高のパフォーマンスを提供します!みたいな。
>>822 ライブラリでは不可能な最適化って具体的にどんな?
それ適当に言っただけだと思うけど
>>823 VC++でソートの性能を自作したのとSTLで比べたら、圧倒的な差をつけてSTLが勝ったことがある。
なんでか調べたら、C++では標準ライブラリを特別扱いして最適化することを認めてるとかそんな理由だった気がする。
だから漠然とだけど組み込み型の方が速くなる可能性あるのかな、と思ってたけど違うのかな?
ちょっと待って
mapとhashとsetの区別はしてる?
invariantな連想配列はどう作るのでしょうか
二つのrangeのハミング距離を求める関数が欲しいんだけど、標準であったっけ?
D始めようと思ってるんですが、コンパイラ何使ってますか?
ちなみにXPとUbuntuです
>>796-797らしいからdmd一択じゃね。
バージョンの話なら、2もそろそろ破壊的変更がなくなるらしいから、これから1をつかう理由もないかと。
ちょくちょく貼られてるD.NETも忘れないでください
実用度の程は知らんが
QtD 0.2 release announcement.
D.NETもコンパイラはdmdなのでは
dmdが.Netのニーモニックはけるの??
llvmだな、llvmがjavaとdotnetのvmコード吐けばいい
バーチャルマシーンの上でさらにバーチャルマシーンが動くのか。。。
なんかすごいことになってるなぁ。
ひさしぶりにD言語使おうと思ったらDSciTE無くなってるCode::Blocksにするか・・・
>>840 今WinのCodeBlocksでDバイナリ作るとexe吐く際に異常終了扱いされるバグが出てるんだが、
もしかしたら俺だけかもしれないので試してみていただきたい。
842 :
840:2009/05/28(木) 23:46:30
>>841 Hello worldしたけど問題なかった
> dmd.2.030 & codeblocks-8.02
> import std.stdio ;
> int main(char[][] args){
> printf("hello world\n");
> return 0;
> }
ありがとう。
自分の環境だと2台のマシン(Vista&XP)両方でそうなるのだが、まあがんばってみるわ
ldc 0.9.1 released
The release 0.9.1 of LDC, the LLVM based compiler for the D programming
language, contains the following major improvements:
* lots of bug fixes (
http://www.dsource.org/projects/ldc/report/15)
* x86-64 support is mature
* inline asm improved (we now define D_Inline_Asm)
* cross-compilation support
* uses boehm-gc during compilation (x86-32 only)
* D specific optimizations:
* turn GC allocations to allocas if possible
* simplify or remove certain calls to D runtime functions
sharedで詰まったのでちょっと翻訳
*sharedへの移行
dmd version 2.030より、静的データおよびグローバルデータの記憶クラスが、以前のグローバルデータセグメントからスレッドローカル記憶域(thread local storage (TLS)))に変更されました。
引き続き、ほとんどのDのコードは変更無しで、そのままコンパイルするだけで正常に実行できますが、いくつかの問題が発生します。
**TLS変数の実行速度
TLS変数への読み込みや書き込みは以前のグローバル変数よりも遅くなります。
しかしLinuxでは、少なくとも、PIC ((position independent code)生成設定のコンパイラを
使用してのグローバル変数へのアクセスよりは、TLSはわずかに早くなります。
いったいどのように対処すればよいのでしょうか?
-グローバル変数の仕様を最小限にします。
グローバル変数の仕様を抑えると、コードのモジュール化と保守性を改善できますので、
これは価値のある目標です。
-グローバル変数をimmutableにします。
immutableなデータには同期の問題が発生しないので、コンパイラはTLSに配置しません。
-グローバル変数への参照をキャッシュします。
グローバル変数のローカルなキャッシュを作成し、オリジナルではなくキャッシュされた値に
アクセスすると、キャッシュがコンパイラによってレジスタに割り付けられた場合には特に、
速度は向上します。
-__gsharedを使っちゃう
TLS変数の特定
まず始めに、すべてのグローバル変数を探し出して、それぞれの配置を再検討します。
ソースコードの複雑さにも寄りますが、グローバル変数を特定するのは
いつも簡単であるとは限りません。
グローバル変数の宣言は暗黙である(あった)ために、grepする方法がありません。
グローバル変数をすべて確実に探し出すのは困難です。
そこで、新しいdmdコンパイラでは -vtls スイッチが追加されました。
スイッチ付きでコンパイルすると、デフォルトでスレッドローカル記憶域に配置されるようになった
すべてのグローバル変数の一覧が出力されます。
immutableへの移行
immutableなデータは、一度だけ初期化され、決して変更されることはありません。
これは、マルチスレッドで同期の問題が起こらないので、immutableなデータをTLSに
置く必要がないことを意味します。
コンパイラは、immutableなデータをTLSではなく古いグローバルに配置します。
sharedとしてマーク
複数のスレッドで共有されることになるグローバルなデータは、sharedキーワードで
マークされるべきです
shared int flag;
これによって、flagが古いグローバルに配置されるだけではなく、共有される型にもなります。
int* p = &flags; // エラー, flags は shared
shared(int)* q = &flags; // ok
sharedの属性はconstやimmutableのように推移的になります。
__gsharedでごにょごにょ
時には、上記の解決策が適用できない場合もあるでしょう
-Cコードとのインターフェースで古いグローバルを使用する
-とりあえず動けばいいんだ、元に戻してくれ、後で修正するから
-このアプリはシングルスレッドのみ。共有の問題は発生しない
-とにかく最高のパフォーマンスを
-すべての同期問題を自分で処理したい
Dはシステム言語なので、もちろんこういうことを行う方法があります。
記憶域クラス__gsharedを使用してください
コンパイルエラー
TLSに関して最もよく発生するコンパイラのエラーは:
int x;
int* p = &x;
test.d(2): Error: non-constant expression & x
これは古いグローバルでは動作しますが、TLS変数では動作しません。
TLS変数はリンカやローダーのいずれもメモリ中の配置位置を知り得ないのが理由です。
実行時に値が計算されます。
解決策は、こういったものは静的コンストラクタで初期化するようにすることです。
リンクエラー
グローバル変数についてのリンカから出る奇妙なエラーメッセージに遭遇することがあります。
これはほとんどの場合、あるモジュールでは変数がTLSに配置され、
他のモジュールでは同じ変数が古いグローバルに配置されるのが原因です。
これは、以前のバージョンのdmdで生成されたライブラリをリンクしたときに発生します。libphobos2.aが適切に最新版になっていることを確認してください。
また、これはCとのインターフェイスでも発生します。
Cは、TLS宣言をサポートしていても、グローバル変数はデフォルトで古いグローバルに配置されます。
対応するDの宣言とCの宣言が、TLSか古いグローバルかが一致しているかどうかを確認してください。
乙
>解決策は、こういったものは静的コンストラクタで初期化するようにすることです。
これでいけた。
キーワードが増加するのは見ていて清々しいぜ
機能に見合った数だけのキーワードは必要だよな。
C++0xとかきもすぎ
invariantとimmutableが意味的にかぶるのが好きじゃないなあ。
被るって言うか同じじゃないのけ?
こうなる予定かと
alias immutable(char)[] string;
class A{
invariant{}
}
その辺D3ではばっさり変更しそうだけどD2でも変更入るのかな
Dが.netに乗っかったてマジすか?
>>857 StorageClassとしてのimmutableは、invariantと等価な実装になってるらしいw
>>860 違う。記憶域クラスはimmutable、不変性契約がinvariant。
記憶域クラスとしてinvariantが使えるのは一時的な措置だろう。
std.xmlを使いたいのですがアンドレイたんが変えたいと言っているので手が出せません><
コンテナで思い出したがring bufferを標準に組み込んでるのってあまり見ないよね
tynixmlとか
Interfaceにどうにかして標準の実装を与えるトリックを考えているのだが、
staticならaliasでどうにかなるが、普通のクラス関数を作るにはどうにかできないかな
配列を第一引数に取る関数をプロパティ化するようなトリックがどうだかとか
void static_fun() {}
interface I {
alias .static_fun static_fun;
}
<妄想>
こういう糖衣構文が欲しい
interface Hoge { void blah(); }
template HogeBase() { void blah() { /* */ } }
class MyHoge : Hoge, HogeBase!() { }
// class MyHoge : Hoge { mixin HogeBase!(); } と等価
</妄想>
>>867 インターフェイスがデフォルト実装を持つと、vtblがぐちゃぐちゃになって、
多重継承を禁止している理由に反するから、そういう機能が標準で入ることはないだろう。
>>868 多重継承するから
>>869 継承禁止でつけられないかなと思うのよね
仮想関数の引数を固定して呼ぶだけ、みたいなマクロ的用途で欲しいことが
>>870 んー確かに
継承ツリーの最上位でメンバメソッドがfinal指定されていると、
仮想関数でなくなって静的に解決できるようになるから、仮想関数テーブルの問題はなくなるね。
あとは、名前の衝突だけど、これは普通に複数のインターフェイスを実装する場合にでも
起こりうることだから、C#みたいにどのインターフェイスを実装するのか明示できるようにして欲しいね。
>>870 ああ,多重継承の代わりのmixinをもっと便利に使いたいってか
>>871 C#ってどうやって明示するのん?
こういう呼び分けは可能だろうか
interface A{void f();}
interface B{void f();}
class C:A,B{
void f() override A{} // 模擬コード
void f() override B{} // 模擬コード
}
A a = new C;
a.f();//A.f();
B b = new C;
b.f();//B.f();
>>872 C#ではこうやって実装する。
class C: A,B{
void A.f() {} // 明示的な実装
void f() {} // 明示的でない実装
}
名前を同じくする明示的でない実装は高々一つしか存在してはいけない。
そして、明示的な実装はインターフェイス型にキャストしないと見えない。
(new C()).f == B.f
((A)new C()).f == A.f
((B)new C()).f == B.f
そういうことが可能なわけね
875 :
デフォルトの名無しさん:2009/06/11(木) 20:43:25
イ`ヘ
/: :| ヽ
/ : :/ ヽ ___ _,,,:. .-: :´彡フ
_ノ\_∠: : : : : : : : :`: :-: :,:_:/彡 /
( : : : : : : : : : : : : : : `ゝ /
マ r::/: /: : | : : : : : : : : ::\ /
//: /: : : |: : | |: : |: _: : : :ヽ
ジ {/ 7|`\/i: /|:|/|´: : : : :|ヽ
〉 ,‐-‐、`|7 || |_::|,_|: : :|:::|: |
で / r:oヽ` /.:oヽヽ: :|: | :|
{ {o:::::::} {:::::0 }/: :|N
っ | ヾ:::ソ ヾ:::ソ /|: : |
!? ヽ::::ー-.. /ヽ ..ー-::: ヽ::| r--ッ
-tヽ/´|`::::::::::;/ `、 ::::::::::: /: i } >
::∧: : :|: |J \ / /::i: | /_ゝ
. \ヾ: |::|` - ,, ___`-´_ ,, - ´|: : :|:::|
ヽ: |::|\  ̄/ /| |: : :|: |
変態が本書いちゃったのかwwww
D終わったな
むしろ始まったんダヨ
ミックスインメタプログラミングとかを駆使した変態テクニックがいっぱい載ってるんだろうなぁ
コンストラクターは
this(){
}
で宣言できるんだな。
c#だったら
classの名前と同じ名前で宣言してたけど
thisで宣言できるとこっちのほうがわかりやすくていいな。
templateがある言語はclassごとにコンストラクタが異なっているといろいろめんどくさいんじゃなかったっけ
んで和訳はいつ出るのかなワクワク
コンストラクタを表すならthisよりnewの方が自然だったんじゃないかとよく思う
アロケータも記述できるようにするなら、
コンストラクタがthisでアロケータがnewな現状でいいと思う。
>>884 this() {
this(default_value);
}
this(value) {
...
}
ってのができるので、newだと気持ち悪い、と思った。
コンストラクタがthisなのは美しいと思うよ
なんかコンパイル通らんと思ったらstd.random変わってたのか
コンストラクタをクラス名にしたC++が変態、諸悪の根源。
テンプレートが入った時点で変更すべきものだったんだろうけどC++には無理だろうな。
そんなのはヲルたん一人でなんでも決められるDだからできること。
>>883 訳本を待ってる間に仕様が変わってる予感
それをいうなら、英語版ですら、出版されるまでに仕様が変わってる予感
仕様が固まる予定が3ヵ月後で、本が出るのが5ヵ月後か
これがスケジュール通りいくなら、最新の情報で校正して出してくれるかもね
一ヶ月ごとに改訂して再版します!!
このDってやつはc/c++を超えて(別に越えなくてもいいけど)時代が来る?
来るんじゃない
俺たちがするんだ
C/C++の代替にはならない
DのライバルはJavaやC#
たかがGC
そういう時代がくればいいが
GCなんてあって当たり前
ってことね
なるほど参考になった。じゃあrubyとかややろうと思ってたけどDやってみるわ
rubyのほうがメジャーじゃん、と思いつつも、
さっくりひっくりかえせる力はあるような気がする
参考になったならいいんだが
どこが参考になったのかw
正直Dに一番近いのはObjective C++な希ガス
まちがえた
Objective Cか。Objective C++もあるけど
そういえばtemplate shared_ptr(T)ってみたことないな
GCが嫌なんだったらまずはこれを作ってみたらいいのでは。
一時オブジェクトの破棄がスイープまで起こらないことが問題になるような
シビアなコードを本当にC++で書く人なんてまれだろう
あれ?deleteしてもGCにマークされるまでメモリ解放されないんだっけ?
deleteはデストラクタを呼んで空き領域としてマークするだけ。
オブジェクトが一つフリーになったからといってメモリは解放できない。
Dはメモリ開放はできない!!!
そういえばGC持ってるとそこがいいらしいけどなんで?
>>908 一度使ってヒープに戻すよりも再活用するほうが色々リーズナブルみたいだ。
いや、メモリはOSから塊で貰ってきて、切り分けて使うものだから、
オブジェクト一つを破棄しても、メモリを解放できるとは限らない。
それは、Cのmalloc/freeや、C++のnew/deleteでも同じ話。
なるほど
じゃあGCがあるからC++の代わりにはならないというのはデマなんだ
かと言ってGCによる開放時にデストラクタが呼ばれる保証ってのも確かないんだよね
DのGCってなんの意味があんの?
>>912 いや、GCが解放するときデストラクタは呼ばれるぜ。
GCが解放してくれるっていう保証がないだけw
Javaでファイナライザのあまりの使えなさに絶望したけどDもそうなのか
絶望した
GCの実装に長けた人がD言語製作に加わってくれれば・・・
デストラクタ/ファイナライザ周りでは.NETがよくできてるから、見習って欲しいなあ。
scopeクラスでどうにかこうにか
でも、局所で使う以外は面倒だ
をるたん曰く「GCは本来OSカーネルが提供するべきもの」
KILLされることまで考慮すればデストラクトされる保証なんてできないってか!
スコープ外れた時用のデストラクタと
参照カウントが0になった時用のデストラクタと
スイープされた時用のデストラクタがあればいいんだ
誰かGCのデストラクタ呼び出しを保証できない理由を三行ぐらいで頼む。
メモリに余裕があれば
わざわざGCする
必要がないから
さんくす
なにか誤解されているような気がするので…
GCが保証されていないってのは、アプリケーションの正常終了時のこと。
メモリが不足したらGC走ってデストラクタ呼ぶのは当然として、
終了時に確実にデストラクタがよばれることがなぜか仕様上定められていない。
実際には最近のdmdでは呼ばれるっぽい?
そもそも全てのオブジェクトをGCで回収できないからだろう。
invariantオブジェクトは破壊してはいけないことになってるし。
GCがOSに統合されたら、メモリ管理がハードウェアでサポートされたり、
オブジェクトの移動が仮想メモリ下に隠蔽されたりとかするんだろうか
でも移植性考えると世の中のOSが全部GC詰んでくれないと手間が増えるだけだよね。
高速化のためには手間かけても良いと思う。
あとLinux辺りにはGC実装したいという利害関係が一致した人が居る予感。
>>925 それでも非invariantオブジェクトは破壊して解放するのを保証して欲しい
モジュールのstaticデストラクタで破壊してくれたらいいじゃないのかなあ
破壊順はstaticコンストラクタの逆順でいいじゃん
933 :
932:2009/06/17(水) 13:01:53
意味不明なことを言ってしまった希ガス
GCモジュールがデストラクトされるときに,GCが把握してるオブジェクトを全部破壊すればいいんじゃない?異常終了とか対応するのは面倒くさそうだけど
面倒だなあ
訳わかんないからCGとかなくていいよ!
激しく一般化されたCLRってとこか。
この手の面倒臭い話が解決しない限り
C/C++は生き残り続ける
DだってC/C++の資産を全部再利用できるわけじゃないし。駆逐は無理じゃね。
そもそも完全に駆逐された言語ってのも少ない気がするけどなあ。
一般的にって話じゃなくて、このスレ住人で、とか自分の中で、って話なら同意。
COBOLとか現役でたくさん使われてるらしいね。
一回業界で根付いたものは、システムとともに長生きするんだろうな。
ALGOLはもう廃れたかな?
今年でCOBOL生誕50周年だけど、
数年前ガートナーによれば、全世界で稼働してるソフトウェアは
ソースコードにして3100億行で、そのうちの2000億がCOBOLらしいよ。
そして新たに年間50億行書かれてるというから恐ろしい。
COBOLもFORTLANもLISPも世界的には現役
楽に綺麗に書ける言語とはまた別
D言語久しぶりに触ろうと思ったらいろいろありすぎてワラタ
D1.0 + Phobos
D1.0 + Tango
D2.0 + Phobos
D2.0 + Tango
どれ使うべき?あとIDEとGUI Libraryは何を使うべきかな?
D2.0 + Tango これはまだないようなものでは
IDEとGUIライブラリは特にこれといったものはないかも
andreiはQTとDWTをおすすめしているね
947 :
943:2009/06/18(木) 20:48:25
目的によるから何とも言えないな。
とりあえずD2.0+Phobos(新機能目当て)かD1.0+Tango(保守性重視)だと思うけど
D2.0+Tangoは、trunkから引っ張ってくれば使えたバージョンもあった(が、今は無理臭い。)
訂正。trunkじゃなかった。svnリポジトリのbranchで実験的なやつだった。
>948
とりあえずクロスプラットフォームで動くネイティブGUIアプリをD言語で作りたい。「D言語で」ってのが重要、C++で作るのがもっとも適しているのは承知済み。
なんでD1.0使うべきなんだろうが、PhobosよりTangoの方がいいの?まだバージョン1.00になってないみたいだが…
どうせD3.0でもまた標準ライブラリ一から作り直しだろ
その時にTangoも1.0になるんじゃないの
class KeyType {
// 連想配列絡みのメソッドは全てconst
const override hash_t toHash() {return 1;}
const override int opCmp(Object o) {return 0;}
const override bool opEquals(Object o) {return 0;}
}
int[KeyType] table;
int[const(KeyType)] c_table;
void put(KeyType key) {
c_table[key] = 1; // OK
table[key] = 1; // OK
}
void c_put(in KeyType key) {
c_table[key] = 1; // OK
// table[key] = 1; // NG
}
この一番下の奴は通るようにしたら何か不味いことでもあるのかな?
何となく通っても良さそうな気がするけど
>>947 > じゃ、これなに?w
これなにって...ないってことじゃないか
>>952 > void c_put(in KeyType key) {
> c_table[key] = 1; // OK
> // table[key] = 1; // NG
> }
typeof(key) == const(KeyType)
putの方のc_table[key]が通るのが意外だけど、意味を考えれば別にいいのか。
c_putの方のtable[key]は、constが暗黙に非constにキャストされるような感じなのがダメなのかな。
opIndexでindexに変化を起こす実装が作れる可能性もあるんでない?
>>955-956 おまえらが何を悩んでるのかわからんが、Tがmutable型のとき
Tからconst(T)へは変換できるが、const(T)からTへの変換はできない。
それだけの話だろ。
いかなる場合でも、これに例外を設けると、それが抜け道となってconst-correctnessが崩壊する。
>>954は要するに型が違うからコンパイル通らないことを指摘してるので趣旨に合ってる
まあそれは仕様として当然の事ではあるけど、
こういう場合は特例として暗黙にconst外ししてくれてもいいんじゃね?と思った
というのも、以下のようなクラスを作っててはたと困ったもので
class A {
private int[KeyType] table;
/// keyを保持しているか調べる
/// keyがconst(KeyType)なのでコンパイル通らない
bool hasKey(in KeyType key) {
return key in table;
}
void methodA() {
foreach (key, ref value; table) {
// keyの非constなmethodBの呼出し結果をvalueに保管する処理
value = key.methodB();
}
}
}
・hasKey()のinを取ると連鎖的に全ての箇所でconstが使えなくなる
・tableのkeyをconst(KeyType)にするとmethodA()の処理が行えない
・table.keysとは別にもう一つの非constな配列でも持てば解決できるけど何というか無駄な気がして気分悪い
でも
>いかなる場合でも、これに例外を設けると、それが抜け道となってconst-correctnessが崩壊する。
やっぱりこれだよなぁ…
960 :
958:2009/06/19(金) 21:00:07
>>959 連想配列のopIndexAssignはキーが存在しない場合、キーと値のペアを格納するからダメだけど、
opIndexやopIn_rなら既存のキーと引数で与えられたキーを比較するだけだから、
const(KeyType)を受け付けるべきだと思うよ。
この場合、KeyTypeにbool opEquals(const(Object))のオーバーロードが必要になるが。
いっそのこと、foreach(k, v; )と.keysを廃止してしまえば…
この板ID出ないのね
>この場合、KeyTypeにbool opEquals(const(Object))のオーバーロードが必要になるが。
ああ、なるほど
しかしそれは今のObjectには存在しないから追加したとしたらopEquals(Object)をオーバーロードしてる全てのクラスに修正が必要になってきて
ごめんなさい
俺が悪かったです
==の左辺がconstなら右辺もconstであるべきだとは思うけどねえ
ん?そうなるとopEqualsとかをオーバーライドするときは出来るだけconstつけた方がいいのか
さもないとconstにした途端比較できなくなる
class MyClass {
int value;
const override bool opEquals(Object o) {
auto t = cast(const(MyClass)) o;
return t && t.value == this.value;
}
}
このぐらいやれば何の問題もあるまい
そもそも、Object->const Objectは変換できるわけだから、
const bool opEquals(const Object)
だけがあればいいんじゃないの?
const func();ってfunc();をオーバーライドできるの?
出来るみたい
逆はちゃんとエラーになったからたぶんきっと仕様
元コードがphobosで書いてあって、そこからphobosとtangoの両方に対応したいんだけど、
なんか参考になるページとかない?
悪いことは言わないからそんなことやめとけ
どうしてもというなら一からTangoで作り直せ
>>969 まず、標準ライブラリをラップするライブラリから作ることになるよw
まじでやめといた方がいい。
972 :
969:2009/06/20(土) 03:09:59
はぁ、やっぱそうなるかなぁ。使いたいと思ったらtangoのみ対応ってライブラリばっかりだし。
標準入出力からして全然違うとかもう勘弁して欲しいわ・・・
>>969 tangobosってのがあった気がする。
今も使えるかは知らない。
druntimeなってから、そういうのいらないんじゃないの
tangobosは使えるけど…今更D1.0のPhobosに何の価値があるというのか。
druntimeがあるのはD2だけだな。
D2でTangoが使えるようになった時にはPhobosと共存できるに違いないと信じる。
DFLは両方に対応しているから参考にはなるはず
977 :
969:2009/06/20(土) 11:44:20
れすありがとう。
>>973 試してみます。
>>976 参考になりました。
tangoとphobosへの依存は最小限というか可能な限り使わないって
方針かな・・・代わりにWin32に依存してるのかもしれないけど。
しかし、それでも結構細々とした対応が必要なのとすでに
D3用のversionが用意されてるのが泣けた。
Tangoは悪としか思えない
いくらPhobosが使えないからといって、言語のベースをカオスにした罪は大きい
TangoはPobosをプロトタイプとした、スマートでシステマチックなライブラリにしたいのだろうね。
それで泥臭いPhobosを使わなくて済むようにしたかったんだろう…
Boostみたく普通のライブラリにすれば神ライブラリと呼ばれたろうに…
Tangoは「Phobos糞過ぎるだろ。これが標準ライブラリだなんて許せるか。俺にcommit権くれたら、もっといいもの作ってみせる!!!!11」っていう動機の元に作られたわけで…
それにしてはライセンス微妙だし、命名規則も酷いもんだ。
tango.io.Stdout.Stdout("うんたら").newline;
とか書くたびに絶望的な気分になる
Phobosを使うライブラリ を完全に無視するTango・・・
わからんのはライブラリの作者がtangoを採用するところ。ldcもtango必須だし。
tango自体はどうでもいいが、ライブラリがtango依存なせいでtangoを入れざるを得ない。
>>982 tangoって使ったことないけどそんな気持ち悪いんかw
それは確かに絶望的な気分になるのも頷ける・・・
D1だとさすがにTangoの方がいいだろうけど
D2だとPhobosはRangeが中心になってきてるし
今後はネットワークモジュールが入る可能性もあるので
Tangoを使うメリットが減りそうな感じ