トップページ⇒tech
989コメント254KB

D言語 Part22

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/06/22(月) 01:38:41
プログラミング言語 D (D Programming Language) について語るスレッドです。
過去スレ、関連スレは >>2

■前スレ
http://pc12.2ch.net/test/read.cgi/tech/1234363551/

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

■コンパイラ
http://www.digitalmars.com/d/dcompiler.html (DMD, 本家)
http://dgcc.sourceforge.net/ (GDC, gccフロントエンド)
http://www.dsource.org/projects/ldc (LDC, バックエンドにLLVM)

■参考URL
ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究)
ttp://f17.aaa.livedoor.jp/~labamba/?D%B8%C0%B8%ECBOF (D言語BOF)
ttp://dsource.org/ (dsource)
ttp://tinyurl.com/candcpp2d (C/C++に疲れた人のD言語)
ttp://www.kmonos.net/alang/wnd/ (わかったつもりになるD言語)
ttp://shinh.skr.jp/d/ (SDL, SDL_*, OpenGL, GLU, glutのポーティングとか)
ttp://shoo.s20.xrea.com/shoo/programing (D言語とTangoの入門講座)
ttp://www.nicovideo.jp/mylist/4453698 (D言語で作られた芝ゲー niconico動画)
ttp://www.asahi-net.or.jp/~cs8k-cyu/ (ABA Games)

■ IDE
ttp://dronten.googlepages.com/dscite (DSciTE)
ttp://forums.codeblocks.org/index.php?board=20.0 (Code::Blocks)
ttp://www.dprogramming.com/entice.php (Entice Designer)
ttp://www.dsource.org/projects/descent (Descent)
ttp://www.dsource.org/projects/poseidon (Poseidon)
0268デフォルトの名無しさん2009/07/17(金) 17:09:23
Dの標準ライブラリにほかのプロセスを起動したりパイプで繋いで入出力するものありますか?
0269デフォルトの名無しさん2009/07/17(金) 18:19:21
>>267
ref引数にはlvalueの参照を渡すわけだから、変数を書き換えられるようになるわけですよ
0270デフォルトの名無しさん2009/07/18(土) 19:37:43
いつの間にcore.sync.*が追加された…?
でもまだドキュメント化されてない…?
0271デフォルトの名無しさん2009/07/18(土) 20:09:38
そう簡単にドキュメント化されるものか
ドキュメントはあるのにどこにもリンクが無いstd.perfさんの立場も考えろよ
0272デフォルトの名無しさん2009/07/18(土) 20:14:31
std.perfはstd.date.benchmarkのせいで要らない子扱いになってた気が
0273デフォルトの名無しさん2009/07/18(土) 20:31:29
benchmarkは流れの中にある一部の処理を測りたい時とかに不便な気が
というかなんでstd.dateの中にあんの?
0274デフォルトの名無しさん2009/07/18(土) 20:40:56
>>271
正直スマンかった…
まぁ、core.sync.*はTangoのそれと同じみたいだからそれ見ればいい話か…
0275デフォルトの名無しさん2009/07/18(土) 21:29:46
tangoとの統合の一環なのな
0276デフォルトの名無しさん2009/07/19(日) 00:44:44
でstd.inbufferどこいったのよ・・・
0277デフォルトの名無しさん2009/07/19(日) 02:06:40
>>276
俺も気になってた。
1.0系、2.0系どっちの更新履歴にも名前すら出てこない。
0278デフォルトの名無しさん2009/07/19(日) 03:44:48
>>277
古いのを何個か落として確認してみたけど、なかったよ。
OutBufferのドキュメントにInBufferの名前があるだけ。
0279デフォルトの名無しさん2009/07/19(日) 11:30:32
不変条件があるとrefメンバ関数使えない?
class A{
int a;
invariant(){}
ref int fn(){
return a;
}
}
0280デフォルトの名無しさん2009/07/19(日) 11:35:28
バグ
0281デフォルトの名無しさん2009/07/19(日) 13:22:35
invariant()の中でメソッド呼び出すと無限再帰になるの何とかしてほしい
0282デフォルトの名無しさん2009/07/19(日) 13:51:13
参照カウンタ方式のクラスが欲しい
システムプログラミング言語だったら、プログラマの意図したときに解放させたいと思うときがあるはず
0283デフォルトの名無しさん2009/07/19(日) 14:40:32
構造体のctor/dtor/postblit使えば簡単にかける
0284デフォルトの名無しさん2009/07/19(日) 15:34:48
書けることは書けるんだが、
sharedRef!(A) a = sharedRef!(A)(new A);
とかやんないといけないからメンドイのです
0285デフォルトの名無しさん2009/07/19(日) 15:38:22
auto a = sref(new A);
とかまでならできるんじゃないか?ヘルプ関数使えば。
0286デフォルトの名無しさん2009/07/19(日) 15:54:42
Dに慣れてautoから離れられない体になってしまいました
0287デフォルトの名無しさん2009/07/19(日) 16:09:19
近代C系文法はみんな備えるようになってないか?autoは。
0288デフォルトの名無しさん2009/07/19(日) 16:24:29
aliasで短縮するだけでもだいぶ違う。
0289デフォルトの名無しさん2009/07/19(日) 18:19:46
>>282-284
標準に欲しいものは作ってnews groupに投稿したらいいんだよ
0290デフォルトの名無しさん2009/07/19(日) 18:23:22
っていうかscopeをクラスメンバで使わせてほしい
0291デフォルトの名無しさん2009/07/22(水) 15:09:03
なんでref変数ないの?
嫌がらせ?
0292デフォルトの名無しさん2009/07/22(水) 15:45:11
焦らしプレイです
0293デフォルトの名無しさん2009/07/22(水) 19:29:05
FiberいつのまにPhobosにきたの!!!!!!??!?
0294デフォルトの名無しさん2009/07/22(水) 21:03:54
>>293 去年にはもうあったよ
0295デフォルトの名無しさん2009/07/23(木) 00:03:57
>>293
嬉しいよねー。パフォーマンスどうなんだろう。
0296デフォルトの名無しさん2009/07/23(木) 00:13:16
わからない…Fiberのよさがわからない…
だれかFiberの旨味を教えてくれ…
0297デフォルトの名無しさん2009/07/23(木) 00:17:42
弾幕作るときにあると楽
0298デフォルトの名無しさん2009/07/23(木) 00:37:02
状態遷移が楽に書けるんだよね。遷移のトリガのチェックにループ使えるし。
オブジェクトに状態の変数持たせなくてもローカル変数で済むし。
Stateパターンいちいち使うのもめんどいからなあ。
0299デフォルトの名無しさん2009/07/23(木) 01:51:11
ゲーム作るときにちょっと便利かも
0300デフォルトの名無しさん2009/07/23(木) 02:25:42
使ったことないけど、yieldのときに値を返したり受けたりできないのは不便な気がする。
0301デフォルトの名無しさん2009/07/23(木) 02:46:43
リファレンスカウンタ方式のGCみたいなもんだ
0302デフォルトの名無しさん2009/07/23(木) 07:43:42
Dで書かれた代表的なアプリケーションは

0303デフォルトの名無しさん2009/07/23(木) 09:00:28
>>302
ABAさんのゲーム
poeny
芝が生えるゲーム
0304デフォルトの名無しさん2009/07/23(木) 09:19:46
2ch viewer
0305デフォルトの名無しさん2009/07/23(木) 19:24:56
Poseidon
0306デフォルトの名無しさん2009/07/23(木) 20:28:19
>>304
あるの?
0307デフォルトの名無しさん2009/07/23(木) 20:57:57
final switch使って-wつけてコンパイルしたらめっちゃ怒られて死んだ
0308デフォルトの名無しさん2009/07/24(金) 00:01:49
range caseどうなったん?
0309デフォルトの名無しさん2009/07/24(金) 16:54:34
>>302
後は研究や仕事のデータ処理に使ってる人がいるくらいで
公開されたアプリケーションはあんまりないよね
0310デフォルトの名無しさん2009/07/24(金) 18:55:08
自分しか使わないツール作るのはすごい楽。
0311デフォルトの名無しさん2009/07/24(金) 20:11:26
>>309
現状言語自体が不安定すぎだしコンパイラの検証・バグ取りも済んでいないので、
放棄不可でメンテナンスが必要なものには使えないというのが実情かな。
言語自体の素性は良いので自分専用のツールを作るにはもってこいだが。
0312デフォルトの名無しさん2009/07/24(金) 20:21:11
便利なCとして使うには癖が強すぎるからじゃないかな
0313デフォルトの名無しさん2009/07/24(金) 20:31:35
Scalaみたいな言語の登場を考えるに、言語開発速度が遅すぎて時代遅れの感。
今後はJVMかLLVMの上で動く言語を考えるべきじゃなかろうか。
0314デフォルトの名無しさん2009/07/24(金) 20:36:10
いやこれはsystems programming languageなので
0315デフォルトの名無しさん2009/07/24(金) 20:40:39
システム言語として生きるなら、GC周りは決着すべきことが多いかなという気がするがなあ。
現状は、最新世代レベルの記述力を持ってバイナリをゲロる言語という感じだが。
0316デフォルトの名無しさん2009/07/24(金) 20:55:07
GCを取り除いたバージョンのDも触ってみたいね
0317デフォルトの名無しさん2009/07/24(金) 21:03:08
DWTでアプリ作ってるんだけどDWT諸共死にそうで恐い
0318デフォルトの名無しさん2009/07/24(金) 21:09:57
Dで書かれた(書こうとしている)OSってあったっけ?
MonaOS?
0319デフォルトの名無しさん2009/07/24(金) 21:12:30
今はないかと
0320デフォルトの名無しさん2009/07/24(金) 21:34:31
OSにGCが採用されたら実行可能ファイルのファイルプロパティに
GCアルゴリズムが選択出来るようになってるんだろうか。
0321デフォルトの名無しさん2009/07/24(金) 21:47:46
公式的にはQtDがおすすめのような雰囲気を感じる
0322デフォルトの名無しさん2009/07/24(金) 21:50:44
ユーザー増やすのに重要なのは言語じゃなくてライブラリだからなぁ。
極端な話ライブラリさえあればH○Pみたいな言語仕様でもアプリを書いてもらえるのに、
言語だけどんどん改訂していくものだからいつまで経っても良いサイクルに入らない。
0323デフォルトの名無しさん2009/07/24(金) 22:27:13
>>318
こういうのはある
http://wiki.xomb.org/index.php?title=Main_Page
0324デフォルトの名無しさん2009/07/25(土) 01:48:56
>>320
選択できるようにする必要あるの
0325デフォルトの名無しさん2009/07/25(土) 01:51:51
JVMはスループット重視か最悪値最小化重視かを選択できる。
ビルド時にオプション指定できる程度で十分だろうけど。
0326デフォルトの名無しさん2009/07/25(土) 02:38:02
>>322
いや、少なくともDに関しては
「仕様が固まってないから」という理由が大きい。
だって、せっかく作ったものでも、
ちょっとバージョンが変わるだけでコンパイルさえ通らなくなるようじゃ
怖くて大規模なものには手を出せない。

バージョンアップを楽しめる一部の人を除いて。
0327デフォルトの名無しさん2009/07/25(土) 02:57:11
eclipse3.5にdescent入れようとしたらエラーが出ました。
3.4には入ったんですが、3.5には対応してないってことなんですかね?
0328デフォルトの名無しさん2009/07/25(土) 05:08:34
そんなことはない
03293272009/07/25(土) 06:49:54
all in oneを入れなおしたら入りました。
0330デフォルトの名無しさん2009/07/25(土) 11:18:12
http://pc12.2ch.net/test/read.cgi/tech/1245092251/302

これについて解説お願いします。
0331デフォルトの名無しさん2009/07/25(土) 12:25:03
>>330
向こうのレスにある
> テンプレートとプリプロセッサの黒魔術で無理矢理DSLを作ってどうにかする
だよ。

auto result = linq!q{
from n in numbers
where n % 2 == 0
select n
};

0x風の書き方にするとauto result = linq<"from ... n">というような式で、
linq = テンプレート関数か何かを指すシンボル。
! = テンプレートの明示的インスタンス化。テンプレートパラメタ(cppで言う<>の中身)を続けて書くと括弧が省略できる。
q{ .. } Dで有効なトークンのみを記述することが出来る文字列リテラル(これがテンプレートパラメタ)

linqの中身をコンパイル時または実行時パーサにすると、そういう構文が書けるというお話。
しばらく前にお遊びで作られた黒魔術の一つ。
実用に供すことも可能だが、やった人は知らん。
0332デフォルトの名無しさん2009/07/25(土) 12:29:39
っつか0xスレでもDはGCが邪魔という話になってたのか
向こうを久方ぶりに見たが、まったく同じ内容のレスがあるとは
0333デフォルトの名無しさん2009/07/25(土) 12:34:52
>>330
面白そうだから書いてみた(適当だけど)。ASTマクロが実装されてからが本番だな。

//Public Domain
string[] lexLinq(string code){
  string[] r = [""];
  foreach(c; code){
    if(c == ' ' || c == '\r' || c == '\n' || c == '\t'){
      if(r[r.length-1] != "") r ~= "";
      continue;
    }
    r[r.length-1] ~= c;
  }
  return r;
}
0334デフォルトの名無しさん2009/07/25(土) 12:36:05
string translateLinq(string code){
  string aggregate, variable, condition, item, cur;
  foreach(i, a; lexLinq(code)){
    if (a == "from" || a == "in" || a == "where" || a == "select"){
      cur = a;
      continue;
    }
    if (cur == "from"  ) variable  ~= " " ~ a;
    if (cur == "in"    ) aggregate ~= " " ~ a; // 複数の時はstd.rangeに落とすべき
    if (cur == "where" ) condition ~= " " ~ a;
    if (cur == "select") item      ~= " " ~ a;
  }

  return "
    alias typeof({
      mixin(\"foreach(index, "~variable~"; "~aggregate~")return "~item~";\");
      assert(0);
    }())[] ResultType; // イテレータかレンジで返すべき
    ResultType r;
    foreach(index, "~variable~"; "~aggregate~"){
      if ("~condition~") r ~= "~item~";
    }
  ";
}
0335デフォルトの名無しさん2009/07/25(土) 12:37:33
auto linq(string code, T)(T numbers){ // ASTマクロが実装されたら関数の引数は無くせる。
  mixin(translateLinq(code));
  return r;
}

import std.stdio;
void main(){
  auto numbers = [1,2,3,4][];
  auto result = linq!q{
    from n in numbers
    where n % 2 == 0
    select n
  }(numbers);
  writefln(result);
}
0336デフォルトの名無しさん2009/07/26(日) 01:16:14
>>332
客層同じだしな
0337デフォルトの名無しさん2009/07/26(日) 01:32:53
違いはGCと文法と実装のしやすさとコンパイル速度ってかんじか?
GCない方がいいってのはなんでだ?GCあったってリソースの管理くらいできるのに。
0338デフォルトの名無しさん2009/07/26(日) 01:40:22
2ch内ではD言語をゲーム目的くらいにしか使わないからじゃね?
0339デフォルトの名無しさん2009/07/26(日) 01:42:45
GC使っていい環境なら素直にJavaやC#使ってるよ
そうじゃないからこそ敢えてC++使ってることが多い
0340デフォルトの名無しさん2009/07/26(日) 02:00:21
なるほど、環境によっては確かにGC使えない環境もあるかも。
ところで、GC使えなくてC++使える環境ってたとえば何があるかな?
マイコンとかだとC++すら使えなかったりしないか?
0341デフォルトの名無しさん2009/07/26(日) 02:01:53
バイナリが200KBも大きくなるのが我慢ならないとか
0342デフォルトの名無しさん2009/07/26(日) 02:06:20
>>341
うーん
そういう人は何があっても新しいものに移行しない希ガスるので放っておくしか
0343デフォルトの名無しさん2009/07/26(日) 02:07:20
struct shared_ptr{} 作ってください
0344デフォルトの名無しさん2009/07/26(日) 02:07:38
実際たいしたコード書いてない奴ほどGCに言及する傾向
0345デフォルトの名無しさん2009/07/26(日) 05:12:58
httpdやsshdのライブラリってある?
0346デフォルトの名無しさん2009/07/26(日) 17:24:18
60FPSで回すとGCの挙動が気になるのは当たり前
スレッド毎にコレクトするならいいんだけどなぁ
スレッドローカル仕様になったし、そうなることに期待
0347デフォルトの名無しさん2009/07/26(日) 19:13:05
ああ,TLSになったら依存関係の木構造が小規模になるから
スレッドごとにコレクトしやすくなるのか
0348デフォルトの名無しさん2009/07/27(月) 03:16:20
>>346
どのトピックか忘れたけどSeanが「スレッド毎にGCを動作させるようにする」みたいなこと言ってた気がする
0349デフォルトの名無しさん2009/07/27(月) 04:50:07
コンカレントGCってのに憧れてるんですけどD言語にそういう機能とか予定とかありませんか?
0350デフォルトの名無しさん2009/07/27(月) 05:04:21
Cの文字列をchar*型で渡されたとします。
これをchar[]型にコピーする最も簡単な方法は何ですか?
0351デフォルトの名無しさん2009/07/27(月) 05:05:40
>>348
それ、ロックレスなアルゴリズムと相性悪そうだな。

>>349
むしろPauseless GCが欲しい。ページフォルトをトラップすればいけるはず?
0352デフォルトの名無しさん2009/07/27(月) 05:35:15
>>350
import std.conv
to!string(cstring).dup
0353デフォルトの名無しさん2009/07/27(月) 05:38:46
>>352
ありがとう。
0354デフォルトの名無しさん2009/07/27(月) 06:14:19
クラスって常に参照型で扱われますよね。
参照の先がnewによって生成された物じゃない場合ってどうなってるんですか?
参照カウント方式で寿命が管理されているわけではない?
0355デフォルトの名無しさん2009/07/27(月) 06:39:20
>>354
mallocとかつかってメモリを割り当てて.__ctor()とか使ってコンストラクタを読んでクラスを作った場合、
GCにGC.addRange()でそのことを伝えておけばGCに回収されないで済む。
解放するときは.__dtor()とかfree()とか使って自力で解放する。
ただし、デストラクタでそれをやろうとすると危険かもしれない。
0356デフォルトの名無しさん2009/07/27(月) 07:46:07
>>355
なるほど。
一応GC使わない書き方もできるわけですね。
でも、さすがに手間がかかりすぎるなぁ。
0357デフォルトの名無しさん2009/07/27(月) 18:28:20
D言語ってかなり関数型プログラミングに向いてるよな
クロージャあるしクロージャリテラルあるしモジュールもあるし多態関数もあるしGCもあるし
でもリソースの管理はできないんだよな
0358デフォルトの名無しさん2009/07/27(月) 19:53:36
しかしグローバル変数のデフォルトTLS化ってうれしいのかな。知らなきゃ絶対はまるよね。

逆に、楽にTLS化する予約語を用意した方がいいんじゃないかと思う。
0359デフォルトの名無しさん2009/07/27(月) 19:54:58
>>357
>リソース管理
RAIIとかいう話じゃなくて?
0360デフォルトの名無しさん2009/07/27(月) 20:41:50
>>358
__thread
0361デフォルトの名無しさん2009/07/27(月) 21:49:05
友達がD言語って騒いでいたんだけど
D言語ってLinuxで動くわけ?
0362デフォルトの名無しさん2009/07/27(月) 21:54:22
>>361
それが自分で調べられない人には敷居の高い言語だと思う
0363デフォルトの名無しさん2009/07/27(月) 21:57:29
>>362
別に勉強しようと思っているわけじゃないんだけどな
0364デフォルトの名無しさん2009/07/27(月) 21:59:11
調べると真っ先に出てくる情報に触れる前にこんなスレに来た事が興味深い
0365デフォルトの名無しさん2009/07/27(月) 22:22:16
文字列のインデックスから日本語文字を得るにはどうしたらいいの?
string j = "あいうえお";
writeln(j[0]); // 'あ' がほしい
0366デフォルトの名無しさん2009/07/27(月) 22:28:43
wchar配列に変換すればできるんじゃないかな
変換関数はPhobosのどっかにあったな
0367デフォルトの名無しさん2009/07/27(月) 22:30:05
>>365
writeln(std.utf.toUTF32(j)[0]);
■ このスレッドは過去ログ倉庫に格納されています