トップページ⇒tech
1001コメント285KB

D言語 Part12

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/02/10(土) 01:09:54
プログラミング言語 D について語るスレッドです。
過去スレは >>2

■本家
ttp://www.digitalmars.com/d/
ttp://www.kmonos.net/alang/d/ (和訳)

■コンパイラ
ttp://www.digitalmars.com/d/dcompiler.html (DMD, 本家)
ttp://dgcc.sourceforge.net/ (GDC, gccフロントエンド)
ttp://gdcmac.sourceforge.net/ (GDCのmac用バイナリ)

■参考URL
ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究)
ttp://dsource.org/ (dsource)
0153デフォルトの名無しさん2007/02/13(火) 20:40:42
D言語の正式版の存在の意味が分からないw
明らかに人柱版としか思えないんですけどwwwww
0154デフォルトの名無しさん2007/02/13(火) 20:51:12
>>153
正式版も何も、単にバージョンが1になったというだけの話でしょw
0155デフォルトの名無しさん2007/02/13(火) 21:05:47
とりあえず落ち着かないとIDEとか無理だよな
0156デフォルトの名無しさん2007/02/13(火) 21:20:10
>>152
hoge(x, y, z) do (int x, int y) {
...
}

でいいんじゃねえの?
パイプって左右の区別なくて気持ち悪い。
0157デフォルトの名無しさん2007/02/13(火) 21:56:47
char[][] commentlessScript = File.collectLines("foo.myscript") do (char[] line){
 if(line == "---EndOfScript---"){ break; }
 if(line.startWith("#")){ continue; }
 return line;
};
class File{
 static char[][] collectLines(char[] filePath) do (char[] delegate(char[]) yield){
  char[][] result;
  open(filePath) do (File file){
   while(!file.eof){ result ~= yield(file.readLine()); }
  }
  return result;
 }
 static void open(char[] filePath) do (void delegate(File) yield){
  File file = new File(filePath); scope(exit){ file.close(); }
  yield(file);
 }
}
/* コンパイラは、delegateの呼び出しが行われるのがwhileやforの中のみと判断した場合に限り、
  そのdelegate内でのbreak、continueを許します。それらが行われた場合、delegateの実行は中断され、
  delegate呼び出しから最も近いforやwhileに対してbreak、continueが行われたものとして処理されます。 */

妄想が窮まってきたので、いい加減もう寝ます……。
01581572007/02/13(火) 22:09:33
……コメントに付け足させてくれ。

/* 検討事項: ... do (loop char[] delegate(char[]) yield){ ... のようにloopキーワードを付けるなどして、
  delegate引数の宣言の側でbreak、continue可能なことを明示すべきかもしれません。
  この場合、この`yield`はwhileやforの中で呼び出さない限りコンパイルエラーになることになります。 */

今度こそ寝る。
0159デフォルトの名無しさん2007/02/13(火) 22:25:00
>>156
「関数呼び出し do 関数リテラル」って形だな。

doを既存の演算子に置き換えて、
その演算子をオーバーロードしたクラスを関数呼び出しが返せば、
「関数呼び出し 演算子 関数リテラル ;」という形にはなりそう。
その場合、文じゃなくて式だけど。
0160デフォルトの名無しさん2007/02/13(火) 23:16:44
forの方が単純でいいような気がしてきた。
0161デフォルトの名無しさん2007/02/13(火) 23:34:45
トリッキーなコードには演算子オーバーロードは欠かせない。

我々にはopDoが必要だ。
0162デフォルトの名無しさん2007/02/14(水) 05:40:33
ネタでしょ?
0163デフォルトの名無しさん2007/02/14(水) 05:57:51
括弧内に { } があるのってダサくね?
0164デフォルトの名無しさん2007/02/14(水) 06:31:20
まさかこんなのが古きよきforループより分かりやすい、初心者にも
教えやすいとか思ってないよな?
しかも性能が劣るのは確実

単なるジャンプに過ぎないbreakやcontinueの代わりに例外なんて
論外もいいところ

馬鹿じゃないの?ただのオナニーじゃん
0165デフォルトの名無しさん2007/02/14(水) 06:39:54
>>158
おまいばかじゃね?
ネタだとしても、折角do使ってキーワード増やさない様にしてるのに何してんだ。
そんなんなら最初から新たな構文作るだろ。
0166デフォルトの名無しさん2007/02/14(水) 06:41:12
くだらんことでスレ延ばしてる香具師は
仕様いじくりまわして使えなくしてしまおうという
スパイの陰謀にしか思えない
0167デフォルトの名無しさん2007/02/14(水) 06:44:17
どこのスパイだ
0168デフォルトの名無しさん2007/02/14(水) 06:52:10
Jで始まる言語を使うところだな。
Japanese
0169デフォルトの名無しさん2007/02/14(水) 06:52:26
for ループと do 記法の提案の話は別ジャン。
0170デフォルトの名無しさん2007/02/14(水) 07:43:56
一所懸命相手のレスをねじ曲げて馬鹿にしてるんだから水を差すな。
0171デフォルトの名無しさん2007/02/14(水) 08:03:36
うそみたいだろ
全部ネタなんだぜ
0172デフォルトの名無しさん2007/02/14(水) 08:20:55
Don't touch me!
0173デフォルトの名無しさん2007/02/14(水) 09:11:02
sampleのhtmlget.dのhtml表示部分のprintfをwritefに変えたら4invalid UTF-8 sequenceってなった(printfのままだと通る。ちなみに接続先はwww.google.co.jp)
・・・なんで?
もしかして、writefだとUTF-8通らないのか?
01741732007/02/14(水) 09:11:56
あっ、改行忘れてた。すまん
0175デフォルトの名無しさん2007/02/14(水) 09:25:14
BOMとか関係あったりして
0176デフォルトの名無しさん2007/02/14(水) 11:44:20
逆だろ、writefはUTF-8とか16辺り以外通らない。
0177デフォルトの名無しさん2007/02/14(水) 12:01:41
みんな速度には結構神経使うな……当然ちゃ当然だが。

一口に速度と言っても、みんなどれくらいのをイメージしてるんだ?
俺は元々Java/Webな人間だし、個人的に作りたいモノも大抵Winアプリだしで、
停止時間が0.3秒くらいに収まればいいかな、くらいに思ってるけど。
だからforよりパフォーマンス落ちるとか程度は、(多分)全然許容範囲。

やっぱゲームとかリアルタイム処理な人は、
1万回のループが1/60秒以内に収まらなきゃ論外(数値は適当)、
delegateとか話にならん、て感じなんだろか。
0178デフォルトの名無しさん2007/02/14(水) 12:58:51
停止時間とか言ってる意味がよく分からんが、
ループ箇所の処理時間はボトルネックになりやすいという
一般論を前提にして今の話は進行してたんだろ
0179デフォルトの名無しさん2007/02/14(水) 13:04:37
>>176
たしかにそうみたいだな
import std.stdio;

void main()
{
printf("ほげほげ");
writef("ほげほげ");
}
で、ちゃんと表示されてるから。
でも、なんでちゃんと表示できなかったんだろう・・・>htmlget.d
0180デフォルトの名無しさん2007/02/14(水) 13:17:42
>>178
GC関係じゃね?<停止時間
0181デフォルトの名無しさん2007/02/14(水) 13:30:43
>>177
別に性能がどうでもいいんならVM言語やスクリプト言語でいいし
って話じゃねーの?

画像データをピクセル単位で弄くったりすることを考えると
遅いループなんて使う気にならないよ、少なくとも俺は。
0182デフォルトの名無しさん2007/02/14(水) 13:47:42
>>178
停止時間は例えば「ユーザがメニューから項目を選択してから、
再びユーザに制御が戻るまでの時間」くらいのつもりだった。

>>181
性能がどうでも良いとしても、Dは結構魅力的だと思うけど。
ランタイム要らずで起動の早い単体exeを作れる、かつC/C++より幾分モダンだし。

とゆーか、ごめん。なんか分かり切った事を聞いた気が自分でもしてきた。
0183デフォルトの名無しさん2007/02/14(水) 14:46:30
D言語そのものが人柱言語なんだからこのままイカレ仕様につっぱしってほしいぜ!
# 実用に使えるかどうかはプログラマの腕次第
0184デフォルトの名無しさん2007/02/14(水) 15:00:48
Rubyのイテレータとか見てると、
複雑な制御構造やありがちな制御構造をモジュール化して、
名前を付けられるって点がありがたいなぁ、と思う。
0185デフォルトの名無しさん2007/02/14(水) 15:13:57
>>177
意外と、会計処理でも、5時間かかるか、4時間で済むかは大問題だったりする。
夜間バッチのスケジュールが有って、会計処理なんて今時古いとか言われても、
必要なもんなんだし、お前らみたいにお絵かきやエロやってる訳じゃなく、従業員
が1万人関連取引先含めると20万人、顧客まで含めると100万人規模の、会社
にとっては、本当に死活問題。
0186デフォルトの名無しさん2007/02/14(水) 15:18:17
>>173
www.google.co.jpはuser agentを見てUTF-8返したりShift_JIS返したりしてた気が。
たぶんSJISで送られてきてる。
0187デフォルトの名無しさん2007/02/14(水) 15:43:07
>>186
つかさ。
普通にprintfで書き出して
hoge.exe > tmp.txt
でtmp.txtの文字コード調べりゃ済んだはずだよな
0188デフォルトの名無しさん2007/02/14(水) 15:48:27
そういう高速な処理したい人は普通にfor書いて
それ以外の速度が死活問題にならない人は短くてわかりやすい構文が使えるってのでいいんじゃないかな。

コンパイルはもともと激速なんだし構文増えてもそんなに遅くはならないと思うし。
0189デフォルトの名無しさん2007/02/14(水) 16:23:46
>>188
それはもったいないとおも
0190デフォルトの名無しさん2007/02/14(水) 16:45:38
>My goal is to make the Boost implementation code look as obsolete as a muzzle-loading smoothbore.
ガンガレWalterタソ!
0191デフォルトの名無しさん2007/02/14(水) 16:59:48
muzzle-loading smoothbore みた事無いからわかんないや
0192デフォルトの名無しさん2007/02/14(水) 17:01:40
>>188
ここらで直交性について触れておくべきだろうか。
まぁDはとっくに醜悪な恐竜になりつつあるがな。C++のように。
0193デフォルトの名無しさん2007/02/14(水) 17:12:22
> muzzle-loading smoothbore
ググって見たら軍事用語かいな。どういう喩えなのかさっぱり解らんw

>>192
STLだと型、データ構造、アルゴリズムだっけ。
Dが醜くなりつつあるというなら、どっかを削るべき?
0194デフォルトの名無しさん2007/02/14(水) 17:21:11
> muzzle-loading smoothbore

muzzle-loadingは先込め式銃で銃口から玉を込める銃のこと。
そしてsmoothboreはライフリングがない銃の事らしい。
とりあえず火縄銃なのかな?
0195デフォルトの名無しさん2007/02/14(水) 17:26:15
> 火縄銃
なるほど、obsoluteだな
0196デフォルトの名無しさん2007/02/14(水) 17:34:46
つまりDの目標はBoostを現在の銃と火縄銃くらい時代が違う物にしたいと
0197デフォルトの名無しさん2007/02/14(水) 17:36:10
要は「ちょwwBoostwwwwww」ってなるくらいってことだろ
0198デフォルトの名無しさん2007/02/14(水) 17:43:37
for や do のあたりの話をまとめると、こんな感じか。

・ foreach(i : 1..array.length, n; array) { ... }
 ってできたら、インデックスもズレないし、便利だよね?

・ ついでに
 foreach(i : 0..TIMES) { ... }
 ってできてもいいんじゃね?

・ それとは別に、Ruby のイテレータみたいなの欲しいな。
 times(5) do (size_t i) { ... }
 void times(size_t n, int delegate(size_t) yield) { ... }
 みたいな。
0199デフォルトの名無しさん2007/02/14(水) 17:44:36
boostが出てくるということは、
強力で設計の良いライブラリも持ちたいという意志はあるのねw
頑張れWalter! 出来れば「標準」ライブラリで頼むぜ!
0200デフォルトの名無しさん2007/02/14(水) 17:46:57
>>199
>強力で設計の良いライブラリ
boostはそんなライブラリじゃない訳だが。
0201デフォルトの名無しさん2007/02/14(水) 17:48:39
頑張れWalter!
0202デフォルトの名無しさん2007/02/14(水) 17:49:35
>>200
Walterはboostを持ちたいと言っている訳じゃないんだからいいんじゃね?
0203デフォルトの名無しさん2007/02/14(水) 17:52:26
boost は標準化目指してなかったっけ?
0204デフォルトの名無しさん2007/02/14(水) 17:53:56
>>202
既にtupleとかbindとか標準ライブラリでサポートされてきてるじゃん。
0205デフォルトの名無しさん2007/02/14(水) 17:54:41
>>198
そのあたりHaskellだとキレイにかけそう。
0206デフォルトの名無しさん2007/02/14(水) 17:55:59
>>203
C++0xで採用される予定のtr1はboostが基になってるのが多いね。
0207デフォルトの名無しさん2007/02/14(水) 18:04:07
とりあえず boost は糞で桶?
0208デフォルトの名無しさん2007/02/14(水) 19:30:05
"Boost implementation code look as..." だから、
boostの「実装コードが」時代遅れに見えるくらいにしたい、じゃね。
boostと同じ(or以上の)レベルの事を、もっと奇麗なコードで出来る言語仕様を……
というニュアンスとも。
0209デフォルトの名無しさん2007/02/14(水) 20:33:13
>>208
俺にもそう読めた
boostライブラリを言語仕様で実現したいんじゃないの
0210デフォルトの名無しさん2007/02/14(水) 22:02:34
209が208に同意してるのに微妙に違うこと言ってて混乱。

Boostみたいなライブラリをダーティハック(とかいったらC++の人に叱られそう)なしで出来るようにしたいって話では。
0211デフォルトの名無しさん2007/02/14(水) 22:13:58
変態っていえば多分彼らは納得してくれる。
0212デフォルトの名無しさん2007/02/14(水) 22:25:59
たしかにやべえ変なことしてるなあコレwって部分に興奮してる部分はあるかもだよな、>C++の人
02132092007/02/14(水) 22:40:39
>>210
よく読んでみたら確かに微妙に違ったみたい
ニュアンスを完全には把握できてないや

ところでさあ
TangoってErrorクラスがなくなってたりして
dfl(dwtも?)と一緒に使うことができないっぽいんだがどうしようもないのかこれ
0214デフォルトの名無しさん2007/02/15(木) 09:26:23
ファイルコピーてstd.fileに無いの?
0215デフォルトの名無しさん2007/02/15(木) 10:20:57
>>214
? ふつうにvoid copy(char[] from, char[] to); が載ってるが。
02161992007/02/15(木) 10:33:07
>>200
boostを思い出してみるに、確かに何となく違った気がする。
C++の言語仕様ならこれだけのことが可能なんだから、
これくらいは基礎として入っているべきだ、て感じ? 実際>>206な話だし。

GUIに通信にXMLにと何でも最初から入ってる、Javaみたいな意味での”強力”さってのは、
Dの標準ライブラリでは目指して無さそう? それはそれでいいのだけど。
0217デフォルトの名無しさん2007/02/15(木) 11:33:55
>>216
標準ライブラリにバイナリ本体を載せなくても、標準的なインターフェースは定義予約しておいてほしいと思う。
0218デフォルトの名無しさん2007/02/15(木) 13:05:53
>>186
あぁ、本当だ
よくよく見たらcharset=Shift_JISになってたわ
0219デフォルトの名無しさん2007/02/15(木) 20:28:59
IEやExcelを操作したいのだけど
COMを扱うライブラリを、紹介してもらえないですか?
出来れば、スクリプト並みに楽に扱えるものだと嬉しいです

あー、DもCOMも検索しづらい
0220デフォルトの名無しさん2007/02/15(木) 23:33:38
伸びてるな
0221デフォルトの名無しさん2007/02/16(金) 00:54:15
>>113-152
この流れ、おもしろすぎwwww
はたから見てて、久々にD言語使いたくなったwwww


0222デフォルトの名無しさん2007/02/16(金) 02:18:21
yield欲しい……。
0223デフォルトの名無しさん2007/02/16(金) 02:24:25
てかマイクロスレッド自体は実現できるんだったな・・・。
うらおの奴が作ってたような・・・。
0224デフォルトの名無しさん2007/02/16(金) 02:33:01
>>223
使用メモリを自分で決めるのと例外が投げられないのがちょっと気になる。
0225デフォルトの名無しさん2007/02/16(金) 02:46:26
>>224
あー確かにそうだったな・・・。
でもスタックって最初からサイズ決まってるんじゃないっけ。
0226デフォルトの名無しさん2007/02/16(金) 03:35:21
What's New for D 1.006
Feb 15, 2007
New/Changed Features

* Added -Jpath switch, which is now required in order to import text files.
* Enhanced -v output to include actual filename.
* name string for TypeInfo_Struct now part of the TypeInfo_Struct comdat.
* Compile time execution of functions
0227デフォルトの名無しさん2007/02/16(金) 03:42:17
* Compile time execution of functions
コンパイル時ユニットテストが・・・!!
0228デフォルトの名無しさん2007/02/16(金) 10:34:50
> * Compile time execution of functions
定数要求されてるところに関数書いておくと、それが
いくつかの条件をみたす関数ならコンパイル時に実行しとくよ、
という話で、ユニットテストとはちょっと違う気が
0229デフォルトの名無しさん2007/02/16(金) 12:00:35
class Person{
 MyArray!(Person) children = new MyArray!(Person)();
}

とか、ひょっとして通るようになったんでせうか。
02302292007/02/16(金) 12:44:32
ダメだた……orz
0231デフォルトの名無しさん2007/02/16(金) 13:24:14
よー考えたら、newはGCにメモリをねだる処理なんだから、
コンパイル時実行で解決できるわきゃなかったか……。スレ汚し失礼。
0232デフォルトの名無しさん2007/02/16(金) 16:00:13
Web鯖みたいの作っててacceptしたSocketをスレッド作ってどんどん渡してってるんだけど
GCが自動的に動いたときに Error: Thread error: cannot pause とかいってデッドロックしてしまう
これはphobosかなんかのバグ?
0233デフォルトの名無しさん2007/02/16(金) 17:41:38
GCが動く時には全てのスレッドを停止しなければならないとかは聞いたが、
どういう順番でどう停止させているのか、あたりに問題が潜んでる可能性はあるかも。

ただ、普通にデッドロックが発生する設計になっちゃってるせいじゃないか?
という疑念がひしひしと。同期の設計を慎重に見直してみたら?
0234デフォルトの名無しさん2007/02/16(金) 18:09:04
ttp://d.puremagic.com/issues/show_bug.cgi?id=645
これかな?
0235デフォルトの名無しさん2007/02/16(金) 19:05:41
std.threadを見てみたが、これはいたるところ微妙すぎないか?
というか書き直したほうがいいなこれ
Walterタンがんばって><
0236デフォルトの名無しさん2007/02/17(土) 01:44:30
>>235
ひどい奴だな、そこまでわかってるなら手伝ってやれよ。

つか別インプリメントして投稿ってのはナシなの?
0237デフォルトの名無しさん2007/02/17(土) 01:57:01
std.threadをてきとうに応急処置してみたんだがどうだろうか?
だれかえろいひと見てもらえると助かる
http://grugru.mine.nu/file.cgi?v=guru_guru_2560.zip
02382372007/02/17(土) 02:07:30
あああ 間違った
void wait(uint milliseconds)
のほう変更し忘れた
02392372007/02/17(土) 02:41:23
http://grugru.mine.nu/file.cgi?v=guru_guru_2561.zip
イベントのあたりがいろいろ間違ってたのをなおしました
0240デフォルトの名無しさん2007/02/17(土) 21:30:04
なんちゅ〜かDっぽくなくて恐縮なんだが、
テンプレートクラスA(T)とクラスBがあったとして、
A!(B)のオブジェクトのclassinfoをたどって、
Tの(ここではB)のClassInfoなりTypeInfoって取得可能?
0241デフォルトの名無しさん2007/02/17(土) 21:53:22
テンプレートクラスの引数はclassinfoだとメンバ変数nameが一応持ってはいるけど、文字列だしどうしようもない。
0242デフォルトの名無しさん2007/02/17(土) 22:26:49
mixinはどうだろ
0243デフォルトの名無しさん2007/02/17(土) 23:29:10
>>239
乙
しかし俺には評価できない罠
どういう問題が解決されているのかな
0244デフォルトの名無しさん2007/02/17(土) 23:46:11
>>243
http://f17.aaa.livedoor.jp/~labamba/?BugTrack%2F26
たぶんこれが直ってるのと、スレッドハンドルがどんどんリークしていたのを修正しました
0245デフォルトの名無しさん2007/02/18(日) 01:25:19
>>242
classinfo.nameはコンパイル時定数じゃないから…
0246デフォルトの名無しさん2007/02/18(日) 02:13:13
>>244
>>234で絶賛放置中のBugであり>>232の原因の疑いアリという代物じゃないっすか。
問題ないならcommitして欲しいくらいですねぇ。
私ゃ評価も翻訳もできない身ですけど・・。
0247デフォルトの名無しさん2007/02/18(日) 02:58:27
>絶賛放置中
クソワロタ


身に覚えがあるし・・・
0248デフォルトの名無しさん2007/02/18(日) 09:11:54
>>240

import std.stdio;

class A(T){}
class B{}

template TypeOfA( T )
{
static if( is(T U : A!(U)) )
alias U TypeOfA;
else
alias void TypeOfA;
}

int main()
{
alias A!(B) A_B;

writefln( typeid( TypeOfA!(A_B) ) ); // modulename.B

return 0;
}

こんなんじゃだめ?
02492402007/02/18(日) 10:35:53
>>248
A_Bの型からじゃなくて、A_Bのオブジェクトから取得可能か、知りたいんだよね。
Dっぽくなくて恐縮なんだが。

>>241のゆうように無理っぽそうだが。(�dクス)
0250デフォルトの名無しさん2007/02/19(月) 01:35:01
SDLの話なんだが・・・
hoge.dとsdltest.dっていう名前のソースが二つあって、
以下のようにコンパイルすると、sdltest.dのほうだけ128が返るんだが・・・どうしてだろう?
この128はdmdが返してるのか、SDLが返してるのか・・・それすらも分からないorz
%dmd hoge.d SDL.lib #SDL.libはあらかじめPATHが通ってる
%dmd sdltest.d SDL.lib
ソースは以下の通り
import std.stdio;
import SDL

int main(char[][] args)
{
  if (SDL_Init(SDL_INIT_VIDEO))
    throw new Error("Could'nt initialize video");
  printf("hello,SDL!");
  return 0;
}
0251デフォルトの名無しさん2007/02/19(月) 01:36:24
あっ、import SDLに;忘れてた・・・orz
もう寝る。
0252デフォルトの名無しさん2007/02/19(月) 01:37:51
あぁ・・・orz
if (SDL_Init(SDL_INIT_VIDEO)) > if (SDL_Init(SDL_INIT_VIDEO) < 0)
でした・・・
こんどこそ寝る。
■ このスレッドは過去ログ倉庫に格納されています