トップページ⇒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)
0558デフォルトの名無しさん2009/08/13(木) 04:46:46
pureな標準ライブラリ関数がpure修飾されてないからまともな関数が作れない
というかin節でassert(hoge, std.conv.text(hoge));が通らないのが困る
0559デフォルトの名無しさん2009/08/13(木) 08:29:07
>>549
バグでないとするなら、どういった事情でこの仕様になったのか疑問な気もします。
>>557
a.funcもb.memberもテンプレートで渡したhogesとfugaのメンバーなので使えないとおかしい気がします。


binaryFunImplの中で出てくるElementType1、ElementType2はどこで宣言されているんでしょう?
0560デフォルトの名無しさん2009/08/13(木) 08:52:57
>>559
関数の仕様じゃなくてmixinの仕様と言ってるのでは
0561デフォルトの名無しさん2009/08/13(木) 10:04:49
>>560
mixinの仕様というのは
> 文字列mixinは、あくまでmixinする箇所にそのコードが書いてあるように振る舞うから、
ということですよね?

void f(T)(T t) {
t.func();
}
これは当然OKだから、t.func();がmixinであっても同じ事になるのではないか(むしろならないと不便)と思いました。
0562デフォルトの名無しさん2009/08/13(木) 11:59:35
>>561
template mixinとtemplateがごっちゃになってない?

下記のコードをdmd a bでコンパイルするとき
fがa.dにあれば動くけど
b.dにあったらbではimport std.stdio;してないのでwritelnがないため動かない

// a.d
import std.stdio;//ここでimportしても無意味
import b;
void main() {
 f!(`writeln("hoge");`)();
}
// b.d
void f(string s)(){
 mixin(s);
}

同様にaで定義された型をb.funcに与えることもできない
0563デフォルトの名無しさん2009/08/13(木) 12:48:04
>>562
その例は>>543の問題とは別物になってるような・・・

// a.d
import b;
struct Hoge { void func() {} }
void main() {
 Hoge hoge;
 f!("a.func()")(hoge);
}
// b.d
void f(string s, T)(T a){
 a.func();// もちろんOK
 mixin(s);// ならこれもOKのはず?
}

std.algorithmのcountもソース見るとこの挙動を期待して書いているように思う。
0564デフォルトの名無しさん2009/08/13(木) 13:00:03
>>653
それf!("a.func();")(hoge);に直したら動くけど
0565デフォルトの名無しさん2009/08/13(木) 13:16:29
>>653
ははっ、ドジっ娘め
0566デフォルトの名無しさん2009/08/13(木) 13:19:37
>>564
ああ、ごめん。ミスった。

auto result = count!("a.func(b.member)")(hoges, fuga);が通らないのは
std.functional.binaryFunのバグじゃないかな。
0567デフォルトの名無しさん2009/08/13(木) 22:13:34
>>543,546
http://www.digitalmars.com/d/archives/digitalmars/D/bugs/Issue_3217_New_std.functional.binaryFunImpl_doesn_t_support_UDT_with_string_functions_therefore_18373.html
これか
0568デフォルトの名無しさん2009/08/13(木) 23:23:20
std.path.joinがWindowsバージョンだと第三引数以降が無視されちゃってるの、
いつになったら直るのだろうか
0569デフォルトの名無しさん2009/08/14(金) 08:31:01
君が直せばすぐにでも。ってか、たぶん気づいてないと思う。

0570デフォルトの名無しさん2009/08/14(金) 11:10:25
前にもそんな話出てたな
パッチ送ったらしいけど
直ってないところを見ると
うちらが直しても無駄みたいだな
0571デフォルトの名無しさん2009/08/14(金) 11:14:35
spam mail
0572デフォルトの名無しさん2009/08/14(金) 12:55:13
std.functionalのbinaryFunとunaryFunって
testAsExpressionの部分が変じゃね?
binaryFunの方をunaryFunに揃えたらなんとかなる気がする
0573デフォルトの名無しさん2009/08/14(金) 15:58:46
>>572
The patch in brief:
enum testAsExpression = "{ ElementType1 "
~parm1Name~"; ElementType2 "
~parm2Name~"; return ("~fun~");}()";
って>>567に書いてある。
0574デフォルトの名無しさん2009/08/14(金) 18:34:02
>>571
私の英語力は100点満点中5.3点です
0575デフォルトの名無しさん2009/08/14(金) 19:32:20
>>570
俺がbugzillaにphobos関連のミスを報告しといたら、andreiが担当責任者を自ら引き受けてたけど
0576デフォルトの名無しさん2009/08/14(金) 20:13:11
コードは国際共通語!
0577デフォルトの名無しさん2009/08/14(金) 22:11:47
D言語のライブラリってだいたいCやC++のラッパが多いの?
0578デフォルトの名無しさん2009/08/14(金) 22:14:16
!
0579デフォルトの名無しさん2009/08/15(土) 17:50:21
関数の単体テストってどうやれば実行されますか?
1つのモジュールに関数とunittest書いて、コンパイル引数に-unittest指定して、
そのモジュール1つだけをコンパイルしたんですが、どうも単体テストが実行されてないようです(明らかにエラーなassert書いても何もなし)。
0580デフォルトの名無しさん2009/08/15(土) 18:45:32
単体テストが行われるのは実行時だよ

前から思ってたんだけどなんで実行時なんだろ?
0581デフォルトの名無しさん2009/08/15(土) 19:10:32
>>580
え、そうだったんですか・・・。
コンパイル時に実行してくれると便利なのに。
0582デフォルトの名無しさん2009/08/15(土) 19:15:27
その話題は過去に何回もあったけど、公式見解とかってあるのかな
0583デフォルトの名無しさん2009/08/16(日) 12:41:58
多分たいした手間じゃないからこれでいいじゃんって思ってそう
0584デフォルトの名無しさん2009/08/16(日) 12:55:45
それよりもテストに失敗してもそのまま次のテストを実行してくれないと使い物にならない
0585デフォルトの名無しさん2009/08/16(日) 13:57:38
っ try catch
0586デフォルトの名無しさん2009/08/17(月) 00:18:31
例外でテストを書けとな?
0587デフォルトの名無しさん2009/08/17(月) 01:17:01
>585 ではないがこういうことだと思う

import std.stdio, core.exception;
void assert_test(T, string file=__FILE__, ulong line=__LINE__)(lazy T eval, lazy string msg)
{
try{
assert(eval());
}catch( AssertError e ){
writefln("%s", msg());
}
}
void main()
{
assert_test(1==0, "error!");
writefln("end");
}

出力:
error!
end

assertは結局AssertErrorを投げるので、これを食べる関数を作れば
>584 の意図は達成できる
0588デフォルトの名無しさん2009/08/17(月) 01:20:56
>587
忘れてた
catch節をこうしておけば組み込みのassertっぽくファイルと行位置も出力できる
writefln("AssertError@%s(%s): %s", file, line, msg());
0589デフォルトの名無しさん2009/08/17(月) 02:20:10
たぶんそうではなくて、
http://www.kmonos.net/alang/d/techtips/unittests.html
ここの、
unittest {
   try {
   assert(...);
   ...
   } catch (std.asserterror.AssertError ae) {
ae.print();
   }
}
これを言いたかったのではないかなと予想
0590デフォルトの名無しさん2009/08/17(月) 02:45:05
>>589 のtechtipsは気づいてなかったthx
0591デフォルトの名無しさん2009/08/17(月) 08:28:42
>>577
さあ? それでそれがどうしたと言わざるを得ない
0592デフォルトの名無しさん2009/08/17(月) 11:18:28
>579
static assert ってのがあって、これはコンパイル時に実行される。
0593デフォルトの名無しさん2009/08/17(月) 12:47:18
ErrorとExceptionは兄弟になったのか
いつの間に
0594デフォルトの名無しさん2009/08/17(月) 18:03:18
更新まーーーーだーーーーー?
0595デフォルトの名無しさん2009/08/17(月) 20:20:44
2.031がコンパイルエラーになるたびにコア吐いて堕ちる惨状を見るに、修正には時間がかかりそうだと思った
0596デフォルトの名無しさん2009/08/17(月) 21:01:07
ウォルターはドッグフードをてめーで食ってないんじゃないか?
やっぱりdmdはdmdで作るべきだろ
0597デフォルトの名無しさん2009/08/17(月) 21:53:08
そうこだわらんでも
CでよりはC++で書いて欲しいけど
0598デフォルトの名無しさん2009/08/18(火) 00:06:14
>>595
アジャイル(笑)なのでしょうがない
0599デフォルトの名無しさん2009/08/18(火) 00:09:37
new immutable(int)[n];ってどうやって使いこなすの?
次の行で詰むんだけど
0600デフォルトの名無しさん2009/08/18(火) 00:20:45
書き換え可能配列に書き込んだらidupかassumeUniqueを使う

>>591
そもそもC++はGCとの相性でくるみにくいし、
Cならくるまなくてもそのまま使えるしな

>>595
とりあえず -g -debugを入れて-Oを切ればInternal Compiler Errorでコケることは減る
かといって問題が解決するわけでもないが
0601デフォルトの名無しさん2009/08/18(火) 00:52:16
テンプレートそのものはaliasできないんすかね
0602デフォルトの名無しさん2009/08/18(火) 00:55:17
interfaceマジ意義薄れてるな
Tで受け取ればstructの擬似interfaceまでできるし
0603デフォルトの名無しさん2009/08/18(火) 00:58:54
>>602
ここはどうしても多態という場面があってそこには使える

interfaceじゃないけどstructにコンセプト的なものが欲しくなった
ユーザ側が拡張するときにこれは実装してくれという
Rangeなんかちょうどそんな感じだしな
0604デフォルトの名無しさん2009/08/18(火) 02:46:36
encodeって書かれてもなにやってんだかわかんない・・・
モジュール指定が絶対必要な関数を作る方法がほしい
0605デフォルトの名無しさん2009/08/18(火) 07:36:11
static importがあるじゃん?
0606デフォルトの名無しさん2009/08/18(火) 08:13:59
>>600
何のことかと思ったらこういうことか
int[2] a = [1,2];
immutable(int)[2] b = a.idup;
0607デフォルトの名無しさん2009/08/18(火) 08:26:24
>>602
どんなコード?
>>603
template isHoge(T) { enum isHoge = is(typeof( { ... } ); } とconcept ifでできたような気がしたがやってみたらできなかった・・・
is(typeof({})) じゃなかったっけ?
0608デフォルトの名無しさん2009/08/18(火) 11:23:36
>>607
opDotとかじゃね?
0609デフォルトの名無しさん2009/08/18(火) 21:22:52
>1のDSciTEはもう戻ってこないんだな、テンプレから外すんだろうか
0610デフォルトの名無しさん2009/08/18(火) 21:28:23
DescentってD2もいけちゃう?
0611デフォルトの名無しさん2009/08/18(火) 22:51:42
>>610
いける。
でも最新verには対応してなくて、pureやimmutableがキーワードとして認識されない。
0612デフォルトの名無しさん2009/08/19(水) 12:11:33
int[] data;
uint[] dataIndex;
sort!("data[a] > data[b]")(dataIndex);

こんな風にdataIndexをソートしたいんですが、上記のコードは通りません。
C++なら関数オブジェクトを渡す方法を考えるのですが、Dのsortはデリゲート版がないようです。
どうすればいいのでしょうか?
0613デフォルトの名無しさん2009/08/19(水) 12:29:40
>>612
http://dusers.dip.jp/modules/wiki/?SampleCodes%2FPhobos%2Frange%2F1
ここにそのままの記事が。
0614デフォルトの名無しさん2009/08/19(水) 12:47:45
>>613
どうもです。
そこのサンプルコードをコンパイルするとStack overflowになってしまいます。
なんでだろう?
0615デフォルトの名無しさん2009/08/19(水) 13:34:55
Windowsのdmd 2.031ではうまくいった。
環境によってできるできないがあるのかもしれない。
0616デフォルトの名無しさん2009/08/19(水) 14:05:32
>>615
どうもです。
2.031入れたらコンパイルできました。
0617デフォルトの名無しさん2009/08/19(水) 17:08:26
std.algorithm.equalの引数に静的配列を渡すとエラーになるんですが仕様?
0618デフォルトの名無しさん2009/08/19(水) 17:44:17
Dの静的配列はなんか異質
0619デフォルトの名無しさん2009/08/19(水) 19:21:35
>>618
thx
静的配列と動的配列で挙動が違うのかー。分かりづらい。
0620デフォルトの名無しさん2009/08/19(水) 21:51:20
あーなんとかならないのかな。
algorithmに渡せるRangeは動的配列だけで静的配列は渡せないなんて嫌だw
0621デフォルトの名無しさん2009/08/19(水) 23:00:35
静的配列の後ろに[]を付けるだけで回避できるはず
0622デフォルトの名無しさん2009/08/19(水) 23:06:49
>>621
thx
知らないと気づかないなぁ。
0623デフォルトの名無しさん2009/08/19(水) 23:10:20
ああそうかスライス取れば動的配列として扱えるのか
0624デフォルトの名無しさん2009/08/20(木) 01:38:57
>>612
import std.algorithm;

int[] data = [ 2, 3, 1, 5, 0 ];
uint[] dataIndex = new uint[data.length];
makeIndex(data, dataIndex);

foreach(i; dataIndex) write(data[i], " ");
0625デフォルトの名無しさん2009/08/20(木) 19:01:28
>>624
すみませんmakeIndexがどういう操作(なぜdataがいるのか?)でwriteがどういう操作なのかわからないです。
0626デフォルトの名無しさん2009/08/20(木) 19:32:54
コンパイラに話しかけてるんじゃないんだから関数名にはモジュールまで付けた方が伝わりやすいとおもいます!
きっと std.algorithm.makeIndex と std.stdio.write のこと
0627デフォルトの名無しさん2009/08/20(木) 20:13:42
>>626
どうもです。
makeIndexは目的にぴったりですね。
0628デフォルトの名無しさん2009/08/20(木) 21:18:12
マケインです
0629デフォルトの名無しさん2009/08/21(金) 08:19:53
そろそろ9月です
10月にはD3だっけ
0630デフォルトの名無しさん2009/08/21(金) 13:45:51
選択importの反対のような事ってできないですかね?
std.stringをimportするとdeprecatedのstd.string.findがimportされて、
std.algorithm.findと衝突するのがめんどくさいです。
0631デフォルトの名無しさん2009/08/21(金) 14:28:27
今使えるか分からんけど、前スレでそういうmixin用テンプレートを作った人がいた。
http://pc12.2ch.net/test/read.cgi/tech/1234363551/702
702 名前:デフォルトの名無しさん:2009/05/12(火) 19:26:46
   >>697
   でけたよ
   http://codepad.org/MKHVHlFS
0632デフォルトの名無しさん2009/08/21(金) 14:39:27
import std.string;
import std.algorithm;
alias std.algorithm.find find;
ってすればいいんじゃないかな
0633デフォルトの名無しさん2009/08/21(金) 15:11:46
>>631-632
ありがとうございます。
とりあえず簡単なaliasでかぶせる方法にします。
0634デフォルトの名無しさん2009/08/21(金) 16:33:04
std.string.findがdeprecatedになって何が推奨になったの?
0635デフォルトの名無しさん2009/08/21(金) 17:58:47
indexOfとかじゃなかったかな
0636デフォルトの名無しさん2009/08/21(金) 18:01:10
indexOfですね。2.031のchangelogより:

std.string: deprecated std.string.find and std.string.find, replaced with std.string.indexOf;
deprecated std.string.rfind and std.string.irfind, replaced with std.string.lastIndexOf;
added flag CaseSensitive for indexOf and lastIndexOf;
removed startsWith and endsWith because std.algorithm defines them;
defined std.string.byDchar.
0637デフォルトの名無しさん2009/08/21(金) 18:19:08
ありがとう
よく追いかけているねえ
0638デフォルトの名無しさん2009/08/21(金) 21:44:26
concept-ifのページどこ?見当たらないんだけど><
0639デフォルトの名無しさん2009/08/21(金) 22:04:05
templateのページのテンプレート制約(Template Constraints)ってとこか?
0640デフォルトの名無しさん2009/08/21(金) 22:24:45
それです!!ありがとう!!
ChangeLog見てたらconcept-ifのバグをなんたらとか書いてあったんで
concept-ifでサイト内検索かけてみたけど見つからなかったんです><
0641デフォルトの名無しさん2009/08/21(金) 22:30:21
D1.0でファイルにsjisの文字列を出力する方法ってないでしょうか?
教えていただきたいのですが
0642デフォルトの名無しさん2009/08/21(金) 22:31:46
WindowsならWideCharToMultiByteつかって、そのほかならsetlocaleした後にwcstombsする
0643デフォルトの名無しさん2009/08/21(金) 22:58:18
std.windows.charsettoMBSzってのがある
中身は>>642
0644デフォルトの名無しさん2009/08/21(金) 23:21:25
>>642
>>643
ありがとうございました!
うまく出力できました
0645デフォルトの名無しさん2009/08/21(金) 23:24:01
一応WindowsでTangoをつかうときの方法を紹介
tango.sys.win32.CodePage.CodePage.intoがある。
引数のdstはUTF-8が日本語3バイトに対してShift_JISは2バイトなため、最低srcのバイト数+1のバッファ(最後に\0の末尾文字が入る)を用意すればいい
----- 以下サンプル ----
import tango.io.device.File;
import tango.sys.win32.CodePage;

void main()
{
    scope f = new File("test.txt", File.WriteCreate);
    scope (exit) f.close;
    // mbs
    {
        char[] src = "あいうえお";
        char[] dst = new char[src.length+1];
        dst = CodePage.into(src, dst, 932);
        f.write(dst);
    }
    // ascii
    {
        char[] src = "abcde";
        char[] dst = new char[src.length+1];
        dst = CodePage.into(src, dst, 932);
        f.write(dst);
    }
}
0646デフォルトの名無しさん2009/08/22(土) 00:49:12
コンストラクタテンプレートがないおかげで汎用のアダプタクラスが作りづらいんですが、なにかいい回避策はないもんでしょうか
0647デフォルトの名無しさん2009/08/22(土) 01:08:54
>>646
どうだろう
アダプタはどんな機能を持っているの?
0648デフォルトの名無しさん2009/08/22(土) 01:20:22
>>647
メソッドをbindしたい。
構造としてはこんな感じ。

interface I { void f(int i); }
class C : I { ... }
class Adapter(T:I, int fix) : T
{ this(A...) { super(A); }
void f() { f(fix); }
}

シンボルI, Cはすでにクラスとして使われていて、今からテンプレートにするのが難しい。
同じ目的を果たすのに別の解があればそれでも良いんだが、さてどうしたものかなと。
ちなみにC++ではだいたい目的どおりのコードが書けて、発想が縛られてるのかも。
0649デフォルトの名無しさん2009/08/22(土) 02:15:26
opCallで書いてみるとか・・・
0650デフォルトの名無しさん2009/08/22(土) 02:24:55
>>648
Adapterの更に子クラスを作ってそいつをテンプレートにする。
0651デフォルトの名無しさん2009/08/22(土) 02:57:33
>>649
どうにもうまく親クラスのコンストラクタにたどり着けなかった
親のopCallを呼ぶと親が帰ってくるという罠が……

>>650
同じくsuper.superに届かず
とりあえずあきらめてみる
0652デフォルトの名無しさん2009/08/22(土) 04:44:02
>>648
こんなかんじかな?
http://tinyurl.com/nykscv
問題は親が複数のコンストラクタを持っている場合…
is式でオーバーロードされた関数の引数のタプルってどうやって得るんだろう?
0653デフォルトの名無しさん2009/08/22(土) 13:52:10
>>648
それがエラーになるのは、コンパイラが自動生成するthis()と、
ユーザ定義のthis(T...)(T)がコンフリクトしているのが原因。
今のところテンプレートと非テンプレートはオーバーロードできないけど、
MLでウォルたんはこれをできるようにしたいと言っていたから、ちょっと待てばいいと思う。
0654デフォルトの名無しさん2009/08/22(土) 13:52:46
static opCall(A...)(A args) {
auto _this = GC.malloc(typeof(this).sizeof);
auto ci = typeof(this).classinfo;
_this[0..ci.init.length] = ci.init;
(cast(typeof(super))_this).__ctor(args);
return cast(typeof(this))_this;
}
0655デフォルトの名無しさん2009/08/22(土) 14:02:16
>>652
std.traits.ParameterTypeTupleあたりに解決法が書かれているかもしれないが、ちょっと分からず。

std.typecons.Uniqueを見てopDot + alias thisを使った委譲に切り替えようかなと思ったのだが、
肝心のUniqueが動かない?中身を見るとコンストラクタテンプレートがコメントアウトしてあってnot work YETと書いてある。
0656デフォルトの名無しさん2009/08/22(土) 14:40:30
関数の中にテンプレート書けるようにならないかなあ
0657デフォルトの名無しさん2009/08/22(土) 16:26:35
>>654
ぱっと見黒魔術にしか見えない
■ このスレッドは過去ログ倉庫に格納されています