D言語 Part22
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/22(月) 01:38:41過去スレ、関連スレは >>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)
0696デフォルトの名無しさん
2009/08/23(日) 23:14:390697デフォルトの名無しさん
2009/08/23(日) 23:44:490698デフォルトの名無しさん
2009/08/24(月) 01:00:330699デフォルトの名無しさん
2009/08/24(月) 03:09:300700デフォルトの名無しさん
2009/08/24(月) 07:56:53どこまでがモジュール名なのかわからないからとか?
ファイル名出ててわかりにくいのはなぜ?
0701デフォルトの名無しさん
2009/08/24(月) 08:03:07ふと思い出してvoodooを調べてみたら
http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%89%E3%82%A5%E3%83%BC%E6%95%99
に、ブラックマジックという単語が出てるぞ。語源かは知らんが。
0702デフォルトの名無しさん
2009/08/24(月) 10:28:15例えばstd.functional.dのbinaryFunImplでエラーが発生したとメッセージが出るとします。
でも、自分が書いたコードの中で直接binaryFunImplを使ってないし、そもそもstd.functionalをimportすらしていません。
正解はstd.algorithmの中の関数の中でbinaryFunが呼ばれてるからなんですが、
自分が書いたコードのどこが間違っているのか、特定に手間がかかります。
0703デフォルトの名無しさん
2009/08/24(月) 11:28:48import std.stdio;
void func2(T, string f=__FILE__, int l=__LINE__)(T a){writeln("func2: ", f, "(", l, "): ", a);}
void func(T, string f=__FILE__, int l=__LINE__)(T a){func2!(T,f,l)(a);}
void main(){func(10);}
0704デフォルトの名無しさん
2009/08/24(月) 12:18:250705デフォルトの名無しさん
2009/08/24(月) 12:55:060706デフォルトの名無しさん
2009/08/24(月) 18:21:11今からなんだかワクワクしてきた…ッ!
0707デフォルトの名無しさん
2009/08/24(月) 19:11:12どうすれば?
0708デフォルトの名無しさん
2009/08/24(月) 19:16:290709デフォルトの名無しさん
2009/08/24(月) 19:19:02暗号化
0710デフォルトの名無しさん
2009/08/24(月) 19:20:110711デフォルトの名無しさん
2009/08/24(月) 19:21:02やってみる
0712デフォルトの名無しさん
2009/08/24(月) 19:22:460713デフォルトの名無しさん
2009/08/24(月) 19:25:06了解
0714デフォルトの名無しさん
2009/08/24(月) 19:27:140715デフォルトの名無しさん
2009/08/24(月) 21:02:37なるほど、実行時エラーはそれでいけますね。
しかし、全ての関数にそれを仕込むのは手間がかかりそうです。
またPhobosをよく使うので、そこはどうしようもないのがつらいところ。
>>704-705
コンパイル時のエラーメッセージで困るのは、確かにテンプレート絡みですね。
今後に期待?
0716デフォルトの名無しさん
2009/08/24(月) 22:05:220717デフォルトの名無しさん
2009/08/24(月) 23:11:550718デフォルトの名無しさん
2009/08/24(月) 23:47:350719デフォルトの名無しさん
2009/08/24(月) 23:49:46構造体でいいじゃんと思うのだけど…
0720デフォルトの名無しさん
2009/08/24(月) 23:52:27無名delegateも似たような理由だし。
0721デフォルトの名無しさん
2009/08/24(月) 23:56:41outな引数使えばいいと思う
0722デフォルトの名無しさん
2009/08/24(月) 23:57:32Tuple!(int, int) f(int, int) { /**/ }
f(f(2, 3))
0723デフォルトの名無しさん
2009/08/24(月) 23:58:03outは型推論ができないから糞すぎる。
0724デフォルトの名無しさん
2009/08/24(月) 23:59:11構造体でいいじゃんと思うのだけど…
0725デフォルトの名無しさん
2009/08/25(火) 00:13:30これ全部直すのめんどくせーw
0726デフォルトの名無しさん
2009/08/25(火) 00:19:500727デフォルトの名無しさん
2009/08/25(火) 00:44:00>>725
D2ならわりと初期のころから
引数の型が特定のenumなら、その型に当たる部分は型名省略してもいいだろうと以前から話題には上るし、
07のウォルたんの公演でもやりたいと言っていたが、流れ続けて現在に至る
0728デフォルトの名無しさん
2009/08/25(火) 00:44:59extern(C) void hoge(int *n);
を
extern(C) void hoge(out int n);
と書くためにある
0729デフォルトの名無しさん
2009/08/25(火) 01:20:34dmd2.031対応
0730デフォルトの名無しさん
2009/08/25(火) 10:33:280731デフォルトの名無しさん
2009/08/25(火) 10:39:250732デフォルトの名無しさん
2009/08/25(火) 11:45:470733デフォルトの名無しさん
2009/08/25(火) 14:49:040734デフォルトの名無しさん
2009/08/25(火) 16:22:47int main()
{
ubyte[] ary;
ubyte[] pico( ubyte[] sage ) { return sage = cast(ubyte[])"sage"; }
void fuga( ubyte[] sage ) { sage = pico( sage ); }
ary.length = 4;
fuga( ary );
writefln( "output: %s", cast(string)ary );
// 入力待ち
readln();
return 0;
}
/* 実行結果
* output:
*/
0735デフォルトの名無しさん
2009/08/25(火) 16:24:560736735
2009/08/25(火) 16:27:230737デフォルトの名無しさん
2009/08/25(火) 16:27:54fuga関数にinoutを追加したら動きました!
今日一日悩んでたので感謝^^
0738デフォルトの名無しさん
2009/08/25(火) 16:31:290739デフォルトの名無しさん
2009/08/25(火) 16:37:42いや〜、セーブデータを作るモジュールを作っていて詰まったのですよ(;^^
0740デフォルトの名無しさん
2009/08/25(火) 16:51:210741デフォルトの名無しさん
2009/08/25(火) 16:53:300742デフォルトの名無しさん
2009/08/25(火) 16:56:46inoutじゃなくてrefだ
0743デフォルトの名無しさん
2009/08/25(火) 16:57:58そうなんですか? 知りませんでしたorz
>> 742
ぇ..
0744デフォルトの名無しさん
2009/08/25(火) 17:00:33あと >> とレス番は離さないで
0745デフォルトの名無しさん
2009/08/25(火) 17:01:28すみません・・
焦っていたもので(;^^
resに変えておきます。
0746745
2009/08/25(火) 17:02:23refですね(;--
0747デフォルトの名無しさん
2009/08/25(火) 17:05:18ウォルたんなら・・・ウォルたんなら・・・やってくれる(はず)
0748デフォルトの名無しさん
2009/08/25(火) 17:26:09あほかw
そんなことしたらinじゃない普通の引数を表すキーワードが必要になるだろうが。
0749デフォルトの名無しさん
2009/08/25(火) 19:00:310750デフォルトの名無しさん
2009/08/25(火) 19:53:43その方がいいかも知れんね。それこそ >>734 みたいな直観的じゃないことがたまにあるし。
void hige( ubyte[] fuke ) { fuke.length = fuke.length + 64; }
こういうのとか。
0751デフォルトの名無しさん
2009/08/25(火) 20:49:04まあswitchがそのまんま残ってるくらいだから無くならないだろうけど
0752デフォルトの名無しさん
2009/08/25(火) 22:15:400753デフォルトの名無しさん
2009/08/25(火) 22:26:12たとえばコンパイラが返り値の受け手がいない関数の処理をどうしたらいいか考えてみると分かりやすい
0754デフォルトの名無しさん
2009/08/25(火) 22:27:40テンプレート関数でいいなら。
T func(T)(){
static if (is(T==int)){return 0;}else{return 1.0;}
}
0755デフォルトの名無しさん
2009/08/25(火) 23:24:56少なくとも、この挙動が正しいならプロパティ名を分けないと分からん
interface I {}
class C : I {}
class D : C {}
void o(in Object obj) { writeln(obj.classinfo.name); }
void i(in I obj) { writeln(obj.classinfo.name); }
void c(in C obj) { writeln(obj.classinfo.name); }
void main() {
auto d = new D;
o(d); // classname D
i(d); // classname I
c(d); // classname D
}
0756デフォルトの名無しさん
2009/08/25(火) 23:30:340757デフォルトの名無しさん
2009/08/26(水) 00:06:40とりあえずリポートしておいた
0758デフォルトの名無しさん
2009/08/26(水) 00:08:24たぶんIUnknownとかCOMなんかの関係があってObjectにcastできないと実行時型情報が取り出せないんじゃないかと予想
0759デフォルトの名無しさん
2009/08/26(水) 00:09:46template Te(T) if (is (T : Object)) { ... }
とか見かける
interfaceはいらない子ですか?
0760デフォルトの名無しさん
2009/08/26(水) 07:40:00import std.stdio;
interface I {
void a() const;
}
class C : I {
override void a(){} const
}
void main()
{
void i(in I obj) {
writeln((cast(Object)obj).classinfo.name);
obj.a();
}
void c(in C obj) {
writeln(obj.classinfo.name);
obj.a();
}
i(new C);
c(new C);
}
main.d(6): Error: function main.C.a of type void() overrides but is not covariant with main.I.a of type const void()
main.d(6): Error: function main.C.a does not override any function
0761デフォルトの名無しさん
2009/08/26(水) 08:08:330762デフォルトの名無しさん
2009/08/26(水) 08:38:130763デフォルトの名無しさん
2009/08/26(水) 09:01:51{
}
0764デフォルトの名無しさん
2009/08/26(水) 09:02:540765デフォルトの名無しさん
2009/08/26(水) 22:34:380766デフォルトの名無しさん
2009/08/26(水) 22:40:21俺が一番嫌いな言葉はsynchronizedで二番目がimmutableなんだぜー!
0767デフォルトの名無しさん
2009/08/26(水) 23:38:570768デフォルトの名無しさん
2009/08/27(木) 01:37:27const string toString() に大変身するの?
0769デフォルトの名無しさん
2009/08/27(木) 02:00:12また >>762 のことにより非const関数も別に必要なので
string toString(); と const string toString(); の両方になるべきだと思う
0770デフォルトの名無しさん
2009/08/27(木) 02:04:32const string toString() がいいとおもう。
>>762 に関しては ref 使えばいいのでは?
0771デフォルトの名無しさん
2009/08/27(木) 02:06:55書いてみたらさほど手間でもないかな?
0772デフォルトの名無しさん
2009/08/27(木) 02:08:54import std.stdio;
class A {
override string toString() {
return "A";
}
override string toString() const
{
return "const(A)";
}
}
void main() {
auto a = new A;
writeln(a.toString());
const ca = new A;
writeln(ca.toString());
}
0773デフォルトの名無しさん
2009/08/27(木) 02:10:25なんでだ
0774デフォルトの名無しさん
2009/08/27(木) 02:27:240775デフォルトの名無しさん
2009/08/27(木) 02:28:080776770
2009/08/27(木) 03:04:33個人的には、少なくともObjectクラスのメンバ関数としてはいらないと思うなぁ
そもそもimmutableメンバ関数ってどういう時に使うと便利なものなの?
0777デフォルトの名無しさん
2009/08/27(木) 04:38:19static関数だとimmutableにしたりすることはある。なんらかのIDつけるときとか。
インスタンスでそういうケースもないことはないかなという気はする。
0778デフォルトの名無しさん
2009/08/27(木) 07:18:53コンパイルできちゃう所に痺れる
0779770
2009/08/27(木) 12:09:38一応、mutableなインスタンスでは実行できず、imutableなインスタンスなら実行可能なメンバ関数というものではあるらしい。
auto a = new A;
immutable b = cast(immutable)a;
a.immutableMemberFunction(); //NG
b.immutableMemberFunction(); //OK
つまり、immutableメンバ関数外からは絶対にメンバ変数が変更されないという保証がなされる。
ということは、関数内部でメンバに対してmutexロックなど排他制御をする必要がなくなる…という意味では価値があるかもしれない。
けど、だとしたら逆にいえば普通のメンバ関数とかconstメンバ関数内では、メンバ変数にアクセスする際には
必ず排他制御を行わなきゃいけないということになる。
だけどそれは、パフォーマンス的にあまり現実的とはいえず、普通はやらないので、
やっぱりimmutableメンバ関数の有用性には疑問が残る。
0780pmlynzZPUThDtKP
2009/08/27(木) 12:19:46<a href="http://artemis2.wackwall.com/post/postId/12927/">pictures of artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12929/">email artemis cosmetics mumbai</a>
<a href="http://artemis2.wackwall.com/post/postId/12930/">artemis goddess of the hunt</a>
<a href="http://artemis2.wackwall.com/post/postId/12931/">artemis and the stag</a>
<a href="http://artemis2.wackwall.com/post/postId/12934/">artemis nightshade</a>
<a href="http://artemis2.wackwall.com/post/postId/12936/">artemis dog food</a>
<a href="http://artemis2.wackwall.com/post/postId/12938/">artemis the goddess of hunt</a>
<a href="http://artemis2.wackwall.com/post/postId/12940/">remove generic artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12942/">symbol of artemis</a>
<a href="http://artemis2.wackwall.com/post/postId/12943/">artemis myth</a>
<a href="http://artemis2.wackwall.com/post/postId/12945/">artemis - greek mythology</a>
<a href="http://artemis2.wackwall.com/post/postId/12947/">artemis cat food</a>
<a href="http://artemis2.wackwall.com/post/postId/12948/">artemis orthia</a>
<a href="http://artemis2.wackwall.com/post/postId/12950/">artemis symbol</a>
<a href="http://artemis2.wackwall.com/post/postId/12952/">tragic love story artemis</a>
0781デフォルトの名無しさん
2009/08/27(木) 12:40:45auto a = new immutable(A);
0782770
2009/08/27(木) 15:32:30import std.stdio;
import std.contracts;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
}
void main() {
auto a = new A;
a.i = 100;
immutable b = cast(immutable)a;
a = null;
b.immutableMemberFunction();
}
こういう場合があるため、それは不適当と判断しました。
0783770
2009/08/27(木) 15:41:53ことに絶望したのは言うまでもない。
………なぜだ…。
0784デフォルトの名無しさん
2009/08/27(木) 16:16:35キャストしたらimmutable性を自分で保証しなければならず
なくなったり書き換えられたりしたら未定義動作なのですが
これはそのケースになりませんか?
ttp://www.kmonos.net/alang/d/2.0/const3.html
> しかし、だからといって、データを書き換えられるようになるわけではありません:
>*q = 3; // コンパイルは通るが、未定義動作
それはともかくこうするとキャストいらないですよ
import std.stdio;
import std.contracts;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("immutableMemberFunction, i=", i); }
this(){}
this(A other) {
i = other.i;
}
}
void main() {
auto a = new A;
a.i = 100;
auto b = new immutable(A)(a);
b.immutableMemberFunction();
}
0785770
2009/08/27(木) 16:57:19値を変更した後にimmutableにキャストし、a = null;でimmutable性を保証しているため、
その未定義動作には当てはまらないと思いますが…(assumeUniqueの仕様例と実装を見る限り)
そのコードはいいかも、と思ったけど、以下のように継承に対応することができないのでは?
import std.stdio;
class A {
int i = 0;
immutable void immutableMemberFunction() { writeln("A: i=", i); }
this(){}
this(A other) { i = other.i; }
}
class B: A {
int j = 0;
this(){}
override immutable void immutableMemberFunction() { writeln("B: i=", i, ", j=", j); }
}
void main() {
auto a = new B;
a.i = 1; a.j = 2;
immutable A b = cast(immutable)a;
immutable A c = new immutable(A)(a);
a = null;
b.immutableMemberFunction();
c.immutableMemberFunction();
}
0786デフォルトの名無しさん
2009/08/27(木) 17:12:20あーなるほど確かに
下のコードはぱっと見ではわからないので後で見ます
0787デフォルトの名無しさん
2009/08/27(木) 17:16:28メンバ関数を呼び出す側が排他制御をする必要があるかどうか判断できる、
ということのような気がする。
0788デフォルトの名無しさん
2009/08/27(木) 17:50:48immutable A b = cast(immutable)a;//これはcast(immutable(B))aです
immutable A c = new immutable(A)(a);//こっちはスライスされます
こうしましょう
immutable A c = new immutable(B)(a);
0789デフォルトの名無しさん
2009/08/27(木) 18:24:47確かにその通りですね。ただ、それはimmutableなインスタンスの有用性であって、
immutableメンバ関数の有用性ではない気がするのですが…
(immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
ではimmutableメンバ関数が有用なのはどんな時?)
>>788
もはや自分が何を言いたかったのか忘れてきたけど、何かそれは元も子もない何かを感じる
immutableなインスタンスを作る時にいつもそれができるとは限らないし…
0791デフォルトの名無しさん
2009/08/27(木) 18:55:24> (immutableなインスタンスであれば排他制御なしにconstメンバ関数も呼び出すことができる。
> ではimmutableメンバ関数が有用なのはどんな時?)
>782のような場合にimmutableにキャストし忘れた場合にはエラーになるけれど、
関数をimmutableと修飾しておかない場合、エラーにできなくなるような気がする。
0792770
2009/08/27(木) 19:23:21もう値が変更されなくなった後でないと使うことが許されないメンバ関数…ってことか?
終了処理後でなければ実行することができないと明示するための宣言として利用できるということかな?
Hash計算クラスの、終了処理後でないと計算結果が出せない…みたいな。
0793デフォルトの名無しさん
2009/08/27(木) 19:58:100794デフォルトの名無しさん
2009/08/27(木) 20:43:450795デフォルトの名無しさん
2009/08/28(金) 00:32:57■ このスレッドは過去ログ倉庫に格納されています