1 :
デフォルトの名無しさん :
2006/12/09(土) 08:44:01
static foreach とか無いかな
それ何度か聞いたけど どういうコードを実現したいの?
あ、やっぱり話に上がったことはあるんですね… つい最近Dを勉強しはじめたばかりなので具体的なコードは書けないんですけど、 例えば、可変長引数テンプレートでaliasのリストを渡して、 それぞれの名前と対応するメンバ変数と、 それぞれ同じような処理をするメンバ関数(get、set用)を持ったクラスを宣言する… という感じです 解りにくくてすみません 何と言うか、もっと具体的なコード書けるようになってから出直した方がいい感じですね
>>6 タプルのforeachがまんまstatic foreach。ただし、関数内だけでしか使えないけど。
D 0.177
>>7 あ、そうなんですか
タプルが解るようになったら試してみます
10 :
デフォルトの名無しさん :2006/12/09(土) 21:24:23
Casting a value v to a struct S is now rewritten as S(v). Initializing a struct S from a value v is now rewritten as S(v). これ、どうなんだろう opCastの幅が広がりんぐってこと?
>>10 違う。opCall。
cast(S)vがS(v)に、S s=v;がS s=S(v);に。
しかもポインタには使えない。いわいる一つの微妙。
12 :
10 :2006/12/09(土) 21:50:25
アッー!
なにそれ いまさらcast()がいらんようになるのか?
>>13 struct S{
int a;
static S opCall(int v){
S s;
s.a = v;
return s;
}
}
void main(){
S s = 3;
printf("%d\n",s.a); // 3
s = cast(S)6;
printf("%d\n",s.a); // 6
}
こういうことっぽい。
ほほう ふーん へえ うーん ・・・ 構造体と組み込み型の間の垣根が少し下がったと思っておこう
>>16 まじか
struct S{
int a;
static S opCall(int v){
S s;
s.a = v;
return s;
}
void opAssign(int v){
a = v;
}
}
void main(){
S s = 3;
printf("%d\n",s.a); // 3
s = cast(S)6;
printf("%d\n",s.a); // 6
s = 9;
printf("%d\n",s.a); // 9
}
まじだ
18 :
前954 :2006/12/10(日) 03:00:53
D 0.177 Dec 9, 2006 New/Changed Features * Casting a value v to a struct S is now rewritten as S(v). * Initializing a struct S from a value v is now rewritten as S(v). * TypeInfo now always generated for enum, struct, and typedef's, to enable more thorough rtti. * classinfo.name now has the fully qualified name * Arrays no longer implicitly convert to pointers unless -d is used. * Need to recompile because: o Improved name mangling for floating point constants o Nested and member functions needing 'this' are preceded by 'M' in the mangled type.
バグ報告と言えば Part9 の 799-814 あたりの const 配列が case で使えないあたりはどーなのだろう?
structにあくまでコンストラクタが定義できないのは何でだろう。 staticなopCallで代用できるとはいえ、バッドノウハウの臭いが・・。
構造体は構造体だってことなんジャマイカ
記法は?クラスの場合コンストラクタってnewした時に呼ばれるじゃん。 構造体はnewしないでも作れることを考えるとなんか上手いのが思いつかん。 thisで自分型を返すstatic opCallが定義できるとか?
いやこういうことだとおも struct A { int a; this(int x) { a = x; } } { A a(10); // a.a == 10 }
リテラルがあればいいんでね?
そうでもない
構造体はクラス寄りなC++と違ってDでは組み込み型寄りなんだな でもC++みたいに書きたいなあ
>>前スレ996 なるほどー。初心者相手にいろいろとありがとうございます。。
>>28 そういう時は、classとscopeを使え、ということなのかも
>>23 >>25 とすると「構造体はnewを省略できる」ってことになるな・・。
あ、C#じゃそうなってる。
でもDだとstatic opCallとの曖昧さを解決せにゃならんから、
それでopCallに統一したってことなのかな。
でもopCallって、後になってコンストラクタの代用として提案されたテクニックだったような。
>>31 今回の変更は、
・cast式の動作を、cast先の構造体型で定義できるようになった
・構造体型の初期化の動作を定義できるようになった
・構造体型変数宣言の、汎用的な初期化を定義できるようになった
という変更で、>15の言うような意図だと思う。
だから、
> でもopCallって、後になってコンストラクタの代用として提案されたテクニックだったような。
これを踏まえて、すでに初期化用のopCallが定義されている構造体型について、
いままでなら S s = S(a); と書くところを、構造体の定義を変えなくとも
S s = a; と書けるようになることを意図してるんじゃないかな、たぶん。
>>32 誤 > ・構造体型の初期化の動作を定義できるようになった
正: ・構造体型の代入式の動作を定義できるようになった
書き手の意図は「構築」なのに、表現が「呼び出し」になっちゃうところが直感的じゃ無いな。 unittestやDbCまで取り入れて「コードによる表明」を重視してる言語なのに。 突然だが、Delphiみたくcreateメソッドとコンストラクタも もっと歩み寄ってくれればいいのに、と妄想してみる。 class Obj{ private int i; new (int i){ this.i = i; } new fromFile(char[] file){ int i = loadFromFile(file); new(i) } } Obj o = Obj.new(); Obj o2 = Obj.new(100); Obj o3 = Obj.fromFile("obj.dat"); 呼び出しをstaticメソッド的にして、名前も付けたい的な。
なんだかこれはDらしくない気がする変更だなぁ?
前提として、構造体とクラスは別物であるという思想は見えますね。 テンプレートのために妥協したというか、そんな感じがするけど。
Dって理想を掲げたは良いものの、実装するに当たって色々迷走して結局ワケわかんなくなったって認識でいいですか?
構造体の利点って? newしないでいいだけ?
値渡しだからクラスとは違うもんだよ。
それってつまりポインタ使えばクラスと一緒ってこと? でいいのかな。
どうだろう、
>>21 で話題にあがってる通りコンストラクタ無いみたいだし。
今こそ高らかに叫ぼう。 ver1.0マダーーーーーーーーーーーーーーーーーーーーーーーーーー?
年明け、年明け。
(´・ω・`) マジレスされても困る
そらそうだ
じゃあD言語版をささっと private import std.c.stdio; void hanoi(int n,int from,int to,int tmp,void delegate()next){ if(!n)return next(); hanoi(n-1,from,tmp,to,{ printf("%d to %d\n",from,to); hanoi(n-1,tmp,to,from,next); }); } void main(){ int n;scanf("%d",&n); hanoi(n,0,1,2,{}); }
俺もDっぽく書いてみた! template hanoi(int n,char[] from,char[] to,char[] tmp){ static if(n){ mixin hanoi!(n-1,from,tmp,to); pragma(msg,from ~ " to " ~ tmp); mixin hanoi!(n-1,tmp,to,from); } } mixin hanoi!(2,"A","B","C");
○。・。○。・。○。・。○。・。○。・。○。・。○。・。○。・。○ このレスをみたあなたは・・・3日から7日に ラッキーなことが起きるでしょう。片思いの人と両思いになったり 成績や順位が上ったりetc...でもこのレスをコピペして別々のスレに 5個貼り付けてください。貼り付けなかったら今あなたが1番起きて ほしくないことが起きてしまうでしょう。 コピペするかしないかはあなた次第... ○。・。○。・。○。・。○。・。○。・。○。・。○。・。○。・。○
class AAA { int opIndex( size_t i ){ return i; } int length(){ return 5; } } int main() { auto a = new AAA; writefln( a[3] ); writefln( a[length-1] ); writefln( a[$-1] ); return 0; } こんなかんじの事って出来ないのかね?
できない
無理すれば出来る気になれるよ! import std.stdio; int length;alias length __dollar; class AAA { int opIndex(lazy size_t i ){__dollar=this.length; return i(); } int length(){ return 5; } } int main() { auto a = new AAA; writefln( a[3] ); writefln( a[length-1] ); writefln( a[$-1] ); return 0; }
ddocのExample内で private: って日常茶飯事的に入れたらセクション名と勘違いされて悲しいです ていうかバグ?
行頭?に置くと勘違いされたような・・・ 全角スペースとかを手前に挿入すれば回避できたはず。
>>56 あるいは、private { }にするとか、private ...と個別に書いて回避するか。
GDC release 0.20
http://sourceforge.net/project/showfiles.php?group_id=154306 * Updated to DMD 0.177
* Fixes for synchronized code generation
* Better support for cross-hosted builds
* Fixed Bugzilla 307, 375, 403, 575, 578
* Applied Anders Bj-Av(Brklund's MacOS X build patches
* SkyOS support will return when GCC 4.1.1 is supported.
ウェーハッハッハッハ。ようやくgdcが来た様だな。存分に遊ばせてもらうぜ。
privateなthisでnew出来るんだけど仕様? assert(0)しろってことかな
あっ まちがえた それにしても仕様?
// aaa.d class AAA { private this(){} } // bbb.d import aaa void main() { auto x = new AAA; } bbb.d(2): class aaa.AAA member this is not accessible 出来ないけど。同一モジュール内でprivateが見えるのは仕様。
うあああ、そうだったか。 Dのfriend属性とか言うやつか、こんにゃろう・・・。 まりがとうございました・・。
66 :
デフォルトの名無しさん :2006/12/19(火) 16:45:16
FreeBSD使ってるからGDCはありがたい
import std.ctype, std.stream; した状態で isidigit をそのまま使おうとすると関数名が衝突して、 精神的に萎える。 std.stream のほうは private なんだから無視してくれるとありがたいんだけどなー
D 1.0 まで あと 11 日
version1.0マ… いえ、なんでもないです
ノータ… いえ、なんでもないです
クリスマスイブまで あと 2 日
プロパティ書いてると時々auto型を返せたらいいなと思う。 パパッとかけて良い。 時々ね。実際は要らん。混乱のもと。
プロパティなんて適当にtemplate使えばヨクネ? template getter(alias T){final typeof(T) getter(){return T;}} template setter(alias T){final typeof(T) setter(typeof(T)value){return T=value;}} template property_(alias T){alias getter!(T) v;alias setter!(T) v;} template property(alias T){alias property_!(T).v property;} struct Point{ int x_,y_; alias property!(x_) x; alias property!(y_) y; } void main(){ Point v; v.x=100; v.y=120; printf("%d %d\n",v.x,v.y); }
>>73 Dはメンバ関数をプロパティ形式で呼び出せるからそんなことする必要ないんじゃ?
そういう話じゃなくて、
auto Klass hoge(){
return Klass.new;
}
ってメンバ関数を定義したいという話じゃないかと思った。
用途は知らないけど。
>>73 それは素直にメンバをpublicにすればいいんじゃないか……?
ご丁寧にfinalまでつけてるし。
オブジェクトはできるだけimmutableに、
副作用を避けるプログラミングを心がける俺。
あ、getterだけ欲しい場合とかは使えるかも。
ところで
>>74 のKlass.newなんて書き方は通るの?
>>72 軽いゲッタの時に時々ね
class AAA {
auto i(){ return(i_ + 2); }
private int i_;
}
>>76 違う言語と間違えた。
>>77 ああー、型推論のことか。
RAIIがautoじゃなくてscopeになったの忘れてた。
字面的にはstaticとかとややこしいことになりそうね。
autoがダブってるよりは数倍マシかと。 それにしても、都合よくscopeって予約語があったのはよかったなって感じ。
あれはひどかった
autoじゃなくてstatic指定のときも型推論されるんだろうから、 そのへんは別にややこしいところじゃないな。 ソースの見通しが悪くなるのが難点だけど、それは>72のとおり最初から 承知の上で、>77のような用途に限れば大した問題にならないから 「あったらいいな」と思うことはあるね、という話か。ようやく分かった。
オペレータオーバーロード+templateを使ってるときにも欲しくなるわな。 でも以下が通ってないので面倒げ。戻り値の段階で引数を定義すればいいだろうけど。 typeof(i+10) test(int i){ return i+10; } func.cのFuncDeclarationのsemantic3をsemanticの手前の方でも行うようにすればよさげ?
# 俺も未だにauto->scopeの変更に頭が付いていかなくて困る。
>>72 で"auto/自動的"に決定されるべきなのはメンバ変数の方じゃないか?
インターフェースであるプロパティの戻り値が、内部実装である_iの型に依存してちゃ、
クラスの利用者が困る。
要は、「プロパティ」と「その実体のメンバ変数」の間で
コードの重複を強要される、ってのが問題なんじゃないだろーか。
>>77 だと、intの重複は消えたけど"i"と"i_"がまだ意味的に重複してる。
さらにgetterとsetterの間も同じ重複の問題が。
やっぱC#みたく真面目に「プロパティ」って論理単位をサポートすべきなんじゃないかなぁ。
んで、実体の変数なんていっそプロパティ内の暗黙変数にしちゃったらどうだろう。
class Point{
var int x{ // プロパティ宣言。var修飾子により、内部では暗黙の変数varが使える
get{ return var; }
set{ var = value; }
}
var int y{ get; set; } // 余計な事しないならこれだけでもいいかも
real distance{ // var修飾子がないので、コンパイラはvar変数を生成しない
get{ return sqrt(x * x + y * y); }
}
private SomeObject inner; // プロパティが必要ないメンバも当然あるでしょう
}
とか。キーワード増やしすぎだけど。
プロパティが呼び出し側の書式の問題に過ぎないってのは、
いずれリファクタリングブラウザなんかが出てきた時とかにも困る気がする。
>>84 その案だと、_iがvarに変わってわかりにくくなった気がする。
varだけでなくget,setという言葉も特別扱いせにゃならなくなって、
(もとの定義文にあった、)名前の共通からなる見通しのよさがスポイルされると思う。
あとどうやってクラス内部から実体にアクセスするの、とか。
> 要は、「プロパティ」と「その実体のメンバ変数」の間で
> コードの重複を強要される、ってのが問題なんじゃないだろーか。
そもそもは、
・フィールドxをプロパティxへと書き換えるときに備えて
いちいちgetter/setter定義しておくのは無駄だし面倒
・フィールドxをプロパティxへと書き換えるときに、インターフェイスが
変わらないようにしておけば、内部実装だけ書き換えれば済む
という経緯で現在に至るんだろうから、今度は内部実装の書き換えを
最小限にすることが正当進化じゃないかなと。
そこで、プロパティ実装後もクラス内部では依然として以前の名前で実体の変数に
アクセスできるなら、プロパティ経由でアクセスするように変える内部実装だけ
書き換えれば済む。
そのためには、要は外側からのインターフェイスだけ保存されればいいんだから、
アクセス権限に応じて異なるインターフェイスを定義できるようにできればいいと思う。
いまのprivateとかpublicとかだと、
「publicからはこのインターフェイス、privateではこのインターフェイス」
といった風には定義できない(と思う)。
D 0.178
D 0.178 Dec 23, 2006 New/Changed Features * Implemented Named Return Value Optimization * If the first element of an array literal is a static array, it is converted to a dynamic array. * Empty ; no longer allowed after conditional statements, see Bugzilla 576.
おお、 char[][] names = ["alice", "bob", "carol"]; は書けるようになっている。 でも最初の要素を変に特別扱いするのは相変わらず……。 class Animal{} class Dog : Animal{} class Cat : Animal{} Animal[] animals = [new Cat(), new Dog()]; // コンパイル通らない ちゃんと配列リテラルの型を明示的に宣言できて、 型を省略した場合は”全要素の最大公約数な型”にするとかして欲しいなぁ。 あと、 unittest{ abstract class A{} } がコンパイル通らないのはいいんだろうか。
>>88 だわな。Walterたん、アドホックな対応好きだから。DMDが早いのもそのせい(おかげ?)。
>unittest{ abstract class A{} }
非staticなネストクラスにabstractか。多分バグ。
wchar[][] w= [['A'], ['B','\u7000']]; // error wchar[][] w= [cast(wchar[])['A'], [cast(wchar)'B','\u7000']]; //OK あいかわらずwcharの肩身が狭い・・・
どっちも静的コンストラクタ付きでモジュールの相互依存した時の「実行時エラー」てどうなの。 どっちかっつーとコンパイル時が欲しい。
bit型かbool型を非推奨にするか削除するかもしたほうがいいんでない? 全く同じ方が二つあるのはめんどいだけだ
>>92 その議論は3000年前に通過しているッ!
0.148で廃止されて基本データ型のドキュメントにも載ってない話を一体どこから。 うおっ、phobosにalias定義がまぶしっ。こんなんあったのか。
ふと思った。 bit b = true; ってなんかおかしくね?
現状の「違う物なんだったら違うんだー」って方向だったら bool b = true; // or false じゃあなくて bit b = 1; // or 0 こうじゃないの
あ,しまった true != 0 false == 0 ってことか
ってあってるじゃん( ゚д゚ ) ほげー すまそ
なにをいっているのかね
スーパークラスのメソッドをサブクラスでオーバーロードすると、 サブクラスのオブジェクトからスーパクラスの元メソッドが 呼べなくなるのはイタクね?(コンパイルエラーデチャウヨ・・) あとpackageがまともに動かんのもイタイ・・・ package abstractなメソッドが使えんし・・orz
>>100 alias SuperClass.method method; ?
>>100 >スーパークラスのメソッドをサブクラスでオーバーロードすると、
>サブクラスのオブジェクトからスーパクラスの元メソッドが
>呼べなくなるのはイタクね?(コンパイルエラーデチャウヨ・・)
ふつうに出来るわけだが。
class Hoge{void foo(){printf("Hoge\n");}}
class Huga : Hoge{void foo(){Hoge.foo();printf("Huga\n");}}
void main(){
auto x = new Huga;
x.foo();
x.Hoge.foo();
}
103 :
100 :2006/12/26(火) 03:31:00
コード貼った方がよかった。スマソ class A{ void func(int a){} } class B : public A{ void func(int[] a){} } int main() { B b= new B(); b.func([1]); b.func(1);//function main.B.func (int[]) does not match parameter types (int) return 0; }
105 :
100 :2006/12/26(火) 03:35:45
>>102 書き込んでから気付いたけど、一応
b.func(1);
を
b.A.func(1);
にすると通るね。この書式、知らんかった。ありがとう。
106 :
100 :2006/12/26(火) 03:39:47
なんていうか それ隠蔽
へー。俺もこれ知らなかった。覚えておこう……。 ついでに「共変の戻り値」なる言語仕様があることに最近気づいた。 しかもJava5にもあったなんて、全く気づいてなかったし……。
109 :
デフォルトの名無しさん :2006/12/26(火) 11:51:34
共変の戻り値はC++にもあるよね
なるほどあれか。VC6のインテリセンスがしょぼかったから x.func();の代わりによくx.A::まで書いてfunc();をリストさせてたお
Boxに入っている数値に演算をしたいけど馬鹿正直にunboxableな奴を調べて足すコードだとかなりでかくなるよね・・・ テンプレート使えるかな?
こゆこと? void add(T)(inout Box b, T x){ if ( .unboxable!(T)(b) ) b= .box( .unbox!(T)(b) + x ); } なんか違う気もするが・・
>>112 そんな感じなんだけど必要に応じてキャストも入れてるからややこしくなってる。
とりあえずmixin二つとテンプレート一つでなんとかやってるけど
import std.boxer; import std.typetuple; alias TypeTuple!(int,uint,long,ulong,real,creal) typelist; Box BinExp(alias F,alias t=typelist)(Box a,Box b,Box default_value = Box.init){ foreach(_1;t)if(unboxable!(_1)(a)) foreach(_2;t)if(unboxable!(_2)(b)) return box(F(unbox!(_1)(a) , unbox!(_2)(b))); return default_value; } typeof(T+U) plus_(T,U)(T a,U b){return a+b;} alias BinExp!(plus_) plus; typeof(T*U) mul_(T,U)(T a,U b){return a*b;} alias BinExp!(mul_) mul; void main(){ auto x = mul(plus(box(2),box(3.2)),box(3)); printf("%.*s\n",x.toString()); } 素直に書いたけどでかいなぁ。 というかBoxerっている? いまいち使い道わからんのだけど。
>>114 おお、すごい。俺の頭が足りないだけだろうけど。
いっかいBoxに入って渡ってくるから必要になる。
今、javaのコードをDに移植してるんだけど、 下記コードのような構文が旨く動いてくれず、ドン詰まっております。 import宣言は循環してるけどstatic thisに関しては循環してないと思うんだけど・・ なんか、いい手はないスかね?(長くてスマソ) -----module1/a.d----- module module1.a; import module1.b; class A{ static const int a; static this(){a= 1;} public static int func(){ return B.b; } } -----module1/b.d----- module module1.b; import module1.a; class B{ static const int b; public static this(){ b= A.a; } } -----main.d----- import std.c.stdio; import module1.a; int main() { printf("%d\n",A.func()); return 0; } >bud main >main.exe Error: circular initialization dependency with module a
>>116 相互import時、static thisが複数あると順序がどーのこーのという理由でエラーになるようになってる。
static thisを複数持ってる時点でダメっスか・・orz
constだったらmodule a;import b;class A{static const int a=10;static int func(){return B.b;}}、module b;import a;class B{static const int b=A.a;}ってできるけど、もっと複雑な状態?
static const int a=1; じゃなくて static const int a; static this(){a= 1;} と書いたのは、1はコードを簡潔にするための暫定的な値で、 実際は関数で取得され、動的に決まるためです。(わかりづらくてスマソ) したがって、static thisを複数持たざるを得ません。(多分・・)
微妙にDのスレが減ってる気がする まあ(良い意味で)減ってくれた方が嬉しいんだけど たしか宿題スレってあったよね?
ねえねえ opPos ってなんの役に立つの? まじで知りたい。
a-b=a+-b
>>122 opなし=絶対値
opPos = 差分
みたいな変な記述法があると便利な場合
>>122 ETで正規表現作りたいときに役に立つ。
D 1.0まで後二日 何時ごろ公開されるんだろ
時差があるから、1/2 になるかもね。
128 :
デフォルトの名無しさん :2006/12/31(日) 06:45:37
鯖変わっててビビった ところで 小数に通常realを使えって事は整数にも通常longを使えって事でいい?
小数にrealを常用する理由はあるけど、 longを常用する理由はなんかあったっけ? 0.177の変更点の和訳、wikiも日本語リファレンスも > 値vから構造体Sへのキャストを S(v) と書けるようにしました > 値vから構造体Sを初期化するのを S(v) と書けるようにしました という感じの文になってるんだけど、コンパイラがそう書き直すようになった、 という変更じゃなくて、和訳の文面通り、プログラマーがそう書けるようになった、 という変更なの? プログラマは前からそう書いてたんじゃなかったっけ。
>>128 realを常用する理由ってのはどうせ速度差大して無いから精度いい方を使っとけってこと?
整数の場合は計算精度は変わらないんだから、オーバーフローしないならintでいいんじゃないの?
……ってなんかすげえ当たり前のこと言ってるが。
0.178になって通らなくなったコードがあるんだけど、 和訳もまだない上に英語分からんから本家 Change Log が読めん・・・ ゆえに原因がわからん・・・orz
昔からfloatはdoubleより遅いって言われる原因は OSの分解能をそれぞれの型に落とし込むときに、 floatが一番コストが掛かるからじゃないのかな。 型の精度の保障という余計なコストが支払われないrealがオススメってことかと。
>>132 ちょっとまて、floatがdoubleより遅い具体的な環境ってどれよ?
CでもJavaでもそうでは?
CとかJava挙げたりOSがどうの言う時点でオワットル
x86とでも言えばいいの?実際遅いだろ
だからベンチマークなりなんなり具体事例あげてくれないか?>136
>>131 > * Implemented Named Return Value Optimization
コンパイラの戻り値がらみの(Named Return Value Optimizationって名前の)最適化
を実装したよ。(ユーザーにはあんまり関係なし)
> * If the first element of an array literal is a static array, it is converted to a dynamic array.
配列リテラルで [[3,2],[3,1,5]] って書いても(int[][2]として)通るようになったよ。
> * Empty ; no longer allowed after conditional statements, see Bugzilla 576.
static if(0) ; みたいな、条件文直後の空文はアウトになったよ。
3つめの変更に引っかかったのかなあ。
double で d1 += d2 を5秒間 66792999 66309956 64364378 float で f1 += f2 を5秒間 66186868 64843398 63162083 遅いな
えーっとそのね。 笑うところですか?
何逃げに走ってんだか
どうみても同じです。本当にありがとうございました。 とはいえ自分じゃまともなコードは書けそうもない。 小数点数演算以外の部分がどう影響を与えるかとかぜんぜん分からない。 import std.date; void main(){ int i=0; d_time t; float f1=0,f2=1; t = getUTCtime(); while(i++ < 100_000_000) f1 += f2; t = getUTCtime()-t; printf("%d\n", cast(int)t); } という感じでアバウトに数回試してみたけど、 realだけ明らかに遅くなった。doubleもfloatも 680前後なのにrealだけ1400前後。
realって10bitなんじゃね?
いよいよですね…
本当に1.0出るのか
次の日には、1.01が出る予感
148 :
デフォルトの名無しさん :2007/01/01(月) 00:35:40
次の日には出ないだろう。 その日だろ。
!omikuji !dama
>>116 all.d
import a;
import b;
a.d
import all;
static this(){}
b.d
import all;
static this(){}
c.d
import all;
void main() {}
これで順番が解決されて大丈夫になるはず。
-----s.d----- import f; void main() { func!(int)(); func!(char[])(); } -----f.d----- void hoge( int i ) {} void func( T )() { hoge(cast(T)1); } -----エラーメッセージ----- f.d(11): Error: cannot cast int to char[] f.d(11): function f.hoge (int) does not match parameter types (char[]) f.d(11): Error: cannot cast int to char[] f.d(11): Error: cannot implicitly convert expression (cast(char[])1) of type cha r[] to int f.d(11): Error: cannot cast int to char[] f.d(5): template instance f.func!(char[]) error instantiating // ちょちょww バグじゃね?
ちなみにバグだった場合、 わたくし英語出来ませんのでどなたか本家に報告をお願い致します。
>>151 cast(char[])1はエラー。エラーメッセージ嫁
>>153 そんなことはわかってるんよ
エラー行嫁
>>154 ああ、ファイル名が異なるって話ね。バグでしょ。
整数をchar配列に変換出来る分けないだろ・・・常識的に考えて・・・
まーだー?
まさかAppleの二の舞演じる気じゃねぇだろうな。 デベッロッパ:アップルさん冬にリリースと言いましたがまだでしょうか? アップル:ああ、冬って言うのはクパチーノに雪が降るときですからまだですね。 デベロッパ一同:ポカーン(クパチーノは雪が降るような気候じゃない)
f.d(5): が s.d(5): になってないのは仕様
まじすか これは結構困るのだが
1.0でた?
1.0 Digital Mars Walter Bright 2007/01/01 16:53 Here it is, and I'm not ready yet :-( I want to fix a few more problems first.
164 :
sage :2007/01/02(火) 17:04:05
ウォルターたん、やっぱり間に合わなかったのか
つまらん言語増やすな 何がD言語だよ洒落のつもりか
>Basic、C言語、Pascal、L言語と順番に なんでこの順番なんだ?
BCPL
>BCPL(Basic Combined Programming Language)に基づいてBasic、C言語、Pascal、L言語と順番に もう少し前から読め
もしかしてギャグの落ちを書かないといけない方向にむかってないか?
落ちを書いても理解できないんじゃないか?
プログラマーは下手なギャグが好きだからな。(確率65%)
この2〜3日中に1.0が出るのか それとももうきっぱり諦めてひたすらバージョンアップ再開するのか どっちなんだ
公開予告をしておいて当日に実行しない、この流れを俺は知っている。
生温かく見守って逝くスレです
焦らしプレイにも慣れたもんだ ウォルターたんは生粋のS 間違いない
ロングパスだなぁ。
Ver 1.00! !?
バグ修正の数がハンパない
おー来たか。 これでライブラリとか元気になるといいなあ。
ついに1.00キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
ん、マジで来たのか?
DL遅すぎ・・ サーバが非力なのか意外と人気なのか
意外と注目は高いからな。
190 :
デフォルトの名無しさん :2007/01/03(水) 17:12:50
ver1としてはもう言語仕様が変わらないと思っていい?
191 :
デフォルトの名無しさん :2007/01/03(水) 17:45:35
勉強始めようかと思うんだけどドキュメントって基本的に追いついてるとおもっていいの?
>>190 コンパイル通らなくなるような変更はないとみんな信じたがっている。
>>191 本家和訳の話?
なら、中の人が頑張って追ってくれてるから信頼していいと思う。
3分割DLしてるのに3つ目が固まってる(´Д`;)
194 :
デフォルトの名無しさん :2007/01/03(水) 18:14:55
分割ダウンロードとかふざけんなよ
195 :
デフォルトの名無しさん :2007/01/03(水) 18:15:15
皆torrent使えyo!
197 :
デフォルトの名無しさん :2007/01/03(水) 18:16:10
198 :
デフォルトの名無しさん :2007/01/03(水) 18:20:33
いま1.0落とせたんでワクワクしてall.sh走らせてみたんだが dhry.dでいきなりコンパイルエラーがでる・・・これって既出? dhry.d(607): function std.c.string.strcpy (char*,char*) does not match parameter types (char[30],char[29]) dhry.d(607): Error: cannot implicitly convert expression (Reg_Define) of type char[30] to char*
>>200 D 0.177から暗黙的にchar[]からchar*に変換できなくなったんだけど、サンプルを修正しわすれたんだろうな。
Dユーザはもうその程度のことでは 動 じ な い
std.compiler.version_minorが古かったり
>>200 dhry.dの607行目の
strcpy(Reg_Define, "Register option not selected.");
を
strcpy(Reg_Define.ptr, "Register option not selected.");
に変更すればおk
うわい、書き込みで人大杉とか言われて困ってるうちに祭りに乗り遅れた。
おまいらはっぴーにゅーD言語。
これ以降仕様変更はおとなしくなるんだろうか。
>>88 の配列の仕様とかは根本から修正して欲しい気も。
207 :
200 :2007/01/03(水) 19:52:21
>>201 >>205 サンクスコ.お陰様で試せましたよ
これは確かにコンパイルも実行速度も速くて,ヨサゲですな〜
LL感覚で使える.
ライブラリ次第だろうけど
matlabオンリーの業務シミュレーション業界に風穴を開けれるかも.
>>199 ありがとう
本家落とせなかったから助かりました
あとmd5sumは合ってるけどなぜに167?
アップローダーが勝手に付ける番号
211 :
デフォルトの名無しさん :2007/01/03(水) 20:47:06
'A'?
212 :
デフォルトの名無しさん :2007/01/03(水) 21:56:29
>>150 116っす。
旨くいきました(all.dはpublic importにしたけど)。
ありがとうございます。
次期Dではこの辺、何とかしてもらいたい.
213 :
デフォルトの名無しさん :2007/01/03(水) 22:17:47
Visual Studio にD言語ってありますか
Walter Bright先生の次回作に御期待ください
216 :
150 :2007/01/04(木) 03:30:46
>>212 解決できてよかったです。
publicつけないと駄目でしたね。すんません。
static thisの順番の解決をどうするといいの?という問題があるんですよねぇ。
static thisで他のモジュールに関係しているかどうかの検査ができれば
いいのだろうけど。それって案外、難しいわけで。
すみません。インストールの仕方について教えてください。 以前のバージョンでD言語入門の本か何かで /dmd 以下に /dm 内の /bin や /lib を移動してしまう (つまり mv /dm/* /dmd/) みたいな方法があったのですが、今も変わってないですか?
219 :
デフォルトの名無しさん :2007/01/04(木) 13:58:56
>>207 コンパイルは早いけど正規表現が遅いからLLの代替にはならない気がする。
>>218 dmcに入ってるdmフォルダをdmdに入ってるdmフォルダに上書き
そいやしばらく前のバージョンから、 dmd/binの中に"dmd"て名前のELFバイナリが入ってて cygwinからdmdと打ち込むと”実行できないバイナリ”とか言われてメドイ。 ウチだけ?
cygwinは知らんけど、exeを特別扱いしてくれないから"dmd"を実行しようとしてくれちゃうって話かな? 多分"dmd"を削除すればいいんだろうけどバージョン上げる度に消すのはたしかにメドイ。
解凍したディレクトリにはパスを通さず、パスが通っているところにdmd.exeのシンボリックリンク作成とかでどうだろう?
chmod 000 dmd
DLF TreeNodeもMenuも日本語化ける〜 Tabは、直ってるのに
230 :
デフォルトの名無しさん :2007/01/04(木) 20:31:48
>>219 よくわからんけど、正規表現の実装自体が悪いんじゃなくて
正規表現オブジェクトを毎回生成してたりするんじゃないの?
231 :
デフォルトの名無しさん :2007/01/04(木) 20:39:19
Dを非x86のLinuxで動かす方法ってないの?
>>227 DFLは使っているWinAPIがワイドキャラ系とアスキー系まじりまくり
>>229 ν速のDスレは結構伸びてた
以外にν速民ってD知ってたんだな
このスレを見ている人はこんなスレも見ています。(ver 0.20) w3m その7 [UNIX] 山本直樹 レッド Red 1969〜1972 [漫画] 【300P】ドリームブッククラブ!【出版化】 [創作文芸] 【Ogg Vorbis】iPodにROCKbox【ギャップレス】 [ポータブルAV] 過去ログ [Web制作]
>>230 ファイル読み込みループの外で正規表現クラスを生成したり
GCを切ったりしてみたけど、やっぱ、Perlよりも遅い・・・
BufferdFileをreadLineしてるのがいかんのかなぁ?
auto file = new BufferdFile("sample.txt");
while(!file.eof){
char[] line = file.readLine();
以下、行単位の正規表現
行単位でなくサイズ単位で処理した方が良いんだろうね、きっと。
やたらと長い文字列を正規表現に渡すとかなり遅いから困る。
>>233 見てみた、ほとんどA系しかないな
これは、使えないなぁ
239 :
sage :2007/01/05(金) 11:59:28
とりあえずtoUnicode/toAnsi使うだけじゃだめ? そんなのなかったっけ
>>229 GCについて触れて欲しい所だなぁと思ったり。
そいやみんな、どんな機能に惹かれてDに手を出してる?
GC + 強い型付け + ネイティブコード生成の共存が俺のツボ。
>>239 こんな感じでいけるけど
std.string.toString(std.windows.charset.toMBSz("ほげ"));
面倒
>>240 最初C++出来なかったからDに手を出した。
コンパイルが速い。
dsource.orgは、 4invalid UTF-8 sequence ばっかりじゃー 折角のUTF-8なのに
結局GUIライブラリはどれがいいのよ?
>>240 似たような理由。
研究職でプログラムが必須技能だが、専業プログラマがいない。
ネイティブコード生成が必要な場合、C/C++だと初心者が配列で詰まりコードの保守性が悪かったのだが、
Dを試験的に使ってみると結構保守性が高いことがわかった。
あとは機材で検証して確実性が保障できれば万々歳。
正直、いけてるGUIライブラリはまだないと思う。 DWTが一番標準に近い扱いをされているだけで、 Dをフルに使い切るようなものではないよね。 オレのつぼはC++を置き換えられてさらに上回れるところ。 強力なコンパイルタイムプログラミングと高速なコンパイルは STL/Boost以降のプログラミングスタイルには必須だと思うから。
DFLとDWTしか触ってないんだが他によさげなのってある?
wxDとか
初めて真剣に仕様見た。けっこう面白そうだなぁ。 C++で書いた俺Lispでも移植してみようかなw
DからPostgresを使おうと思うんだが、ライブラリはどれがいいか教えてくれないか? というか、2004年くらいから更新されてなかったりして、使うのが怖いんだが。。。
>>241 バージョンアップごとにW系が増えてきてるから
バージョンアップ→4invalid UTF-8 sequence→修正みたいなことになった
全部Wになってくれるとよくなると思う
>>250 大体はいけてるけどStyledTextがダメだったと思う
DWTはJavaのStringをDのchar[]に置換しているから
lenghプロパティで文字を数えている部分で日本語がずれる
>>252 古いとコンパイルできなかったりするからな
面倒でなければlibpqを直接使うか自分でDクラス作ったほうがいいんじゃない
そしてそれをD言語版のCPANに(ry
>> 254 ありがと。やっぱ作るしかないか。。。 libpqを使うってことはC関数を持ってくるってことだよなあ。 その辺まだ使ったことないんで調べてみる。
改めて言語仕様(日本語訳)を眺めていたが、 "Great, just what I need.. another D in programming." -- Segfault anotherでないDって何?既出なのかしら FAQ日本語訳でTypo Q. DのIDEはどこで入手できますか? A. Try Elephant, Poseidon, LEDS などがあります。 Tryを消し忘れとる。些細なことで申し訳ない。 日本語コミュニティがこれだけ充実してる理由ってなぜなんしょ。
と見せかけて実はk.inaba
やねうは癌
やねうは癌
262 :
257 :2007/01/05(金) 21:20:41
>>258-260 俺もDmemoのほうが先だったけど、どうもやねう辺りから急激に増えた気がする。
だからゲーム用ライブラリがやたら充実してるわけで。
やねうが癌だってのは同意
>>255 基本的にDはCの関数を直接扱える
言語仕様のCとのインターフェイスってところ参照
>>257 俺もやねうのglExcessでDの存在を知った
感謝しているのはk.inabaの人
>>263 なる。Segfault本人に聞かないとまだわからん、みたいなところはあるけど。
駄洒落やらレトリックの類の訳出は相当悩むらしいので致し方ないところか。
Matrixなどテンプレートで書くべきクラスで、テンプレートを知らない初心者に使わせる場合に
シンタックスシュガーが欲しいときがあるのだが、擬似的に解決するトリックがあればなあと思う日々。
class Matrix(T = real) {}
// 基底クラス的用法、Matrix!()でもMatrix!(creal)でも通したい
void write(Matrix m) {}
// MatrixでMatrix!()とみなしたい
class Hoge {
Matrix m;
}
名前を変えてもいいのなら、aliasしておくとか。
1.0が出たのを知って、試してみようとしているんだが、 Win32APIのA系とW系の扱いってDだとどうなってるの?
void write(Matrix m) {} は Matrixのstaticメソッドにするか それ自体を関数テンプレートにするべきじゃないかなあ とりあえず Matrixが増えるんだからwriteも増えないとね
STL/Boostに辟易してるのでDに乗り換えようかとマジで思ってる
271 :
デフォルトの名無しさん :2007/01/06(土) 07:17:30
>>266 template IsMatrix(T)
{
static if( is(T U : Matrix!(U)) )
const bool IsMatrix = true;
else
const bool IsMatrix = false;
}
void write(T)(T m) {
static assert( IsMatrix!(T) )
...
}
>>268 標準のstd.c.windows.windowsはAPIにWとかAとかつけないと呼び出せない。
dsource.org(
>>1 )のBindingsに入ってるやつが前スレ辺りで推奨されてた。
そっちはAPI名でエイリアスされててコンパイルスイッチで切り替えられたと思う。
A系に文字列を渡す時はstd.windows.charsetのtoMBSz使う。
W系にはwcharをそのまま渡して大丈夫。
>>269 >271
誤解させて申し訳ない
↓みたくテンプレートクラスを引数とする関数はテンプレート関数にするってのはC++時代からの定石だということは承知しているんですが
class Matrix(T) {}
void write(T)(Matrix!(T) m) {}
なんとか初心者がテンプレートを知らずに書けるシンタックスシュガーができんものかと思いまして。
冷静に考えたら、MatrixのpublicメンバにTを引数ないし返値の型とするメソッドがあると、
基底クラス的な存在は作れませんですね。失礼しました。
テンプレートも知らない初心者がDを使うこと を想定することに尊敬します。
LabViewとかMatlabしか使ったことのない人にC++使わせてますorz しかもリモートで。サポートを要求する電話がかかってくるし……
クラスのサイズって得られなかったっけ? 構造体のsizeof的なことをしたいです。 クラスのsizeofは4だったでしょ ていうかそれが4である必要とかあるのかな
そして、クラスのサイズが得る、ありますか? 構造のsizeofのことをしたいと思います。 そしてクラスのSizeofが4歳である。 必要があります…、4、それ?
classinfoになかったっけ
classinfo.init.lengthで取得できる。 ……ってことでいいのか? 知らなかった。
>>278-279 うおお
そうか 基本仕様を調べたい時は object も見た方が良いのか・・・。
サンクス
C/C++の返値からエラー調べるのは正直ウザい
個人的に、C/C++はプリプロセッサが面倒なんだよなぁ。 GCとか例外とかコンパイル速度とかも含めて、総合的にDは楽だと思う。 どの言語が最強かとかは知らん。Dが大好きだ。
連想配列リテラルが欲しいなぁ。 struct/union の初期化のアレと同じで良いんじゃないかな。 あ でもそうすると型推論できなくなっちゃうか。
そーいえば無いな連想配列リテラル。うんそのうちきっと欲しくなる。 ところで、こんな記述が通るのは仕様って事でいいんだろうか。 class A{ static char[] typeID(); } class B : A{ static char[] typeID(){ return "b"; } } BのtypeIDが無いとコンパイルエラーになるかと思ったら、 コンパイラは素通りしてリンカでエラーになるってのが微妙に不安。 static abstract的な事が出来るので、ちゃんとした仕様だととても嬉しいのだけど。 というか本当はAのtypeIDにabstract付けたい。
286 :
デフォルトの名無しさん :2007/01/07(日) 05:48:57
wxとかswtとかいいから、Qt移植しろ
>>286 > Qt移植しろ
あー、Qt欲しいねぇ。
D.NET とか無理なの?
コンパイル時にインポートするモジュール全部書くの面倒なんだけどなんとかならない?
全部インポートすれば? それか「全部インポートするモジュール」をインポートすれば?
コマンドプロンプトでdmdするときの話じゃないのか?
いまひとつインパクトに欠けるんだよな。 ぷらぷらから乗り換えるとして具体的にどういうメリットがあるんかな。
C++ がブレイクした大きな理由のひとつは C のソースコードがほぼそのまんまで コンパイルが通るから C++ の機能の一部をツマミ食いしてベターCとして使えたことだけど、 D って確か、C++ のソースコードはコンパイル通してくれないんだよねぇ? C のソースコードでもダメなんだっけ? とにかくそんなんじゃちょっとやそっとのメリットがあってもブレイクするのは厳しい。
その理屈だとC/C++互換の言語以外は流行らないということになるが
>>298 まったく異なる言語ならともかく、C++のソックリさんで
メリットどころか用途的にはC++より狭い範囲でしか使えない。
その点、C++ の劣化コピーとはいえ、Java は環境を問わずに
使えるという大きなメリットを持っていた。
戦術・戦略で例えると D は戦術に長けているけど戦略的にはダメダメで、
Java は戦術的には超ヘタレだけど、戦略的に勝利を納めたとでもいったところ。
dmd DaMeDa
>>299 なに言ってんだ? Java のバージョン1.0がリリースされた時には既にブレイクしていたぞ。
よく読むとどちらも矛盾してない 最初のブレイク、爆発力がそこそこ普及するために必要なのかどうかだな 開発が長かったからじわじわとしか普及せんのだろう
なんで 1 でも 1.0 でもなくて 1.00 なんだ
それだったら1.000にしとくほうがよかった それとも今度こそ+0.99までには2.0に行くつもりかもしれんがw 前例があるからな
まるでネトゲの経験値収入みたいなカウントだなあ 一匹0.005%とか
ソートしたときにversionで並ばないのが嫌だったのかね。 とにかく、なんか気持ち悪いな
みんないきてるかーい?
_ ∩ ( ゚∀゚)彡 IDE!IDE! ⊂彡
D.NET VS2005EEで使えるIDE
井出さん?
HDDの接続規格?
コンパイラが出力するバージョン番号はv1.0なのね。 メジャーとマイナーの番号が単純にインクリメントされるDのバージョン付けは シンプルなので嫌いじゃないな。 ところで、可変個引数テンプレートを特殊化することって出来ない? template Hoge(T... : Object){ みたいに。
static if を使う template hoge(T...){ static if (is(T == HogeTypeTuple)){ const hoge = 1; } else { const hoge = 0; } }
これを void func( T... )( out T p ) { foreach (i, v; p) { p[i] = 3; } } こう書きたいとは void func( T... )( out T p ) { foreach (inout v; p) { v = 3; } } 思いませんか?
ちなみに引数はintやreal限定だとでも思ってください。 タプルを書きかえる時にforeachでiが要るのにvまで出てくるのがもったいないと思っただけです。
1.0に対応した、iconvやjcode無いの?
perlの変換系を真似るなら Jcode.pmじゃなくてEncode.pmを手本にしてほしかったな。。。 Jcode.pmをベースにすると AppleがShiftJISを独自に拡張したMacJapaneseとか IBM/MSがShiftJISを独自に拡張したcp932とかを Dで処理できるようにしたいときに結局自分で全部作んなきゃいけなくなる。 Encode.pmだったら用意されている以外のコードでも、 マッピング表を組み込んで拡張する仕組みがあらかじめ用意されてて 便利だし、日本語以外のマルチバイト扱う場合もEncode.pmでいいのに。 Jcodeって名前じゃ日本語以外は取り扱いませんってことじゃん・・・。
>>321 あたまにDをつける意味あるの?
Encode.dでいいんでないの?
323 :
デフォルトの名無しさん :2007/01/10(水) 14:12:40
324 :
デフォルトの名無しさん :2007/01/10(水) 14:42:38
>217 VSpluginD落してみたけどinnstallできない. Visual Studio 2005 Standard Edition or above Edition. とか言われる. versionはEEからTeam Suiteにupgradeしたはずのもの. ところで補完が効くんだよね?
326 :
324 :2007/01/10(水) 16:16:08
>325 作者さん?!感激しまスタ.ありがたく使わせていただきます
gdcでは未だ試してないけど、とりあえずwinで通った。 けど、 char [] sjis = JcodeConvert("サンプル"c, "utf8", "sjis"); writefln(sjis); なんてのを、やったら 4invalid UTF-8 sequenceと怒られる。(´・ω・`) しょうがないんで、ファイル出力して確認。
writef/ln に sjis はダメなんぢゃ?
これが通るのにやや感動した class Hoge { Hoge foo(Hoge d = null){ return this; } } scope foo = new Hoge; foo.foo.foo;
>>330-331 うん、writefなんかはUTF-8のチェックをしているから
バイナリ出力ができる関数じゃないとsjisは出力できない。
import std.cstream;
char [] sjis = JcodeConvert("サンプル\n", "utf8", "sjis");
dout.writeBlock(sjis, sjis.length);
とか。
335 :
330 :2007/01/11(木) 14:51:52
>>333 暗黙のルールで、わざわざ見てるのか。
ついでに、gdmd/gdcで、テスト→通った。
LANG=ja_JP.eucJP
--
dout.writeLine(utf8_euc("漢字テスト"));
質問です。混乱してます。 文字列は、char[] str1;で 文字列の配列は、 char[] str2[]; もしくは、char[] [] str2; このときの、char [(a)] [(b)]は、 char[(a)] str2[(b)]; で、いいわけですか? それとも char [(a)] [(b)]は、 char[(b)] str2[(a)]; ですか?
>>336 便宜上括弧を付けると
(char[])[] strarr
(char[]) strarr[]
のような感じなはず。
338 :
デフォルトの名無しさん :2007/01/11(木) 15:27:53
char[] str[]; なんて書き方は解りづらく得はないので止めましょう。 "char[][]"で一つの型と考えるべし。 こんなのの存在意義はC/C++とのソースコード互換性だけです。 とか言ってみる。
>>337-338 ありがとうございます。
#でも、まだ混乱中
数値型の、動的二次元配列は、int[][] i;
そうすると
文字列の動的二次元配列は、char[][][] str;
こうですか?
341 :
336 :2007/01/11(木) 16:00:21
そこで、改めて質問です。 char[][][] str; str[0] ~= "xxx";とするとArrayBoundsError str[0][0] = "xxx";としてもArrayBoundsError char[][][int] str; str[0] ~= "xxx";エラーにならない str[0][0] = "xxx";ArrayBoundsError そもそも、char[][][int] str;こういう宣言の仕方はありなんですか? で、str[0][0] = "xxx";でエラーにしないためにはどうしたらいいのでしょうか?
>>341 >ありなんですか?
あり
>どうしたら(ry
char[][int][int]
配列の初期の長さは0だろ。
344 :
336 :2007/01/11(木) 16:14:17
>>342 感動
char[][] str;は
char[][int] str;とも書けると
なるほど、混乱から醒めました
ありがとうございました
ちょっと待った!! それは意味が違ってるぞ。。
>>344 おいおい
動的配列と連想配列が分からんてスクリプト系から流れてきたんか?
char[][][] table; char[][] list0; list0 ~= "foo"; list0 ~= "bar"; table ~= list0; char[][] list1; list1 ~= "baz"; list1 ~= "hoge"; table ~= list1 小さい次元の配列を作っては大きい次元の配列に統合していく感じで。 配列の構造が最初から分かってるならこれでも。 char[][][] table = [ ["foo", "bar"], ["baz", "hoge"] ];
348 :
336 :2007/01/11(木) 16:27:37
>>346 連想配列は、int[char[]] iやつじゃなくて?
この場合、int型の動的配列で、キーが文字列の連想配列なんでしょ?
char[] strは、文字の動的配列、キーが整数
char[][] strは、文字列の動的配列で、キーが整数
間違ってる?
349 :
336 :2007/01/11(木) 16:36:56
>>347 ありがとうございます。
そうでした
>> char[][][] table = [ ["foo", "bar"], ["baz", "hoge"]];
の方法は、頭から抜けてました。
ただ、
>>小さい次元の配列を作っては大きい次元の配列に統合していく感じで。
これの方法が、なんか馴染めないというか
別な変数名を用意するのが面倒で
連想配列は "キー"(文字列型だけでなく、整数型だろうがオブジェクト型だろうが)に関連付けられた要素を検索して返す。 動的配列は 配列の先頭からの"インデックス"の位置の要素を返す。 これじゃ解りにくいかな……。
351 :
デフォルトの名無しさん :2007/01/11(木) 17:04:52
str[0][0] = "xxx";ArrayBoundsError これをエラー出さないようにするには ってんだろ? 素直に書いてみた。 あとC/C++やったこと無さそうなので(適当)そういう入門とか読めばほぼDの入門にもなりそうだよ。 char[] [][] str; // 全くの空なので str.length = 1; // メモリ確保 str[0].length = 1; // メモリ確保 str[0][0] = "string"; // 代入 printf("%.*s", str[0][0]); // 表示
352 :
336 :2007/01/11(木) 17:12:52
int[][] n; i[0][0] = 0;NG int[int][int] i; i[0][0] = 0;OK int[int][int] n; i[1][2] = 0;OK なんで、int[int][int]だとOKなのかが、よくわかりません キーを指定(連想配列)にすると メモリ確保しなくていいということですか?
353 :
336 :2007/01/11(木) 17:19:45
言い方が、間違ってました。 動的なんだから int[] i; i[5] = 0; とか、出来てもいいんじゃないの?って思ってるだけです。
>>353 リリース時も毎回長さチェックしてたら効率が悪い。
>>354 >>336 じゃないけど、そいやそういう単純な問題になるのか……。
あれ? てことは-releaseとかつけてコンパイルすると、
領域外にアクセスしてもArrayBoundsError出なかったっけ?
357 :
デフォルトの名無しさん :2007/01/11(木) 18:32:09
小一時間苦しんだ writef("%d %d". length, lines.length); // 0, 100 line[length] = "hoge"; // ArrayBoundsError
>>357 配列の添字は0から…って当り前の事のような。
360 :
デフォルトの名無しさん :2007/01/11(木) 18:40:33
writef("%d %d", len, lines.length); // 0, 100 line[len] = "hoge"; // ArrayBoundsError だったらうまくいったと言いたかった.
流れ豚切って悪いがPoseidonの使い勝手ってどうなの?
http://www.kmonos.net/alang/d/arrays.html > 静的/動的を問わず、配列の [ ] の中では、 lengthという名前の変数が暗黙に宣言され、
> その配列の長さがセットされます。 $ という記号を使うこともできます。
これだよな。
Dでは外側のローカル変数の名前を隠すようなローカル変数の宣言は禁止されてるおかげで
こういう目にあいにくいから、これはうっかり忘れがちな罠だね。ややややこしい。
363 :
デフォルトの名無しさん :2007/01/11(木) 19:44:47
>>360 それ俺も昔ひかかった
添え字の中にlengthって変数があると配列のlengthプロパティが優先される
>>361 悪くない。
暫く更新してないと思ってたんだが、探してみるとposeidon-v0.22-bin.rarってのがあるのな。
>>364 悪くないんだ
サンクス。落としてみるわ
……と、思ってたんだが久々に使ってみたけど、あれ、utf-8使えないんだっけ? 日本語含むコード保存したらShiftJISになってるっぽいんだが。
>>366 別のソフトでそのファイルをUTF-8として保存してから開き直せばok。
std.randomのアルゴリズムってなんだろ。 boost::randomの使い勝手がいいので移植してみるか。
インスコしたはいいが使い方がいまいちワカンネ 独学の旅に出てくるわ。ノシ
>372 ソース見た。線形シフトレジスタみたいな感じ。 しかしたしかに擬似乱数をスレッド安全にするのはなかなか難しいな
とうとう1.0でたんですね。 ひさしぶりに来たものですから驚きました。 ずっとv0.1台だったので永遠にβ版だと確信してたのですが飛びましたね。 いい加減標準出力時の文字コードの問題は解決されたのですか?
全然
線形合同法とメルセンヌツイスターを 利用者として知っているだけのヘタレには初耳だ……。 線形シフトレジスタってどんなもんなんでしょーか。 速さとか乱数としての品質とか。
>>377 とりあえず計ってみるとだいぶ遅かった。
何と比べたんですか? MTですか?線形合同法ですか?
>>380 百万回繰り返してrdtscの値の平均取っただけだけども。
aba氏のところからとってきたMTのnextInt32が95前後で標準のrandが480前後だった。
自前で実装した線形合同法が40くらい(値が小さいからMTとの差は信用できるのか微妙な気がする)。
まあMTにしたって速いとされるアルゴリズムだし参考にはならないのかもしれんが。
結構質のいい乱数というやつを吐いてくれるのかねえ?>標準のrand
理論上の周期はアルゴリズムから求めるとして、 一様性は検定にかけるしかないかな? MTの論文持ってきて同様の検定法にかけるしかないかなあ。 それだとMT使ったほうが楽そうだが。
では MT を使うことにしましょう ハイ 次のひとどうぞ ↓
>>383 意味わからないなら無理に参加しなくてもいいのに
標準のrandが気に入らないからMTで実装してくれと言ってるってことは分かる
それはかなりのエスパー能力だな。 俺には誰一人そう言っているようには見えなかった。
24 名前:名無しさん必死だな[sage] 投稿日:2007/01/12(金) 14:10:14 ID:4nd8YOTF 2chは法人化してるからひろゆきの個人資産じゃない、 尚且つ海外サーバだから日本の法の影響は受けない。 記者がアホ過ぎて話にならんね。 よかったな おめーら
ほう。 スレ違いではあるが、ひろゆぎの個人資産ではないのか。 よかったな おれら
ドメインはひろゆきで登録されているな
ドメインを強制的に金に変えさせるんだけど、 2ch運営の誰かに売り払っちゃえばドメインの 所有者が変わるだけで2chはそのまま、 というオチだそうな。
絶対バーボンだと思ったww
いつのまにか1.0になったんですね。 おめでとうと言いたい
395 :
デフォルトの名無しさん :2007/01/13(土) 17:01:13
linux版のdmdだと実行ファイルが馬鹿でかいサイズになってたのは修正されましたか? alias 0.179 1.00 とか洒落になりませんか?
D言語の売りってなに?
作者乙
え?Dって日本人が作ったの?
何の作者だ
すべての言語は韓国が起源ニダ
20年以上も前の話だが、ウォルター・ブライトはデータライトC,ゾーテックC++等の処理系で絶賛された人 D言語という名前からゲテモノだと思っても、この名前を知ったら、おっ、と思う人は多いのではないか
(´-`).。oO(おっ)
(´-`).。oO(うっ)
405 :
デフォルトの名無しさん :2007/01/13(土) 18:52:58
まさに、コンパイラ製作の申し子だな
逆に Java の作者は、GPL が作成される元になった事件を起こした張本人。 お、お前か、と思う人は多いのではないか
(##) パカッ \ T /)) ( ´∀`) ( ) | || (___)__)
いまさらだが標準randをMTにはできんでしょ ひとつインスタンス作るのに数キロバイトいるんじゃなかったかな 線形合同法で下位ビットを使わないってのがやっぱシンプルかと。
409 :
デフォルトの名無しさん :2007/01/13(土) 22:27:08
>>397 おお!?リニューアルされてる?
休みのうちに読んでみっかー
MTでも線形合同法でもいいけど、 グローバルじゃなくてインスタンスごとに状態持った乱数生成器が欲しいなあ。
>>408 boostみたいにアルゴリズムを選択できるのが理想なのかね。
選ばなくても使えるように無難なのをデフォとして用意しとく必要もあるかもだが。
MTは内部ベクトルが623だか624個だから、32ビットなら最低で2500バイトくらい?
まあ少なくとも俺が使う環境で問題になることはなさそうな気がする。
コンパイラにDI用のリソースファイルをかませられると面白いかもね。 デフォルトは線形合同法などの汎用的なものを採用しておいて コンパイル時に採用するライブラリを指定する。プリプロセッサよりはマシ程度?
boost::randomいいねー 移植されないかなあ
このスレはクレクレ厨に占領されますた
さっきVIPでプログラミングのプの字も知らない奴にDのソースを渡してコンパイル汁つったけど大丈夫かな・・・
DはVIP発祥だから無問題
というか何でrandomのジェネレータをアダプティブにしなかったんだろう? 標準的なシードの与え方と次の値のインターフェースだけ持っているようなクラスがあれば 何でも後付けできたような気もするんだけど(これはDに限らないんだけどさ)
そういうのは作者に言ってくれ
直しとく
walterはここ読んでるしね
誰が翻訳するんだ
日本語はメジャー言語だよ?
>>424 D言語と比べりゃメジャーだけど、それでもマイナーじゃね?
426 :
デフォルトの名無しさん :2007/01/14(日) 20:07:36
>>425 使用人口が1億を超える日本語、それ以上にメジャーな言語って数えるほどしかなくね?
全部地球語だろ
ベンガル語とかいうのに負けてることにショック。
>>429 インド人に勝てるかよw
日本語は国内ではくまなく通じ、国外ではほとんど通じないというあたり特徴のある言語。
ところでCってエスペラントより使用人口多いよな。
>>430 >インド人に勝てるかよw
タミールには勝ってるぞ。
>日本語は国内ではくまなく通じ、国外ではほとんど通じないというあたり特徴のある言語。
でも、ヲタ文化の影響で海外での日本語学習者が着々と増えてるらしいけどな。
うちの研究室の留学生みんなオタばっかw 暴力的なの好きな奴(男も女も)が結構多い もちろんそうでないのもいるけど
ガイジンがそんなに多い日本の研究室なんて珍しいな。
ウチの研究室なんて害人だらけだぜ?
walterはここを読んでないという結論で、再開。
終了
今日から俺もDを勉強してみよう
ぜーんぜん完成まで期待してないんだけど 今回の閉鎖騒動が原動力になってUNIX板でやってる 2ch代替システムのコアにDが採用されたら 話のネタとして楽しいなのになー とか妄想してみるテスト
440 :
437 :2007/01/15(月) 01:54:16
VS2005のデバッガでブレークポイントかけられなくて不貞寝orz -g -debugオプションで何かすることあるのかな…
てゆうか日本語より使用人口おおいプログラム言語はないだろ。
HTMLあたりはどうなんだろか
プログラミング言語か。バカかオレ。
>>438 行ってみたが、どうせ閉鎖しないだろという前提でP2P化妄想が進んでるのか
プロトコルが確定したら互換クライアントはDでもVB.NETでもMozilla XULでも書けるだろうといってみるテスト
445 :
437 :2007/01/15(月) 09:47:53
VSPluginDの人のページ見たら VS2005で上手くデバッグできないみたいなこと書いてあったんだけど やっぱその通りなのか… そこの人はどうやってデバッグしてるんだろ
Dの練習がてらDinnyでも創ってみようかな
逮捕します
poeny じゃだめなのか?
450 :
デフォルトの名無しさん :2007/01/15(月) 11:55:39
逮捕時にD言語のパッケージが押収される写真がww
>>449 そういや、それがあった
std.string.toStringが object.toStringと勘違いされて(´・ω・`)ショボーン
先頭に.付けなきゃダメなのは地味にメンドイしキタナイ
453 :
ロコン :2007/01/15(月) 14:39:04
2CHのリンク先に飛ぶときの広告ページって、JAVAでやってるんでしょうか?
画像処理みたいなものを簡単にスレッド化できない? といわれて、テンプレートとかMixinで簡単にできるようにしたいなあと思ったが、 mutableがないことに気づいた俺がいる 1.0になって本格的に使い始めたから気づかんかった。
>445 VS2005の場合、asm{int 3;}を使えば一応ブレークポイントの代わりになる。 ソースレベルデバッグしたいなら、他にdmd/binにあるwindbgを使う手もある。
import std.boxer; void main() { printf("%d", unbox!(int)( box(10) )); } リンク時に Error 42: Symbol Undefined _D3std5boxer8__assertFiZv わたくし、間違った事してますか?
//Test.d module Test; private import std.stdio; class Test{ public static void disp(){ writefln("Test"); } } //Main.d import Test; import std.stdio; int main(char args[][]){ Test test = new Test(); test.disp(); // OK Test.disp(); // ←コンパイルとおらない return 0; } どおなってんの?
モジュール名で優先的に検索してるから、 モジュール<Test>の中にdispと言う関数が無い、と言われてる。 っていうか、コンパイラのメッセージ見ろよ。
そういう意味だったのか、ありがとう
>>456 boxerは普段使わんから良くわからんけど、
"-release"オプション付けると普通に通る。
boxer.d自体にバグが有りそうな予感。
DirextX / OpenGLを抽象化できるライブラリを考えていて、 ポリゴンオブジェクトを抽象化するクラスを作ろうとしています。 class Polygon { translate(real x, real y, real z) { // DirectX, OpenGL Code } } DirectXとOpenGLで別の実装が必要だが、 インターフェースは共通であることを保障したい。 versionごとにテンプレートを使うか、関数だけmixinするか、派生クラスにするか、 など考えているのですが、 同一バイナリでDirextX版とOpenGL版のどちらのライブラリにもリンクしたい…… といろいろ考えています。 この手の実装で常套手段あるんでしょうか。
前スレ930-939のTcpSocket削除されたって件だけど、1.00には入っているんだね。 以前書いたソースを書き直そうとしたら、在ったので驚いたよ。
class A { int val = 1; } typedef A B; void main () { auto b = new B; printf("%d\n", b.val); } ------- これで Error: this for val needs to be type A not type B って言われるんですけど、こういうもんなの? alias だと、まあ通るんだけど。
そうなんだ、バグなのね・・・ 1.0 が出たーと思って本格的に触り始めたのにorz
1.0は、あくまで仕様が、ということで、バグが無いということではないとおもうに。
>>466 dmdとDの両方が1.0なのだが。1.0リリース前はバグ修正優先だったし。
>>466 あーなるほど。言語仕様が 1.0 って事ですか。
でも "DMD 1.0" ってあるからこれは勘違いしてしまうよなぁ
class A{ static{ const int AAAA; this(){ AAAA = 35; } } } これがstatic this()にならないのはバグ?
ちなみに、私のバグ報告は11ヶ月後に直った。
>>470 constは記憶クラスなのでちがうとおもうけど?
既出って報告されてるってこと?
476 :
デフォルトの名無しさん :2007/01/16(火) 22:45:55
公式がやたら重い気がする 皆注目してんだな
>>476 仕様書に書いてあるとおりなので、仕様ですよ。
仕様そのものが間違ってるとか、不親切だというのは別として。
>>476 > エラーも警告もでなければバグだろ。
その場合、エラーも警告もでないのがバグなんじゃない?
意味のないstatic属性は無視されるのが仕様。
当方C/C++はかなり使い込んでいます これからDを使ってみようと思うのですが 生成されたexeの実行速度は問題ないですか? 最適化とかはコンパイラに期待してもいいのですか?
参考になりました 色々ありがとうございます 質問ばかりで申し訳ありませんが Windowsアプリ用のフレームワークとかで お勧めのものはありますか?
inabaたん大人気だな
100人乗っても大丈夫だから
何人乗ってるかカウントすべきだな。
そして実行速度の話に戻るんだな
>>486 /\___/ヽ ヽ
/ ::::::::::::::::\ つ
. | ,,-‐‐ ‐‐-、 .:::| わ
| 、_(o)_,: _(o)_, :::|ぁぁ
. | ::< .::|あぁ
\ /( [三] )ヽ ::/ああ
/`ー‐--‐‐―´\ぁあ
GJ!!!
非常にGJ
配列を逆向きにスライスとかできないかな… 例えば構文をarry![〜]とすると、 int[] a = [11, 22, 33, 44, 55]; int[] x; x = a![].dup; // x == [55, 44, 33, 22, 11] x[1] = a![0]; // x[1] == 55 (末尾要素) x ~= a![1..2] // x == [55, 44, 33, 22, 11, 44, 33] 分かり辛くてすんません
あ、一番下2番目の結果反映してなかったorz
俺はそこまで面倒でもないが。 reverseとlength($)で十分対応できる。
498 :
k.i :2007/01/18(木) 02:52:02
>>491 超GJ!!!!
日本語訳のサイトに転載させてもらってよろしいでしょうか?
あと<pre>のスタイルがカコイイからパクらせてもらいたいので、
よろしければこれのフォント名教えていただけるとうれしい…
>>495 struct r_impl(T)
{T[] a;
T opIndex(ulong i) { return a[$-1-i]; }
void opIndexAssign(T t, ulong i) { a[$-1-i] = t; }
T[] opSlice(ulong i, ulong j) { return a[$-j..$-i].dup.reverse; }
void opSliceAssign(T[] t, ulong i, ulong j) { a[$-j..$-i] = t.dup.reverse; }
T[] dup() { return a.dup.reverse; }
}
r_impl!(T) r(T)( T[] a ) { r_impl!(T) t; t.a=a; return t; }
x = r(a).dup;
x[1] = r(a)[0];
x ~= r(a)[1..2];
いまいち
逆スライスあると便利そうだな。 応用してforeach_reverseをforeachに統一できるんじゃないだろうか。
>>498 >>491 ではないのですが。
ヘルプコンパイラhh.exeがあれば、
hh -decompile 出力先ディレクトリ chmファイル名
でhtmlソースへデコンパイルできます。
リファレンスなんてfirefoxのScrapBookで十分だ、textにしてgrepだ そう考えていた時期が私にもありました
正直普通のchmレベルだと別に大して便利だとは思わない 素のhtmlでいい MSDNのようなキーワード検索機能までついてると、大違いだがな
何言ってんだ
MSDNのキーワード検索の当てにならなさ具合はひどい
chmって検索できなかったっけ?
できる
htmlは鯖に置いといてあちこちから使うときに便利だな
みんな俺に黙ってver1.0を堪能してたんだね…ずるいよ…
chmなんて読めない俺が登場。htmlの方が便利だよな
htmlは専用アプリを起動せずに普段のブラウザで表示できて、 ブラウザの機能を使えるのが便利。 chmはページをあっち見てはコードにもどりこっち見てはコードに戻り、 な場合に楽なときがある。あと検索だな。 ローカルにMSDNみたいなUIのサイトを構築して自動的に更新されるようにすれば、 両者の利点を併せ持つリファレンスになる。
interface Hoge { static int foo; // OK static void bar(); // コンパイルは通るが実体はないので呼び出すと実行時エラー static void huga() {} // コンパイルエラー } staticメンバはinterfaceであっても実体があるべきだと思うのだが
abstract class と interface の違いってなに?
雛形と仕様書の違い。interface -> abstract class -> class と繋ぐとJavaっぽくなる。
>>514 多重継承出来るか出来ないかとか既存の型を継承できるとか。
>>514 abstractなクラスは、実装を持つことができる。
518 :
491 :2007/01/18(木) 21:08:01
>>512 > htmlは専用アプリを起動せずに普段のブラウザで表示できて、ブラウザの機能を使えるのが便利。
chmページ上で右クリ→プロパティに表示されるURLは、普段のブラウザ(IE系)でも有効だよ。
大量にあるhtmlはchmに圧縮して、その中のURLをブックマークして利用すると便利〜。
普通にPRE内のフォントはmonospaceがいいとおもう・・・おっとスレ違い
521 :
デフォルトの名無しさん :2007/01/19(金) 00:43:51
522 :
k.i :2007/01/19(金) 02:33:39
Javaのinstanceofみたいなのってどうやるの? 過去ログにtypeid(typeof(o)) is typeid(Hoge)ってあったけど上手く行きません。 class Hoge{ public int opEquals(Object o){ writefln(typeid(typeof(o))); return 0; } } object.Objectって表示される。
UTF-8なら通るが class 基底クラス {} class 派生クラス : 基底クラス {} auto 基底インスタンス = new 基底クラス; auto 派生インスタンス = new 派生クラス; // put classinfo writefln(基底インスタンス.classinfo.name); // => "modulename.基底クラス" writefln(派生インスタンス.classinfo.name); // => "modulename.派生クラス" // check Type of instance writefln(toString(基底インスタンス.classinfo == 基底クラス.classinfo)); // =>1 writefln(toString(基底インスタンス.classinfo == 派生クラス.classinfo)); // =>0 writefln(toString(派生インスタンス.classinfo == 基底クラス.classinfo)); // =>0 writefln(toString(派生インスタンス.classinfo == 派生クラス.classinfo)); // =>1 // compare Type between instances writefln(toString(基底インスタンス.classinfo == 派生インスタンス.classinfo)); // =>0
少なくとも1.0ではtypeofは静的に決まる式の型に基づいて型を指定する方法の模様
526 :
デフォルトの名無しさん :2007/01/19(金) 12:26:32
ひさしぶりにC++使ってみたら コンストラクタをthisって書いてそれがエラーだって気付く事に10分かかったorz
あほす
PHPからCに戻って変数名に$付けた漏れの立場は・・・
わろす
Rubyから戻ってきてフィールドに@から始まる名前をつけました
Rubyから戻るとセミコロンを忘れるので困る
関数定義の括弧を先に書いておくのも忘れやすいな
>>525 Dはどうみても静的型付けだろ。
動的だともうちょっと遅くなると思う。
最近は正しいレスにそれやるのが流行りなのかな。 根拠訊ねたらムキになって繰り返してきそう。
これはひどい 内容の誤りの話じゃなくて、頓珍漢なレスに対する 「そんな話してないよ」という突っ込みだと思うよ
そんな話してなかったから そんな話したのよねえ〜
初心者の俺がD言語研究みて Hello World 作ろうとしたらエラーでコンパイルできなかった。 今はWikiのような書き方は駄目になってたのね。 かなりハマってたわ・・・・
>>538 よう、過去の俺
ちなみに今はキーボード入力が分からない(scanfとか orz
D言語はIDEがめんどくさそうだな。 VSみたいにクラスビュー情報をパースするエンジンが高く売れるかも。
なあ、Socket関係なんだけど。 Linux(2.6x) or UNIX使ってるやつ、epoll/kqueue使って書き直す気のあるやついない? selectで実装されてるからやる気なくなったんだけど。
>>513 現状、派生クラスで実装を提供してやって
テンプレートと組み合わせたりすると、
コンパイル時ポリモーフィズムみたいのが出来てちょっと楽しい。
コンパイラの挙動がちょっと怪しいなぁとは思う。
そんな俺は
>>285 。
>>535 "typeofは静的型を扱うもの。(∴インスタンスの動的型判定には使えない)"
ていう発言に対して「Dはどうみても静的型付けだろ」って、
どう話が繋がってるつもりなのかむしろこっちが訊ねたいのだが…
それはともかく継承とかまで考えてJavaのinstanceof相当のことをやるなら、
bool instanceof(T)( Object o ) {
for(ClassInfo ci=o.classinfo; ci; ci=ci.base)
static if( is(T == class) )
if( ci is T.classinfo )
return true;
else static if( is(T == interface) )
foreach(ii; ci.interfaces)
if( ii.classinfo is T.classinfo )
return true;
return false;
}
writefln( instanceof!(Hoge)(o) );
こんなもんじゃないでしょうか。
>>540 それ以前にデバッガ使ってるのかと問い詰めたい。windbg使いにくいし…
pythonみたいなソースだね
むかーしでも同じこと言った記憶があるけどinstanceofは cast(Hoge)o; でいいじゃん。何が不満なの?
opCast はオーバーロードされ得るとか。 まあ、C++のoperator&級に気にしなくていいアレだとは思うが。。。
548 :
546 :2007/01/20(土) 01:39:30
あーそうか当時のときはopCastなかったからその問題考えてなかったわ。 対策するなら暗黙の変換を挟んで Object obj(Object o){return o;} cast(Hoge)obj(o); こうかな。 castと変換をひとつにまとめて Object instanceof(T)(Object o){return cast(T)o;} instanceof!(Object)(hoge); こうでもいいか。
後ろのほう少し間違えた。Object型返してたらTがinterfaceのときにうまく動かないな。 void* instanceof(T)(Object o){return cast(T)o;} instanceof!(Hoge)(hoge); こうだな。 あーでもこうすると oがObject型へ暗黙変換できる == 引数がinterfaceで使用不可かー。 opCastうぜー。
opCastがオーバーロードされた時の動作については opCastを実装するやつ(モジュール側とか)の責任でOKだろう。 素直にcastしとけばいいと思う。
551 :
デフォルトの名無しさん :2007/01/20(土) 02:32:08
>>544 VC6でデバックできるよ
テンプレートで変な行に飛んだり
クラスのメンバ変数が見えなかったりするけど。
Dで.so作りたい
作れると思うが・・・
COM呼び出しがまんどい
タダで?
>>455 ありがとう。アク禁食らって書けなかった…
結局、昔使ってたVS2003入れてステップ実行できるようになりました。
Dって何かしらエラーで落ちたとき エラーメッセージだとサッパリ原因が特定できないんですが どうやってハングした場所の特定してる? やっぱTRACE系統のコードを入れるしかない?
恥ずかしながらwritefln挿入しております……。 デバッグモードの時スタックトレース出してくれたらなぁ。
>>560 SymLoadModule: この操作を正しく終了しました。
ってズラーっと出るだけなんだけども俺だけ?使い方間違ってるのかな……。
入ってたlibを作業ディレクトリにコピーして、
void f() { throw new Exception("error!"); }
void main() { f(); }
を-gつけてコンパイルした。
どうも過去ログ読むに修正済みのエラーっぽいんだが。
C:\d\source.dで試してみたが同じ。
Dのガベコレって特定のスレッドでfullCollectしたら 全スレッドのオブジェクトが対象になるんでしょうか?
GaJ!!!
566 :
560 :2007/01/23(火) 21:52:20
>>566 さりげなく自分も最高と言う、お前がマジで最高
accept()したSocketの挙動がどーもおかしい気がする……。 ブラウザにただhogeと返したいだけなんだけど、なんか間違ってる? import std.stream, std.stdio, std.socket, std.socketstream; void main(){ scope Socket server = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.IP); server.bind(new InternetAddress(1969)); server.listen(10); Socket client = server.accept(); scope SocketStream browser = new SocketStream(client, FileMode.In | FileMode.Out); // クライアントのリクエストが終わるまで読み飛ばす for(char[] line = browser.readLine(); line != ""; line = browser.readLine()){ } // 固定の内容を返す browser.writeString("HTTP/1.0 200 OK\r\n"); browser.writeString("Content-Type: text/plain\r\n"); browser.writeString("Connection: close\r\n"); browser.writeString("\r\n"); browser.writeString("hoge\r\n"); browser.flush(); browser.close(); } 全然ブラウザにデータが送られない。 ただしreadLineしてる行を消してtelnetで繋いでみると、途端に送られてきたり。
結局Javaでいうinstanceofってどうするの?
>>570 cast(Hoge)objで同じことを表現できる。
理由はDのキャストがC++のポインタを対象にしたdynamic_cast相当だから。
>>569 browser.flush();
の代わりに
client.shutdown(SocketShutdown.BOTH);
What's New for D 1.001 Jan 23, 2007 New/Changed Features tail recursion works again New type aware GC Bugs Fixed Bugzilla 621: When inside a loop, if you call break inside a try block the finally block is never executed Bugzilla 804: missing linux functions Bugzilla 815: scope(exit) isn't executed when "continue" is used to continue a while-loop Bugzilla 817: const char[] = string_literal - string_literal gets included for every reference Bugzilla 819: mention response files in cmd line usage Bugzilla 820: gc should scan only pointer types for pointers Bugzilla 823: frontend: incorrect verror declaration in mars.h Bugzilla 824: "mov EAX, func;" and "lea EAX, func;" generate incorrect code Bugzilla 825: dmd segmentation fault with large char[] template value parameter Bugzilla 826: ICE: is-expression with invalid template instantiation
1_来ましたな
やっぱり2桁にするくらいならいっそ3桁にするべきだよな、うん。
きたきた あのさあ D2.000ってどんなものになるんだろう 今見えている予定のほかに考えられそうなのはLINQくらいかなあ
なんでこんなにバージョンナンバーのつけ方がヘタクソなんだろうか。 もういっそのことUbuntuみたいに年月でバージョンつけてしまったほうがいいような気がする。
> New type aware GC さりげなくこれは素晴らしすぎるのではないかという予感が
あいかわらず何なのかさっばりわからない罠
やっぱ文字列扱うなら配列よりポインタだな。
これは1.1000まで出るフラグ立ったな
C:\>dmd Digital Mars D Compiler v1.001 ... バージョンナンバーになんかワロタ この抜けてる感じが好きだ
千里の道も一歩からって感じだな。
586 :
569 :2007/01/24(水) 23:45:52
さすがに仕様変更は無いようだな……。
しかしこのバージョンNoは、今回はマイナーバージョン4ケタ目指します、という
Walter先生の意気込みではなかろうなw
>>569 ありがと。でも残念ながら変化らしい変化は見られず。
そちらで実験してみてくれてうまくいってるなら、何がどーなっているやら……。
というか、browser.writeString("hoge\r\n");を10000回ほど回してみたら表示されたり、
それでも最後の数バイトが受信しきれない場合があったり。
どう見てもバッファがらみです。本当に。
socketから直接sendしても正常に送れたサイズ返してくるし、
phobosのコード読んでも誰もバッファリングしてないし、
Winsock以下がしてるかとTCP_NODELAYまでセットしてみたのにダメだし。
うわーん。誰か正常に動作する鯖のサンプルをくれー
587 :
569 :2007/01/24(水) 23:47:48
1.001とくるんだったら1.000にしとくべきだったのでは TeXは3.1415→3.14159→とバージョンが上がっていってたな
>>588 >TeXは3.1415→3.14159→とバージョンが上がっていってたな
ほんの百回バージョンアップしただけで破綻しそうなシステムだな。
TeXは出てからバグが5回しか見つかっていないということじゃないか? 確かあれってバグが1個見つかってフィックスされるたびに 桁が1個増えるとかどこかで聞いたのだけれど。
592 :
デフォルトの名無しさん :2007/01/25(木) 09:38:41
TeXは、すでにはじょうしている。 存在自体がバグ
破綻(はたん)
はじょうって何だ?
>>592 が破綻してるのか?
TeXは、バージョン1の時から、3になったら3.1415・・・と増えていき、 自分が死んだらπになるとクヌース先生は言ってるな
Texは、既に波状している。 意味わかんね。
ガイシュツみたいに流行らせようとしてんじゃね?
がいしゅつだのふいんきだのはじょうだの・・・ ネタでやっても頭悪い印象しかないんじゃね?
そんなことより
From: Walter Bright <
[email protected] >
Newsgroups: digitalmars.D.announce
Subject: DMD 1.001 release is broken
I checked into the bugs Oskar and a couple others posted, and while
they're not hard to fix, they do render the release unusable. I'll try
to get an update as soon as I can, in the meanwhile, stick with 1.00.
2_目に期待
600 :
デフォルトの名無しさん :2007/01/25(木) 14:25:37
釣り、それは魔法の言葉。
What's New for D 1.002 Jan 24, 2007 New/Changed Features Bugs Fixed * D.announce/6893: ClassInfo.flags incorrectly set * D.announce/6906: Three subtle cases of tail recursion item 2
そこでさらに「きずけ」と書いてほしかった
bindingAPIってDCB構造体やCOMMCONFIG構造体の宣言をするとリンクに失敗するな。
608 :
569 :2007/01/27(土) 01:40:31
いーかげんウザがられてそうで申し訳ないが、 std.socket.Socketを自分で直接操作してみたら問題なく動作した罠。 SocketStreamに何か問題あるのかしらん。コード見た感じ私には特に……だけど。 誰かSocketStream周りで似たような現象が出たら是非。
What's New for D 1.003 Jan 26, 2007 New/Changed Features Bugs Fixed D.announce/6929 D.announce/6953
Walterたん・・・
やっぱDはこうでなくっちゃいけねぇ……
Walterたん萌え
連想配列にはkey(だけ?)を削除するremoveがあるけど、 他にもclearみたいに全削除とかってできないの? あと、普通の配列にもinsertとか欲しいんだけど・・・
普通の配列にもinsert欲しいって正気か?
前は int *a = new int[100]; が通っていたのに今はエラーでるんだね。 これは int *a; int b = new int[100]; a = &b[0]; とかで書けばいいのかな。
別に実装は可能なのだからあってもいいとは思うが。 たくさんの人が必要に迫られて自分でinsert()書いてるんだろーな……。 ところで「配列のプロパティとしての関数」が 配列のプロパティとして通らないのだけど、バグだよね? private import std.utf; unittest{ int number(char[] string){ return toUCSindex(string, string.length); } assert("あ".number() == 1); assert("あ".number == 1); // コンパイルエラー }
int a[] = new int[100]; これじゃダメなのかなぁ・・・
最新型DMD使ったらこう・・・ Assertion failure: 'classinfo->structsize == CLASSINFO_SIZE' on line 316 in file 'toobj.c' 戻そ・・・
>>616 普通の人は配列にinsertするようなアルゴリズムを選択しないと思うが
writeよりreadの多いリストの実装として良く採用すると思うが バイナリサーチみたいなランダムアクセス前提のアルゴリズムもあるわけで。 まあJavaみたいなコレクションライブラリをDにポーティングすりゃいいんじゃね。
621 :
615 :2007/01/27(土) 15:51:26
あ、int b〜でなくint[] bだった。
>>617 まぁそれで良いのだけどね。
前に書いてたソースでCの関数に渡すからわざとポインタで
宣言していたところがコンパイラのバージョン上げたらエラーでたので。
>>621 int *a = (new int[100]).ptr;
必要なときに.ptrした方がいろいろ都合が良いと思うんだが・・・
D 1.004 Walterタソ迷走中
なーに、千分の一刻みにした恩恵が早速表れて幸先が良い。
opApplyの使い方が良くわからん struct Hoge{ char[] s; } main(){ Hoge h; h.s = "abcd"; foreach(char c; h){ writefln(c); } return 0; } これでh.sの中身を一文字ずつ出すのはどうするの?
>>627 struct Hoge{
char[] s;
int opApply(int delegate(inout char) dg) { // opApplyの引数はdelegate
int result = 0;
for (int i = 0; i < s.length; i++) {
result = dg(s[i]); // 引数で渡されたdelegateに値を渡す
if (result) break; // delegateの返値が0でなければ、中止してその返値を返す
}
return result; // ループが正常に終了した場合は0を返す
}
}
>>620 リストは配列じゃないし二分木も配列じゃないだろう。
たとえば二分木を配列の上に構築する場合なんかは、
必要なのは配列へのinsertじゃなくて二分木へのinsertでしょ?
リソースの節約と速度を求めて配列採用するのに何でツリーを設けるんだ
>>626 マイナーバージョンが3桁表示なのは、千分の一刻みなのとは違くね
>>630 バイナリサーチは二分木じゃなかった。insertの話とつなげてヒープソートとごっちゃになってた。
けどそうなると、配列にinsertするってのとバイナリサーチって独立の話だろ。なんでここで
(リストや)その話が出てきたんだろう。
一個一個insertするような仕様だとひどいことになるけど、そういう話じゃなくてなんか別の
話なんかね、配列へのinsertって。
配列と線形リストとの比較ならバイナリサーチは配列側の必須機能じゃね? =であるかだけがサーチじゃないっしょ
D言語を初めて使ってみたのですが UTF-8で保存しているのにコンソールでprintfやwriteflnで表示すると文字化けします。 どうすればいいのでしょうか?
コンソールをUTF8表示対応にする、もしくはtoMBSz()
635 :
デフォルトの名無しさん :2007/01/27(土) 21:35:11
>>633 使っているコンソールは、UTF-8に対応していますか?
WindowsのDOS窓だったりだめっしょ
Consoleというinterfaceを作って各OS向けにカスタマイズしたらいい。
>>634-635 thx.
コマンドプロンプトを使ってました。
writefln(toMBSz("ほげ"))とかをやると910FD0とかいう数字が表示されていたり。
仕方ないのでPoderosa-Cygwin経由で無理やりutf-8表示させてみますた。
>>635 Win32 Console Windowなら、立派にUnicode対応してるじゃん
UTF-16に変換してWriteConsoleW()すればよい
APIを直で使うなら、何も困らないわけで。 Phobosから使えないのが問題なんでしょ。
もういっそのこと 1.00004 くらいにしとけばいいのにね。
641 :
デフォルトの名無しさん :2007/01/27(土) 22:30:22
>>641 その気になればWin32用のm17nなコンソールテキストエディタだって書けるんだぜw
てかエディタなら普通_UNICODEで作るんじゃね? もうマルチバイトはやめようぜ、これからはUTF32の時代さ
どこの文字セットを使うんだよw
せめてUTF32に_UNICODEディレクティブは関係ないとか突っ込んで欲しい
>>637 亀レスでスマソがtoMBSzの使用例
printf("%s\n", toMBSz("ほげ"));
T[] insert(T)(T[] source, T[] insertIt, size_t position){ return source[0..position] ~ insertIt ~ source[position..$]; } phobosにこれくらい入ってて欲しいなー、程度の意味じゃなかったの? ちなみに俺も欲しい。 パフォーマンスが極端に要求される場合は、別のデータ構造を使うだけだけだし。
静的配列でinsertは危険が伴うと思うんだが、勝手に拡張してくれるのかな。 stlやcollection framework互換のライブラリ作るのがいいさね。 このスレ用のソースをうpする場所ってない?
ていうかDTLはどうなったんだ
ASCII/latin-1圏の人々って、絶対char[]のlengthを文字数の意味で使ってるんだろうなぁ。 バイト数なのに。それが通じるのはASCII/latain-1系文字だけなのに。 作ったソフトが思いの外世界でウケちゃったときに、 「日本語対応してねー」「パッチくれー」って右往左往することになるのに(日本人が)。 文字列は組み込みのStringクラスにして欲しいなー。 んでlengthとbyteSizeとか分けたプロパティを用意して、 文字とバイトの違いをちったぁ意識させて欲しい。
>>637 > 仕方ないのでPoderosa-Cygwin経由で無理やりutf-8表示させてみますた。
ckのほうが軽いし文字の自動認識もしてくれていいよ!とか言ってみる。
……逆にcmd.exeで文字化けることに気づかないのが問題だが。
とりあえず、動的配列.insert(pos,value)があったらいいなぁ。 んでもって連想配列.clearも ってか、実はすでにあったりするの? 言語仕様の確定後かつ関数書けよって話でアレだが a &== b みたいな構文で ( a & b ) == b と等価とか a |== b みたいな構文で ( a & b ) != 0 が等価とかもちょっとほすぃ
>>653 class つくって好きにやって下さい。
>>653 >>654 利用頻度の高いユーティリティメソッドとか、
標準で入ってるかって点がかなり重要なんだよね……。
commons-langとかJVMに入れちゃおうよMr.ごすりーんー……とJavaマの嘆き。
何にせよ、言語仕様の方が1.0が出たことだし、
お次はphobosを強化・改善に取り組まんとな……今のままじゃやはり貧弱ゥと言わざるを得ない。
Javaや.Net、boostレベルまでもってくのは大変だろうけど。
phobosでなくとも、何か標準で採用されるライブラリを作れれば良いんだ!
各型用のエンディアン変換関数をphobosにいれた方がいい様な気がした。
ライブラリは割と揃ってると思うけどな。Cの財産も使えるわけだし。
×財産 ○遺産
命名規則が統一されてる新ライブラリを希望
>>655 Java並になって欲しいのは確かだけど、Javaのように密林化して欲しくないな。
Cのライブラリが遺産ってのは賛同できかねるな。
>>662 ライブラリ同士のコンパチビリティが低いのがねぇ。
なんでそんなもん気にしてるのよ? どうせWindowsでしか使わないんでしょ?
俺もlinuxで使ってるよ。
俺もlinux。 てかWindowsだと正直C#でいい感じ。 linuxにはいい言語が無かったところにDがきたって感じ。
別にWindowsだからどうのって事が言いたいんじゃなくて、 コンパチビリティなんか気にする必要は無いだろうといいたいんだけどな。 Linux使っているなら、どうせLinuxでしか使わないんだろって言うよ。
669 :
667 :2007/01/28(日) 19:21:01
>> 668 なるほど。それなら俺も同意。 むしろコンパチビリティのためにやたら制限キツくなった言語とか使いたくない。 それこそDの言ってる”実用性”ってのがない。
正直WindowsとLinux両方で使ってる。
プラットフォーム間の互換性は重要だと思うが。
ユーザとしちゃ片方しか使わないかもしれんが、
ウチら開発者なんだから、どうせならWinユーザもLinuxユーザも使えるもの作りたい。
しかし
>>663 の言うコンパチビリティって、
複数ライブラリ間の相互運用性のことじゃないのか。
たとえばXMLパーサとYAMLパーサがあったとして、
どっちもstd.stream.Stream使ってデータを読むようになってれば、
FileStreamだろうとMemoryStreamだろうと自作のStreamだろうと使えるという。
Cだけじゃそういうのはちょいと手間かかりそうだね。
JavaやC#のように、バイトストリームとテキストストリームの区別を ちゃんとつけて、エンコーディング絡みの問題はI/Oレイヤに隠蔽すべきだろ。 テキストストリームの場合はデフォルトではシステムのコードページや LC_CTYPEに従ってUTF-8との変換を行うべきだし、明示的にエンコーディングを 指定することも可能になっているべきだ。 ただしWin32かつコンソールI/Oの場合は、可能ならW系APIを使うようにすべき だろう。 単にハローワールドしたいだけのユーザが、明示的に std.windows.charset.toMBSz()なんてものを使わないといけないのは 馬鹿げている。
std.file等へのtoMBSz()ハックが仕込まれているのがWin32だけなら、 Linux環境では実質UTF8ロケールじゃないと使い物にならないってことだよな。 ……駄目じゃん。それじゃ実用的な言語にはならないよ。 char[]のエンコーディングをUTF-8と仮定した時点で、外部がそうとは限らない 実世界で使われる実用的プログラミング言語としては、システムとの界面において エンコーディング問題の一切の泥仕事をを引き受ける必要が生じるって ことなんだがな。
> ウチら開発者なんだから、どうせならWinユーザもLinuxユーザも使えるもの作りたい。 VMっていう答えがもう出てるからなあ。 > 複数ライブラリ間の相互運用性のことじゃないのか。 そんなこと言い出したらきりが無いと思うんだけど。 その時その時で出来る限りのコードを書くしかないし。 俺らが今書いているコードだって、未来には別な概念を持った言語が生まれてて、 気持ち悪いとか言われてるんだぜ、きっと。
>>674 ある程度移植性の高いコードはCでも書けるべ。
分野によっては厳しいけど。
んでも、ToMBSz()とか使わないといけない時点でDでは厳しいなw
何コレ。
Win32ベッタリじゃん。
JavaのIOはホント理想的な設計だなぁ…… バイナリ担当のInputStream/OutputStreamと 文字担当のReader/Writerが分かれてて、 両者の境界では必ずエンコーディングが与えられる。 Dは文字とバイナリの区別が曖昧な気がする。 とりあえず英語環境じゃ困らないから、 Cの実装に丸投げして間に合わせたりして、 細かい設計は後回しにしてるのか……? ちょっとソース読んでみるかねぇ。
すまんが教えてくらさい クラスの継承はすべてpublic継承なの? private/protected継承はないのか
仕様的にはできるはず ClassDeclaration: class Identifier BaseClassListopt ClassBody BaseClassList: : SuperClass SuperClass: Protection Identifier Protection: private package public export
>>676 char[]がUTF-8と仮定することで多くのMBCS問題を回避することはできるが、
その代わりに、Cのcharがただのバイトでしかなかったことで避けていた
問題にブチあたってる感じ。
Javaや.NETのアプローチは流石に賢いし正しいね。
>>675 かといって、Win32 UNICODEなプログラムを書こうとしても、
今度はwcharな文字列操作関数が全然ない。
要するに1.0は出たものの、実用上まだまだだってことですかな。
682 :
デフォルトの名無しさん :2007/01/28(日) 21:49:41
この辺、.NETはどう解決してるんでしょうか? って、スレ違いか
>>677 きっと、同一モジュール(ソース)内に、書いて private が効いてないとか言うオチの予感。
>>682 .NETはほぼJavaと同じ。
Win32ベッタリなだけに、DLLやCOMとの相互運用性がもともとサポートされており、
ライブラリ側のchar*とのエンコード変換は、import指定の際に、簡単な
属性の形で記述できる。この辺はJavaより便利で楽な点かな。
>>683 いやそれは大丈夫
C++と違ってクラスの初期アクセス指定と継承はpublicなんだね
モジュールがデフォルトでprivateなようにそれらもprivateかと思ってたよ
あと下のコードがコンパイル通るね
C++だと非public継承のとき通らないはず
// module x;
class A { /*public*/ void run(){} }
class B : /*public*/ A {}
class C : public A {}
class D : private A {}
class E : protected A {}
// hello.d
import x;
void main() {
A a = new A;
A b = new B;
A c = new C;
A d = new D;
A e = new E;
a.run();
b.run();
c.run();
d.run();
e.run();
}
さすがにもう来ないんじゃね?
こうするとちゃんとエラーになったが A a = new A; B b = new B; C c = new C; D d = new D; E e = new E; hello.d(16): class b.D member run is not accessible hello.d(17): class b.E member run is not accessible
端から見てるだけであんまり詳しくないのだけど、 int32とかint64とかそういうINTxx的なエーリアスが標準でついていて、保障されてるとうれしいなー。
配列のメソッドっぽい方式の関数群を ライブラリとして、Arraysって感じに集積してみてはどうだろうか。 cppのSTL並に有用なライブラリになりそうなんだけど。
もともと標準の型がサイズ保証されてるから、意味ないと言えば意味ないか。
>>690 お。あるんですね。
CPPで開発してても標準でそういうものが無いみたいなのでいつもビクビクしながら作ってたんですよ。
それだけでも結構、価値があるように思いますー。
結局D言語って、 今までの言語ですごくほしい、、と思ってた機能がある かわりに 今までの言語で湯水のようにすんなりと使って、気づいてなかった ところが、まだ実装されてない。 っていう状態なんだな。
身の程を弁えないDeimos争いがこれから始まると思うとわくわくしてきた
phobosが公式ライブラリ群でdeimosがユーザーライブラリ群という住み分けとか、そういうの?
dtlのサイトがなくなってるっぽいところを見ると dmあたりが統制を取ろうとしてるのではないかと邪推できる
第二のMSにならないことを願ってる。なんてね。 まー、誰かが音頭取らないと発展しないし、カリスマ発揮して旨く転がしてほしいね。
>>693 まだVer.1が出たばっかだから、粒の粗い方を処理してる感じなんだろうね。
俺はもうちょっと様子見かな。
でも、Dはホント普及してほしいよ。
メモリ管理が面倒でSTLに逃げたりnewしない方向ばかり検討したり、根性曲がってしもた。
DとPHPがあればOKだと思っている俺がいる。
700
僕も発展したDがあれば永住しそうだ。(いいすぎかな。XP
ares と mango が統合して tango とかになるんじゃなかったっけ?
toMBSz()はWideCharToMultiByte()なんぞを使わずとも C標準のwcstombs()等で実装できるし、そうすればWin32依存性が無くなる。 libcの実装が正しければ、どの環境でもまともに動くはずだ。 C標準のstdioやstdlibのw系I/Oおよび変換関数は、あらかじめ setlocale()を呼んでおかなければまともに機能しないという問題があるが、 ここはいっそ setlocale(LC_CTYPE, ""); をDのスタートアップルーチンで実行しても良いぐらいだと思う。 UNIX+Cの世界でのI18N関連でもこうしたことは常識のはずだが、 一体何を考えているのやら。 I/Oレイヤに関しては、こう言っては何だが、ぶっちゃけ現状の設計が糞なので、 小手先でいじってもどうにもならんように見える。 そもそもDはせっかくbyteとcharを別の型として用意しているんだから、 もっとそれを意識すべき、させるべきだろう。 型が違えばユーザに変換の必要性を意識させることもある程度は可能なはずだ。 std.c.stdio.printf()のような物の引数が、平然とchar*として宣言されているのは、 正気とは思えない。 DはcharをUTF-8文字と定義しているのだから、Cインタフェースにおけるchar*は、 byte*と宣言されるのが正しい筈ではないか。 これは、byteとcharのキャストは一体どう扱われるべきか、という別の疑問点も 引き起こすが。
toMBSzってwindows以外でも使うのか?
使う
>>704 Cに標準で入ってたんか……。試してみよう。
Cだとunsigned charをバイト値として使うのが当たり前だったせいか、
それを引きずる人が、そこかしこで混同してるみたいですな。
toMBSzの戻り値とかもUTF-8じゃない以上ubyte*あたりでないとおかしいですね。
そのうち"Invalid UTF-8 sequence."が出そうなのに。
Phobosの再設計が必要なのは明らかだし、
「Dの新ランタイム」たらんとしてるプロジェクトもいくつかあったはずだけど、
現状どうなってるんでしょ。
dsource.orgのLibraries-System見ても、
・Deimos - alpha
・dool - (何も書かれてないぞオイ)
・Ares -
>>702 で進行中?
というわけでares-mangoあたりが有望そう?
forumに"Deprecating Ares"てポストもあるし、ちょっと読んでみようか。
>>707 C標準はwchar_tのサイズもエンコーディングも定義していないので、
そこんとこは注意。
今時の実装ではまず通常はUnicodeだが、2byteではなく4byteであることは多いし、
cygwinで使われているnewlibのように、localeまわりが非常にpoorでUnicode
ベースではない実装もある。
そうしたものは切り捨てるにしても、wchar_tのサイズによって、UTF-16か
UTF-32かの分岐は必要になるだろう。
完璧さを期すならD自身が変換を管理すべきだろうが、そういうことを
やっているとランタイムが大きくなってしまうんだよな。Javaレベルまでは
いかないにしても。
Unicode絡みでは定評のある、IBMのライブラリICUのicudt.dllは10MBもある。
これは単にデータを持っているだけのDLLで、関数やクラスは他で定義されている
というのに、だ。
おはようございます
そもそもCはunsignedでないcharをフツーに文字列として使ってるけど、 それって既に8bitクリーンじゃないって事にはならないの? 昔からの疑問……。
>>704 versionは生かしたいところだな。あれは(#ifに比べて)いいものだ。
MacOSXが定義されてない、と思ったらdarwinと定義する人が多いね。
>>710 charをそのままctype.hのマクロに渡したり、128以上の整数と比較したりする
コードがあればNG。
そういうことをやっていないのなら問題ない(と言い切ってしまうのは問題が
あるかもしれないが)。
マンドクセーから-funsigned-charだの-Jだのといったコンパイラオプションで
charを強引に無符号にしてしまうケースもしばしば見られるな。
D言語のcharってubyteと同じではないの?
Phobosはいずれ壊されるかな?結構不安だな。
いや、以内なんだから今年かもしれんぞ
Phobosは引力に惹かれ、いずれAresに、か……
>>708 なんだか訳が分からなくなってきたw
元々詳しい分野でもなかったんで、これからまったりと勉強してきまふ。
というか、WideCharとかMultiByteとかWinAPIのA版W版とか、
なんど勉強してもいまいち正確な定義やそれぞれの関連が理解しきれんw
>>718 この手の物は完全にバットノウハウだしなw
720 :
デフォルトの名無しさん :2007/01/29(月) 21:21:41
俺も何がなんだか、わからなくなった・・・ ・WinAPIのA版は、ASCIIだけど、W版の文字コードは? ・D言語の標準的な文字コードは?
>>720 ・Windows A:ANSI, W:UTF-16
・D言語 char:UTF-8, wchar:UTF-16, dchar:UTF-32
・C言語 char:環境によっていろいろ, wchar_t:環境によっていろいろ
typedef char ansi; typedef char mb_char; typedef mb_char utf8; typedef mb_char shift_jis; とかあると便利じゃないだろうか
というか、Dの文字列って正直・・・ typedef ubyte UTF8 typedef ubyte ANSI ・ ・ ・ みたいな物がよかったよ。 で、charは無くてよし。
WideCharという考え方: 我らには1バイト256文字では到底足りぬ。ABCも特別扱いはせん。全て固定で2バイトじゃー。 いやいや兄者、どうやら2バイトを持ってしても足りぬこともあるようだ。いっそ4バイトほど。 ええい、とにかく固定サイズよ。 MultiByteという考え方: そうは言うがな大佐、今までのASCIIとの互換性というものがある。 それに、確かにアルファベット以外も出てくるが、大半はアルファベットしか書かれない事も多い。 ASCII文字は1バイト、それ以外は1文字が2バイト以上にもなりうる「可変」というのはどうだ? SingleByte(?)という考え方: アジアの人とか大変だなぁ……。でも1バイトな僕らだけど、 バイト数が固定(1だけど)という意味では、処理のされ方はWideCharの方が近いのか……。 でもMultiByteだって普通ASCII互換だし、MultiByteで扱われても大抵困らないと。イェィ。 え? 1バイト=1文字の仮定で文字列操作するな? 国際化対応とかめんどくさいなぁ……。 各エンコーディングの所属: WideChar派: UTF-16("Unicode"といえば一般的にはこれ)、UTF-32など MultiByte派: Shift_JIS、EUC-JP、UTF-8など SingleByte派: ASCII、Latin-1(ISO-8859-1)など Windows曰く: WideCharは処理が単純だから速度的に有利っすけど、MultiByteよりメモリ食うっスね。 せっかくWideCharは構造が単純なんだから、生かせる場合は生かしたいし……。 で、WideCharにはW、MultiByteにはAを用意しといたっス。 どっちでも各国語扱うことはできるんで、速度とかメモリとか、 WideCharはどこでもUTF-16固定、MultiByteについては国と言語の設定から。 皆さんだとShift_JISっすね。ちなみに他のエンコーディングを明示 ……こういう理解で良いんでしょうか先生。Windowsの当たりかなり自信無いっす。
むしろ世の中の方をUTF8,16,32にすりゃいい
テキストエディタ自作してたオレからすると、メモリ上でUTF8とかアリエン。 ファイルフォーマットとしてなら許容するが
727 :
724 :2007/01/29(月) 23:44:14
うわん、Windowsのくだり途中で書き込んじゃったし。 もうどうせだから、もっと色々書いちゃう。 「 WideCharにはW、MultiByteにはAを用意しておきました。 具体的なエンコーディングで言うと、WideCharはどこでもUTF-16固定、 MultiByteは国と言語の設定から自動的に選択されます。たとえば日本ではShift_JISです。 どっちでも各国語扱うことはできるんで、速度とかメモリとか、いろいろ考えて選んでください。 ちなみにWideCharToMultyByteなどの変換などでは、 当然エンコーディングを明示することもできます。 ウチでは各エンコーディングにコードページという番号を付けて管理しており、 たとえばShift_JISなら932、UTF-8なら65001です。前述の関数にこの数値を渡して下さい。 我々の提供するwindows.hでは、W/Aを#define UNICODEの有無によって 切り替えるようになっており、代わりにW/Aの取れたマクロを使うことになります。 」 で、Dが利用するdmcのsnn.libというCランタイムは、 コンパイルするときに#define UNICODEなんてされてない。 故にシステムに対する文字入出力には問答無用でA系が使われ、 Shift_JISでなくUTF-8が流されるから文字化けする……と?
728 :
デフォルトの名無しさん :2007/01/30(火) 00:45:54
Mac に DMD 入れて遊ぼうかと思ったんだけど、Mac版ってないのん?
DMDはない。GDCならある。
Shift-JIS と CP932 は厳密に言うと微妙に違うみたいだけどね。
そっか。残念。←大のGNU/GPL嫌い。
732 :
724 :2007/01/30(火) 01:04:58
あ、いや違うか。 標準入出力はバイナリストリームなんだからAもWも無いのか。 WriteConsoleとかの文字列を扱うためのAPI以外は。 むしろcmd.exeが、標準出力から受け取ったデータをShift_JIS文字列として解釈する仕様で、 でもphobosがUTF-8にして流してるせいで文字化けする、と。 何を長々と書いているんだ俺は。みんなゴメンよ。もう寝ます。
cmd.exeは普通にUTF-16解釈できるだろ
もうどーでもいいから適当に統一してくれ…
>>734 誰もがそう思ってるが実現されない不思議
0〜9を連続するコードに割り当てた香具師が勝つ
〇〜九だった〇九
UTF-16は2byte/4byteのマルチバイト ちゃんとした実装があるかは知らん
サロゲートペアがあるからな。 2バイト固定は UCS-2 だな。
interface I{} static if(!is(I : Object)){ static assert(false); } これが通らないのはバグと言えるんでしょか。 でないとしたら、テンプレートで受け取った型がtoString()持ってるかどうか 判定するにはどうすればいいと思います? Is式の項目を見るとどうにも、 static if(!is(I : interface)){ static assert(false); } とか書けるように見えるような……。
interfaceからObjectへの暗黙の変換はできないからバグじゃないだろう。 自分は void tmpl(T)(T obj) { static if( is(T == interface) ) (cast(Object)obj).toString() ... else static if( is(T == class) ) obj.toString() ... } とかやってる
742 :
740 :2007/01/30(火) 20:37:52
>>741 なるほど==の方ですか……。
ありがとうございました。うまくいきました。
とりあえず現状ではWindowsの多言語開発には向かないって事だね兄さん?
そうだね。ギークが畑耕した頃に触るといいと思うよ。
>>738 ICU
stdcのwcschrとかその辺のstring.hのcomplementsや、
stdc++のwstringは、
UTF-16の場合は結局MBCSと同じ泣き別れ問題を引き起こすわな。
>>743 Windowsに限った話じゃない。
実行環境がUTF-8ロケールでない「あらゆる」環境に向かない。
英語しか使わなきゃいいんじゃね?
中国語でおk
>>746 米国人もTMだの(C)だのの非ASCIIなLatin-1記号は結構使うものだよ
Windows2000ならDOS窓の設定でUTF-8表示にできるな なんでXPでできなくなってんだよ
chcpで変更はできるけど。 めんどいな。
chcpで65001入れてもバケた俺は何がダメなんだろう。utf-8のコードページて65001ダヨネ? もうみんなck使おうぜck。Dが日本語化けるなんて気づかなかったぜ俺。
コードページならショートカットで指定できるけどUTF-8も?
sizeをメンバ変数で使えないのは痛い・・・
super size me!
というかいつの話
さっきまで問題になってたUTF8。 某すごい人が、blogですぱっと解決してくれたな・・・。
758 :
デフォルトの名無しさん :2007/02/01(木) 02:46:16
759 :
デフォルトの名無しさん :2007/02/01(木) 02:49:06
ごめん、どこっていうのも恥ずかしいところでした。 D言語のリファレンス訳書いている人んところですね。
秘密にするのはその方がカッコイイから?
そうだね、ちょっとインパクトを加えたかった
弟子にしてください
おりょ? inabaしゃんのインターフェースでも、 UTFじゃないはずのネイティブな文字列データがchar[]扱いだ。 あんだけたくさんの言語に触れたあの人でも、Cのお約束引きずってるのかな。 それともwcstombsとかに渡すときに、いずれchar*にキャストしなきゃいかんから……か? いや、ubyte[].ptrをchar*にcastしたところで、何の変換コードが走るわけもなし。 いっそstd.cのimport文をWalterに書き換えて貰わんと根本的な解決にはならんのか。 いやそれより、main引数のchar[][]て、 今までUTF-8変換されてなかったのかw
>>763 今の用途だと、char[] 以外にしても単純に全部の使用箇所でcastが
必要になって使いにくいだけなので…
# ネイティブ文字コードなのに char[] で受け渡ししてくる
# ライブラリ(含Phobos)を応急処置で外から使うためのものなんで
自分で一からDの文字コード周りを再設計するならそりゃ別の型にするけども。
766 :
デフォルトの名無しさん :2007/02/01(木) 15:18:09
一番の問題はUTF8さえやっときゃいいんじゃねと思ってる1バイト圏の人が多いから
質問です D言語って代入はあるの?
すみません間違えました 挿入です
Tango 0.95 beta1 released
何を何に挿入したいのかわかんないと判断のしようがないと思うが。
D言語を通して 彼女の後ろの穴に 挿入したい C#やJavaでは 仮想的な実装になるので 現実味を帯びていない
poseidon死んだのか?
海を行け〜
>>770 おー、やっと普通に
import tango.io.Stdout;
void main() { Stdout("Hello, world!")(); }
がコンパイル通るようになってる。
>>773 poseidonってとっくに死んでたはずだけど。
777 :
773 :2007/02/01(木) 19:17:51
>>776 そうなんか、教えてくれてありがとう
となるとみんな何使ってんの?
俺はJmEditorかTeraPad インテリセンス?なにそれおいしい?
とっても甘美なのです
781 :
デフォルトの名無しさん :2007/02/01(木) 23:43:12
>>764 うーむ。実はどことなく釈然としませんが、たぶん私が未熟なだけなのでせう。
もーちょいいろんなIO関係のコード読んで勉強しまっす。多謝。
で、Descentも使わずEclipseのテキストエディタ使ってるのなんてきっと俺だけ・・。
自動ビルダ設定とSVN統合だけが友達さー。他でも出来るなんて言わないでー。
tangoってどこ?mangoとaresしか見つからんのだが。
連想配列いっきに初期化できないかなー・・・ int a[char[]]={ "aaa":1, "bbb":2, "ccc":3 } なんてなー・・・
785 :
784 :2007/02/02(金) 02:08:16
786 :
デフォルトの名無しさん :2007/02/02(金) 10:43:09
>>784 あんまりきれいじゃないけど、こんなのどう?
cast(char[])が取れればなぁ
import std.stdio;
// 連想配列初期化
V[K] newAssocArray(K, V, R...)(K key, V value, R rest)
{
static if (rest.length > 0)
V[K] result = newAssocArray(rest);
else
V[K] result;
result[key] = value;
return result;
}
int main(char[][])
{
int[char[]] a = newAssocArray(
cast(char[])"Foo", 1,
cast(char[])"Bar", 2,
cast(char[])"Hoge", 3);
foreach (char[] k, int i; a) {
writefln(k, ": ", i);
}
return 0;
}
適当に改造 template foo(T) { alias T foo; } template foo(T:T[]) { alias T[] foo; } foo!(V)[foo!(K)] AA(K,V,R...)(K key, V value, R rest) { foo!(V)[foo!(K)] result; static if(rest.length > 0) result = AA(rest); result[key] = value; return result; } int[char[]] a = AA("Foo", 1, "Bar", 2, "Hoge", 3);
788 :
784 :2007/02/02(金) 13:32:34
こういうのをバッドノウハウっていうの?
templateって難しくて付いていけない orz
>>787 のAA()は展開されると、どんな記述と等価になるの?
連想配列の静的な初期化って出来そうで出来ないよな。 やっぱ実行時に動的に追加してるからかな。
>>790 大体こんな感じかなあ
int[char[]] result1;
result1["Hoge"] = 3;
int[char[]] result2;
result2 = result1;
result2["Bar"] = 2;
int[char[]] result3;
result3 = result2;
result3["Foo"] = 1;
要素の数だけ連想配列のデフォルトコンストラクタ(?)を呼んでいるのが
ちょっと効率悪いような気がする。
連想配列って、普通の配列と内部的に違うの?
違う
D言語ってパターンマッチできますか?
>>792 調子に乗ってみた。
template tf(T) { alias T tf; }
template tf(T:T[]) { alias T[] tf; }
FV[FK] AA(K, V, FK=tf!(K), FV=tf!(V), R...)(K key, V val, R rest)
{
FV[FK] result;
SetAA(result, key, val, rest);
return result;
}
void SetAA(K, V, FK=tf!(K), FV=tf!(V), R...)(inout FV[FK] result, K key, V value, R rest)
{
result[key] = value;
static if (rest.length > 0)
SetAA(result, rest);
}
auto aa = AA("hoge", 12, "moge", 34, "mage", 56);
Dってどんな言語?が緑色に染まってます、、、 308行目のspan閉じてないからみたいです
>要素の数だけ連想配列のデフォルトコンストラクタ(?) はただポインタコピーするだけだからほとんど無視できるはず 再帰関数テンプレートのinline展開はしてくれないぽいので、効率を求めるなら FV[FK] AA(K, V, FK=tf!(K), FV=tf!(V), R...)(K key, V val, R rest){ FV[FK] result; result[key] = val; foreach(i,k; rest) static if( i%2==0 ) result[k] = rest[i+1]; return result; } くらいしないとダメぽい
> >要素の数だけ連想配列のデフォルトコンストラクタ(?) > はただポインタコピーするだけだからほとんど無視できるはず ただのポインタコピーで済むのはコピーコンストラクタの場合。 デフォルトコンストラクタではメモリを割り当てないといけないはず。
いやデフォルトはnullだから
null????
ぬるぽ
803 :
800 :2007/02/03(土) 15:37:55
ぬるぽは空(連想)配列扱いで、たとえば
>>792 なら、ローレベルに書くと
AA_str2int* result1 = null;
if(!result1){result1=new AA_str2int;} result1->add("Hoge",3);
AA_str2int* result2 = null;
result2 = result1;
if(!result2){result2=new AA_str2int;} result2->add("Bar",2);
AA_str2int* result3 = null;
result3 = result2;
if(!result3){result3=new AA_str2int;} result3->add("Foo",1);
こういう感じの動作なので、普通に書くより遅いことはない、よ
連想配列ってnullを代入したら初期化できたのか・・
テンプレートが、意図した通りに展開されているかを 確認する方法はありますか?
>>805 ユニットテスト
でも正直言わせてもらえればテンプレートもコードもかかれた通りに動作する
意図通りとは限らない。
Dのコンパイラほど使ってて信用できない物はないと思うw
>>786 うお、こんなことができるのか。syntax-rulesみたいだ
Dは機能が面白い。 lazyとかテンプレートとかinoutとかプロパティとか
でもプロパティって引数無しのメソッドと区別付かないよな。 public property int x(){ : : } こんな風にならんかな
なんかそれまえにもそんなかんじでいわれてたきがする
何かを付けたら 括弧なし呼び出し と 代入みたいな呼び出し が可になるのは素直に良いと思った。
そんなことされるとprintf="Hello, world!";というのが出来なくなるのでそのままがいいなぁ
814 :
デフォルトの名無しさん :2007/02/04(日) 15:23:23
>>813 やめて無意味にシンプルを捨てるコード書かないで
と言わせてもらおう……。
「"書く"に"Hello, world!"を代入する」より
「"Hello, World!"を"書く"」の方がずっと判りやすいじゃん。
プロパティが呼び出す側のシンタックスシュガーでしか無いってのは、
それがオブジェクト「属性」なのか「アクション」なのか、
クラスの設計者が表明出来ないってことなんだよね……。
>>812 ついでに通常の呼び出しが禁止されると尚良し。俺的に。
>>814 >「"Hello, World!"を"書く"」の方がずっと判りやすいじゃん。
Dで書くと
"Hello, world".printf();
...んーコレ、本当に判りやすいと思うのか? むしろ余計意味不明度が増してる気が。
すっげーわかりやすいわ。今度からそれ使う。dクス
英単語を日本語の語順で並べてるから違和感を感じてるんだと思う。
out = "Hello" ~ " , " ~ "World"; とかになるとあら不思議。かな
=を値のストリームと考えればおかしくない…のかな。。。 writefln=toString=10;
それなんてモナド?
\(=^o^=)/
823 :
デフォルトの名無しさん :2007/02/04(日) 18:25:40
>>816 少なくともprintf = "Hello, world!";よりはマシでしょう……。
私ゃprintf("Hello, world!");と書きますが。
むしろOOP的にはcout.printf("... とか?
# というかcoutはstdoutと名乗ることはできなかったんだろーか……。
演算子使うとしたら、C++に習ってcout << "Hello, world!"; あたり……?
824 :
823 :2007/02/04(日) 18:30:20
あ、いけね。coutにゃprintfなんて無かったっけ……
import std.stdio,std.cstream,std.conv,std.string; int add10(int a){return a+10;} void main(){writefln=toString=add10=toInt=din.readLine;} delegate/functionリテラルが使えないのと演算子の優先順位がらみの問題で使いにくいのが難点か。
すまぬ、だれかdwtについて教えてくれ。
以下の簡単なソースがコンパイルエラーになるのだが・・・
void run(char[][] args) {
Display display = new Display();
Shell shell = new Shell();
shell.setText("Shell Test");
shell.setSize(200,100);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
void main(char[][] args){
try{
run(args);
}catch(Object o){MessageBox.showMessage(o.toString(), "Exception");}
}
}
# 以下エラー
D:\usr\local\dmd\bin\..\lib\dwt.lib(imagelist)
Error 42: Symbol Undefined _D40TypeInfo_PS3std1c7windows7windows6BITMAP6__initZ
--- errorlevel 1
これは examples の filllayout.d を弄っただけ。
元のソースは問題なくコンパイル&実行できるのだが。だれか助けてー
dmd 1.0, dwt for D1 (
ttp://myweb.hinet.net/home5/kyovbdx/DWT_for_D1.rar )
>>814 書ければそれでいいじゃないかと思う。
見て意味が分かればなおいい。
短ければもっといい。
828 :
826 :2007/02/04(日) 21:08:18
すみません、よく調べたら落とした dwt for D1 自体に問題がある模様でした。 スルーして下さい(´・ω・`)
D言語でJSON記法があつかえるといいなあ と思うけど
>>827 書けるだけで判りづらいコードは有害だと思うのです……。
でも単に「書けるから書いた」ってだけでない、
見て意味がわかるコードを書くのは難しいことで、
だからこそ、それがマの技術力の一つだと思うわけで……。
可読性は神への信仰の次に大事です、とかいうファウラー信者な俺。
>>829 dmdscript使えば良いじゃない。
...と言おうとおもって調べてみたけどソースが古すぎてdmdscriptのコンパイルとおらねー
Webページのサンプルでよく見かける std.stream.stdout.writeLine("Hello world"); や import std.strem後のstdout.writeflnってコンパイル通らないよ。 素直にstd.stdio.writeflnに統一しろって事?
>>832 std.stdioのwriteflnかstd.cstreamのdout.writeflnやdout.writeLine
dout/din は元々 stdout/stdin だったのが変更されますた
k.inabaさんとこのtx使ってみたんだけど、 Windowsのcmd.exeで標準出力をリダイレクトすると空行が入らない? あとサンプルだとtest.dを読みに行ってるけど、 普通Dソースはネイティブ文字コードじゃないはずだからまずくないかな? 少なくともBOMが入ってると Error: ArrayBoundsError nu_mbwc(28) が出る
>>839 てきとうに修正しました
tangoのConsole IOはちゃんと変換してくれるのでそっちのがいいかも。# Windowsなら
842 :
839 :2007/02/05(月) 17:35:20
FileはWinAPIをラップしてるから改行コード変換はD側でやらないといけないけど、 doutとかのCFileはCのf〜系関数をラップしてるから改行コード変換をD側でやっちゃいけないのが問題だね。 そのおかげでフィルタストリームを作るときにファイルとコンソールで分けて実装しないとおかしなことになる。 CFileのコンストラクタでFILEをバイナリモードにかえてやって、 改行コード変換は全てD側でやるようにCFile.writeLineやらを修正すれば解決するのかな
843 :
839 :2007/02/05(月) 17:50:04
>>841 対応はやっ!
バッチリ直ってました
ありがとうございます
あー、単純に全部"\n"で出すようにしただけなので、ほんとは
>>842 のようにやらないといかんと思います。
>>672 さんも言ってるみたいに、テキストとバイナリのIOは明確に分けて欲しいよなあ…
tangoにゃIReader/IWriterなんてのが入ってて嬉しくなりますた。 こういうコードというか、テキストIO/バイナリIOの考え方自体が 「標準ライブラリに」入り込んでくれないと困るんだよなぁ……。 んで、そのへんの標準ライブラリの設計が片っ端から改善されたとして。 そうするとDって、プログラミングに初めて触れるための言語として、 結構良いモノになれる可能性が高いんじゃないかと、ふと思った。 Javaや.Netみたく必ずしもオブジェクト指向を強制されないし、 GCと例外のおかげで「引数は入力で戻り値が結果・目的」とかの ごく基本的な原則からも逸脱せずに済むし。 出来上がるのはみんなお馴染みの.exeだから 「exeってこうやって作られるのか」的感動もあり。
FilterStream派生じゃだめなの? class JpStream : FilterStream { this(Stream a) { super(a); } override void writeExact(void* buffer, uint size) { char[] a = new char[size]; for (int i = 0; i < size; i++) a[i] = (cast(char*)buffer)[i]; char* b = toMBSz(a); char* e = b; while (*e != 0) e++; super.writeExact(b, e - b); } } auto dout2 = new JpStream(dout); dout2.writeLine("あいうもげもsげ");
>>846 writeExactをオーバーライドしちゃうとバイナリ出力やワイド文字出力が使えなくならない?
それとFilterStream.writeLine(定義はStreamクラスの中)は環境ごとに改行コードを選んで出力するようになってるから、
doutをFilterStreamに包むとCライブラリの改行変換と重複して、改行として\r\r\nが出力されてしまう。
Stream派生クラスがオーバーライドすべきなのはwriteBlock……のはず。 ちょっと新たな気持ちでJavaのio設計を読み直してみたり。 DのOutputStreamはたくさんメソッド定義しすぎだな。Inputもしかり。 「渡されたバイト(列)を独自の出力先に書き込む」メソッド1つあれば十分……というか、 それ以上の事を実装クラスにさせちゃダメなのに。
write(int)とかのバイナリ出力までtoMBSzの洗礼を受けてしまう、という点も問題か。 JpStreamは文字入出力のためのクラスだ、write(int)とかは使うな!と ドキュメントとかで主張はできるけど、所詮は大元のまずいクラス設計のごまかしに過ぎない。
What's New for D 1.005 Feb 5, 2007 New/Changed Features * -v now emits pragma library statements and imported file names * deprecated === and !== tokens no longer recognized * length can no longer shadow other length declarations * Added MixinStatements, MixinExpressions, and MixinDeclarations. * Added ImportExpressions. * Added std.metastrings
> * Added MixinStatements, MixinExpressions, and MixinDeclarations. なんか猛烈なのキタ
void foo() { // Prints contents of file foo.txt writefln( import("foo.txt") ); } これはすごいwwwwwww
mixin(import("foo.d")); こうすればC/C++の#include
IODCCにwktk
久しぶりに見たけど、まだ mix-in 導入されてなかったの?
D 0.91 での変更点 May 27, 2004 バグ修正 * mixin での super の問題を修正。 ただ、どういう意味でのmixinを言っているのかはっきりさせてくれれば
何でもありktkr wwwwwwwwwwwwwww
GDC release 0.22
http://sourceforge.net/project/showfiles.php?group_id=154306 Changes:
* Added support for GCC 4.1.x
* Support for GCC 3.3.x is deprecated
* Updated to DMD 1.004
* Fixed Bugzilla 836, 837, 838, 839, 841, 843, 844, 889, 896
* Fixed problems with missing debug information
* Added Rick Mann's -frameowrk patch for gdmd
ReadStreamでサイズ指定付きバイト列を読みこめないのは悲しい
1.0が出てちょっとは仕様追加とかおとなしくなるかと思ったら…… Walterのやろぉ、全っ然そんなつもり無ぇなてめぇぇぇぇーー! やっぱDはこうでなくちゃな! しかしこのMixinて、#includeとどう違うんだ?とかどうも嫌な感覚があるんだが。 まぁいいや、新仕様ちぇっくちぇっく……
トップレベルで mixin(import("foo.d")); とすると#includeっぽい働きをするのかな。 そもそもの#includeっぽい用途ならmixinなんて する必要ないだろうから、使い道は変わってきそうだ。 mixin(brainfuck!(import("foo.bf"))); とかしろってことだろうか。
とりあえずimportの方は「文字列リテラルを外部ファイル化できる機能」って事でいいんでしょうか。
ファイル名も文字列リテラルだ、ってところが 単なる外部ファイル化とはちょっと違うところかな。
追加された、std.metastringsを使って人には言えないことをしようという試みかな
なんか、「どこまでコンパイル時に解決できるか」の限界に挑んでる感があるなw いや、関数型言語とかにゃ及ばないんだろうけど。 確かに「ユーザ側でシンボル名を指定できるライブラリとか作れたらなー」とか 思ったことはあったけどさ……。まさかここまでするとは。 強力なライブラリを作る基礎になりそうな気はするな。 しかしこうなると「コンパイル時に決定できる文字列」とそうでない文字列の区別が 面倒くさくなってきそう。
std.metastringsとmixinを使うと、面白いこと出来そうだね
うわーひでえwww
なんか眺めてるうちに、 文字列リテラルやconst char[]と互換(等価?)な、 ”メタ文字列リテラル”みたいな言語仕様が欲しくなってきた。 "文字列の内容"は関数名や変数名とかとは完全にレイヤが違う、って 感覚が染みついてるから、どうも気持ち悪くなるんだよね……。
つ[お題 Hello World] 激しいのが見たい
int main(){}
void main(){} static this(){ printf="Hello World"; }
import std.typetuple; template splits(char[]string,char[]sep,int i=0){ static if(string.length-i < sep.length) static if(i == 0)alias TypeTuple!() splits; else alias TypeTuple!(string) splits; else static if(string[i..i+sep.length] == sep) alias TypeTuple!(string[0..i],.splits!(string[i+sep.length..$],sep,0)) splits; else alias .splits!(string,sep,i+1) splits; } template split(char[]sep){template split(char[]string){alias splits!(string,sep,0) split;}} template map(alias F,T...){static if(T.length == 0)alias TypeTuple!() map;else alias TypeTuple!(F!(T[0]),.map!(F,T[1..$])) map;} typeof(mixin(map!(split!("->"),splits!(string,"\n"))[1]))[typeof(mixin(map!(split!("->"),splits!(string,"\n"))[0]))] /*
*/ hash(char[]string)(){ typeof(mixin(map!(split!("->"),splits!(string,"\n"))[1]))[typeof(mixin(map!(split!("->"),splits!(string,"\n"))[0]))] result; alias map!(split!("->"),splits!(string,"\n")) array; foreach(i,v;array)static if(i%2==1)result[mixin(array[i-1])] = mixin(array[i]); return result; } void main(){ char[][char[]] x = hash!(` "4"[] -> "Hello"[] "5" -> ", " "6" -> "world!" `); printf("%.*s",x["4"]~x["5"]~x["6"]); }
ここまで来ると、コンパイル後より、コンパイル前のデバックが大変だなwww
>>876 うん、実は死にそうになった。
あと、
>>875 のままだとローカル変数とか触れないから後半ちょっと修正。
stringのエスケープ処理はさすがにめんど過ぎるからカンベンな。
template hash(char[]string){
const char[] hash = `(){
const char[]string = `"`"~string~"`"`;
alias map!(split!("->"),splits!(string,"\n")) array;
typeof(mixin(array[1]))[typeof(mixin(array[0]))] result;
foreach(i,v;array)
static if(i%2==1)
result[mixin(array[i-1])] = mixin(array[i]);
return result;
}()
`;
}
void main(){
char[]a = "4";
char[]msg="Hello";
char[][char[]] x = mixin(hash!(`
a -> msg
"5" -> ", "
"6" -> "world!"
`));
printf("%.*s",x["4"]~x["5"]~x["6"]);
}
これはひどい
変態系プログラミングが楽しくなりそうな言語だな。
たとえば、csvをimportして配列にするとか、そういう用途が本筋か?
ふと気づいた。 実用重視はどこに行ったんだ?
飽きたんじゃね?
883 :
デフォルトの名無しさん :2007/02/06(火) 23:14:42
あそびねた☆
コンパイル時でevalまがいのmixinはハッキリ言って要らないと思った
tango の名称はこのままで良いものなの? 現に Java とかアイコンのプロジェクトとダブってるし 改称プロジェクト続出の例があるから心配。 ・・・dango orz
たとえばGUIフォームを定義したXMLファイルを、コンパイル時にimportとmixinでごにょごにょするようにすると、 --- form.xml --- <MainForm type="NormalForm" caption="Login"> <userName type="TextBox"/> <password type="passwordBox"/> <loginButton type="Button" onClick="onLoginClick"/> </mainForm> --- test.d --- MysteryOfMetaprogramming!("form.xml"); scope MainForm form = new MainForm(); void main(){ mainForm.run(); } void onLoginClick(){ if(mainForm.password.text == passwordTable[mainForm.userName.text]){ login(); } } XMLがDのソースファイルの一種として、自然にDコンパイラに組み込まれる形に。 ……とか、可能になる……のか? のか?
ウォルタータンに惚れたw
>>847 改行無効化ダメカナ
import std.cstream, std.stream;
void main()
{
auto dout = new 改行なんて許さないんだからぁ(dout);
dout.writeLine("イーアルサンイーアルサン");
dout.writeLine("onetwothreeonetwothree");
dout.writeLine("123");
}
class 改行なんて許さないんだからぁ : FilterStream
{
char[] 改行 = "";
wchar[] 改行w = "";
this(Stream a) { super(a); }
override void writeLine(char[] s) { writeString(s); writeString(改行); }
override void writeLineW(wchar[] s) { writeStringW(s); writeStringW(改行w); }
}
>>886 Dコンパイラは汎用プログラミング言語コンパイラになりました\(^o^)/
v1.0出したからv2.0まで遊べるようになったもんな
もっとやれw
889 :
871 :2007/02/06(火) 23:54:27
ここはすごい連想配列初期化ですか? ここはひとつJSONも・・・
>>886 XAMLライブラリ作っちゃう猛者とか現れないかなあw
Dもプラプラと同じように変態言語まっしぐらって感じだなあ
じゃあD++作る
正直不安になってきたwww
これ色々やったら.h読めるんじゃね? C/C++との互換性が意外な方向から解決、みたいな。
プリプロセッサよりも凶悪って意見もあるけど プリプロセッサは 副作用 と スコープの概念がない のが問題だったが このimport/mixinにはそういう心配はなさそうじゃない? それとも別の問題が考えられる?
>>896 すでに、news の方で
> You know the next step, right? A template version of htod!
>
> include!("gl.h");
I did shy away from the "execute this shell command and insert its
output into a string literal" because that would turn a D compiler into
a huge security risk.
と、Walタンが答えてる。
同じく news の方にあった BuildBarserFromFileSpec!("foo.bnf") これがそそる。
void main(){printf(import(__FILE__));} これワロタ
static ubyte[] icon = cast(ubyte[])import("foo.ico"); ほぉ、コレは便利。
そもそもMixinがなにかしらない俺ガイル
staticに動くXMLパーサ&クラスジェネレータとか
いくら何でも作者が死ぬだろ……と自分でも思うが、
boostのSpiritとかそーいう変態的hackを見てると、
世のハッカー達ならひょっとして……とか思えてしまう。
実は自分には実装がホントに可能なのかすら全然想像もつかないけど。
ひょっとしたら意外に簡単だったりするんだろうか。
>>901 importは何らかの文字変換かけてbyte列壊したりはしないのかな。
試しにBOM付きのXMLテキストをimport&出力してみたら、
きっちり先頭に化け文字がくっついてくれたけど。
importで実行ファイルを指定して標準出力をとってきてくれるとかどうだろう こんなかんじで import(exefile, cmdline, stdin) そうするとコンバータを自作したりできるんだが 流石に狂ってるかね
>>897 このMixinはStatement/Expression/Declarationの言語単位を認識してくれるのね。
コンパイラ内部にあるであろうStatementParserとかExpressionParserに
staticな文字列をソースとして放り込んで、結果を採用させる、って感じ?
確かにCの単純なプリプロセッサとはひと味違うわ。
>>904 > importで実行ファイルを指定して標準出力をとってきてくれるとかどうだろう
> こんなかんじで
> import(exefile, cmdline, stdin)
>
> そうするとコンバータを自作したりできるんだが
> 流石に狂ってるかね
898見てみると、Walタンがセキュリティーに配慮してやらないようにしてるって答えたみたい。
あ、読み飛ばしてた サンクス 確かにセキュリティ的にやばいな
拾ってきたソースコンパイルしてみたらrm -rf /が走ったなんて洒落にならんしな……
ってかMakefileに all: rm -rf / なんて書かれてたら同じな気ガス
>>909 それもそうだった……というかコンパイル後に実行するのも同じだったな。
その辺のセキュリティの話は嫌と言うほど各所で議論済みか。
実際の話、どう使われていくんでしょか。
MixinExpressionは
>>880 みたいな用途に使える……よな?
importしたのをコンパイル時にどう行分割したりするのか、俺は全然知らないけど。
MixinDeclarationは、型ジェネレータみたいなのに使えるはず。
MixinStatementは何か、今のままだとヤな感じ。ただその場にコードぶちまけるだけみたいな。
独自のSyntaxSugarを生成したりするのに使えるか……?
テンプレートで、文字列と整数をあれこれいじった後に、 それらを使って宣言や定義や式を組み立てられるように なったのが大きいと思う。
エラー出力が多少は分かりづらくなる危険は……。 mixin( "int hoge = 0;\r\n" "hoge++;\r\n" "writefln(hage);\r\n" // Error: undefined identifier hage ); hoge++の行でエラー、と出力。さすがにこれはズレるかw n行目のmixin内 -> x行目でエラー、みたくエラーメッセージも階層化キボンヌ。
この言語、Perl好きな人が嵌ってたりもするのかな。 なんでもありでおもしろそう。
static switch ってなかったっけ・・・。 static if みたいに使えそうなんで欲しい
それよかdynamicってのが欲しいな。 static{ dynamic if() { }
>>915 間違えて途中で送った・・・。
static{
if()
{
dynamic if(xxx)
{
// 実行時の処理
}
}
>>916 またやっちまった。。。
もう・・・言いたいことをつかんでくれたらうれしいorz
普通のifと何か違うのかな
>>918 staticなブロックの中に普通のifを書き込むってわけ。
staticなブロックで普通にif書いたらstatic ifになるって寸法。
static ブロック内の変数宣言はどうなるの?
流れ無視で申し訳ないんですが、 サクラのレンサバにD言語入れてる人いませんか?
どうせなら隠し引数 _caller とかほしいかも。 void myassert(bool bCond, char[] message=null){ if(! bCond){ /* 独特な処理 */ throw new std.asserterror.AssertError(_caller.file, _caller.line, message); } }
interface Archive でも作ってくれたら嬉しいな
>>914 mixinを駆使して作ればいいよ。
というか気合いれれば普通に作れるんじゃね
ストリームの available ってなんですかね。。。 ソケットストリーム用とかですか? ファイルストリームを全読みこみする時にもこんなことやったほうがいいんでしょか。 ubyte[] buf, tmp; stream.seekSet(0); while (!stream.eof) { tmp.length = stream.available; stream.read(tmp); buf ~= tmp; }
>>914 ,924
914じゃないが書いてみた。
template sswitch(TP...){
static if(TP.length == 1){
}else static if(TP.length == 2){
const char[] sswitch = TP[1];
}else static if(TP[0]==TP[1]){
const char[] sswitch = TP[2];
}else{
const char[] sswitch = sswitch!(TP[0], TP[3..$]);
}
}
void main(){
mixin(sswitch!(
1,
0,"int x=3;",
1,"int x=5;")
);
printf("x = %d\n", x); // x = 5
}
mixin文が使用者に直接見えてるところと
文を文字列で書かないといけないのが嫌だなあ。
927 :
925 :2007/02/07(水) 19:55:58
stream.d読んで解決しますた。リソースの無駄遣いゴメソ
>>927 せっかくだから簡単に結論キボンヌ。
つーかこんなプロパティ気にしたことも無かったw
availableのサイズならreadExactしてもblockingしないことが保証されてるのかな?
929 :
925 :2007/02/07(水) 21:32:49
>>928 availableの結果はストリームの種類によって実装が違うみたいだけど、(当たり前?)
大体は (そのストリームの全体のサイズ - 現在位置) みたい。
実装できないストリーム(ソケットとか)は0を返すみたいです。
>>929 ドキュメントは"現在すぐに読みとれるバイト数を返します。 "だけかぁ。
0は特別扱いとも書いてないし、
つまり「今すぐ全部読めます!」か「全く読めません!」な実装しかないんかい!
ソケットこそ有意な値(受信バッファに溜まってるデータサイズとか)返すべきだと思うけど……
まぁいいや。解説どもでした。
「Dってどんなもんなんだろうなぁ」ってな感じで(そういえばやっと1.000が出たんだっけ) BlowfishをDに移植してみたけど、いやはや、すごいね。 必要なコード量が少ないし、GCのおかげでメモリ管理とか省けるし。
なんかこのスレでDが褒められているのを初めて見た気がするんだ。
Dの出来があまりに良すぎるからもっと良くしようと思って皆が悪い部分を言いまくっているんだよ。
まさにツンデレ
日本語とかでツンツンしてる代わりに 言語仕様ではデレデレ。
Qt使えるようになったらD仕事で使う
Walterタソのアメとムチの使い分けがたまらんな。 D言語はGC、型安全、構造化例外にオブジェクト指向にメタプログラミングまでサポート。 思うようにすらすら書けて、なお生成されるのは軽量なネイティブexe、とどめにコンパイル爆速。 代わりにphobosの設計改善ほったらかしたり、 外部プログラムにまで平然とUTF-8で話しかけたり、 配列リテラルの仕様が何か変だったり、 連想配列のリテラルをついおねだりしちゃったり。 全く、変な趣味に目覚めてしまったらどうしてくれるんだWalter。
もう今のPhobosを過去の産物として、 ウォルタータンが独自にDeimosとか、 現在のPhobosを旧Phobosとした新Phobosでも作るかした方が良いよ
相変わらずD言語はダメダメですね(・∀・)ニヤニヤ
転んでも泣かない2ちゃんねらーには最高の仕様だろw
void main() { mixin(import(__FILE__)); } これワロタ
こんなalias便利そう alias printf("[%s:%d] %.*s", __FILE__, __LINE__, ..) print_debug; print_debug("hoge"); // -> printf("[%s:%d] %.*s", __FILE__, __LINE__, "hoge") え?C?ナニソレ ていうか__LINE__とか__FILE__ってのぁプリプロセッサがなくなった今、98%くらい使われてないんじゃねーの。 かと言ってプリプロセッサ自体はいらんし・・・ ってわけで。言語レベルでboostのbind(?)みたいなこと出来たら嬉しいなと。
オレ的には
>>922 みたいにCallInfoなんてのが欲しいかな
mainをルートに呼び出し元の位置や関数名を辿ってデバッグしたい
あーそうそう、unittestの仕様ももーちょい改善してほしい項目だな……。
もーちょっとこう、拡張可能というか、
assert以外で落ちた時、全然発生場所が分からんというか。
デバッグ時には詳細なスタックトレース出すのを標準化してくれれば最高なんだが。
>>563 とかの有志によるハックはまだ動くのだろうか。
リリース時にも有効なassertがあればデバッグ処理は全てassertに委ねられるのに。
それって例外でよくね?
>>945 C/C++での話だけど、俺は標準のassertとは別に
リリース版用の自作assertでエラー処理の一部をやってる。
あまくで一部であって、全部をそれでやろうとするのはナンセンスだと思う。
要は行番号とかが勝手に一緒に乗せられて例外を投げてさらにリリース時にもコードがしっかり残るような物が欲しいんだろ・・・
そんなときこそmixinをつかうべ。 import std.asserterror; template myassert_(char[]file,int line){ void f(Expr)(Expr e){if(!e)throw new AssertError(file,line);} void f(Expr,MSG)(Expr e,MSG msg){if(!e)throw new AssertError(file,line,msg);} } const char[]myassert = "myassert_!(__FILE__,__LINE__).f"; void main(){ int x = 1; (mixin(myassert))(x == 0 ,"hoge"); } うーん、微妙。mixinがウザイなぁしかも()がいる辺り文法破綻気味な気が。
ところで、そもそもassertはエラー処理じゃない、と言いたい俺。 アレは「表明」であって、実行可能なコードによるドキュメンテーションなんだ。 このcreateHogeObj()はnullを返すことはありません、みたいに使うんだ。 alertみたいな警告っぽいニュアンスは無いんだ。 サポートの仕方がショボすぎる言語ばっかだけど……。 in/outに書いたassertとか、 自動生成されたドキュメントに出てくるようにすべきだと思うんだよね…… dmdの-Dオプションしか試してないけど。
乙>952 でも、テーブルにしないほうがいいんじゃない?
> in/outに書いたassertとか、 あ、俺も今そう思う
955 :
886 :2007/02/08(木) 23:26:44
>>952 言い出しっぺの俺がこんな事言うのも、非常にアレなのだけども。
普通にDでXML->Dのトランスレータ書いて
ビルドプロセスに組み込んだりした方が遙かにシンプルだなぁ、と今は思う。
むしろDコンパイラにプラグイン機構を盛り込むとかすれば
もっとスマートに
>>886 出来て面白そうだなーとか妄想したりして。
ん? .NetのXAMLとかって、ひょっとしてそういう技術なんだろうか。
でもそのコードはそれはそれで乙。
D言語って仕様の策定には興味無さ杉でワロタ こんなんじゃ言語使用互換コンパイラなんてできないだろうなwwwwww
C99ですら碌に規格を満足するコンパイラがないんだ。気にすることじゃない
つか、D1.000になったんなら alias bool bit; なくせよう
そういえば1.0なのにdeprecatedが結構残ってる罠w
1.0はdeprecatedを無くす良い機会だと思ってた
charも不要
intイラネ これからはinpo
2.0になったときを夢想すると、 ・現在のdeprecated指定消滅。 ・というか、Phobos消滅 ・ついでにchar, wchar, dchar消滅 ってかんじか?いきなり消滅もなんだから、deprecatedでもつけるのがいいか?
>>964 ぼけーっと眺めるの好きだからPhobosはバージョンアップ繰り返して残しておいて欲しいな
>>954 ふと気になってdmd/src/phobs/std以下をgrep "body"してみたら約100個。
もったいないよな、これ……。
文字列の扱いに関しては、なんだか意見が分散してそうだな。
俺はとてもStringクラス化して欲しい。
D言語は「1文字」の実装を外に露出しすぎな感じ。
DFLのところのdstringはどうなのかなあ
>>967 文字列リテラルに c,w,dとかの
postfixが必要なのがちょっと面倒。
後、startsWithやendsWithでlengthプロパティそのまま使ってるので
内部の文字表現と引数の型が違った場合に正常動作しない.
Stringクラスいらんわ。うんこ。 てか、クラスにする利点が分からん。 文字の配列のなにがいかんの。
D言語内、プログラム内で使う分には、これ以上抽象化する必要はないよね。 外側の環境の文字をStringとして抽象化することを考えた場合、 D言語内の基本的な文字(列)型もStringとすると、プログラムと 外側の環境との境界をあまり意識する必要がなくなる、という のが利点なのかな。 外側の環境といったって、単一プログラム内で複数の異なる 文字コードに触れる場合もあるから、そこで結局エンコード 指定するなら(|w|d)charを変換するのと変わらん気もするけど。 今は文字列をコンパイル時定数として扱えるけど、文字列をクラスにする場合は、 コンパイル時クラスインスタンス定数というようなものを導入して、 それをテンプレートの値引数として使えるようになるのかなあ。 でも、テンプレートであーだこーだする場合に、文字コードが型固定じゃないと できることが減りそう。別の文字が同一文字とみなされるとか、そういういざこざ を持ち込むことになりそうだし。 それとも、文字コードは今までどおり決めうちで、なんかとりあえずStringクラス として抽象化しよう、ということなのかな。そうすると利点は分からん。
そもそもDbCな人… ってか Bertrand Meyer に言わせれば 表明はリリース時にも残しておくべきものであり消すのは論外 って話だと思うんで消えなきゃいいんじゃないかね?
RubyのERB見てて思ったんだけど、1.005で追加されたmixinとimportは、 もしかしてそういうものを実装することを想定したものなのかな。 なんかをDコードに変換するというよりは、Dコード以外のテキストに 埋め込まれたDコードをごにょごにょしたテキストを生成する、というような。
vim の syntax ある?
975 :
952 :2007/02/09(金) 21:46:00
std.stringとstd.convも一部メタ化してみた。 で、これでなんか作ろうと思ったけど、テンプレートの仕様が貧弱すぎて できんかった。(泣)結局無駄骨です。 スレ汚してすいません。
import std.stdio; class A { this(int x = 0) { m_x = x; } private int m_x; } void main() { A a = new A; writefln(a.m_x); } これが通っちゃうんだけど、いいのか?
>>976 同じファイル内ではprivateにもアクセスできる。
friend
Stringをクラス化して何して欲しいかって、マルチバイト処理の隠蔽なのです。 ASCII圏の人々が、自分でも知らないうちに多言語対応してた、て事を実現したい。 何気なく文字列を扱おうと思ったとき、多分誰だって自然とchar型を選択するだろうと思うんですよ。 テキストエディタみたいな文字列処理特化アプリを書こう!と意気込んでる時でもない限り。 で、特にASCII圏の人は、単純に「2文字目を取り出したい」と思ったら、自然とstr[1]と書くわけですよ。 これが「1バイト目」へのアクセスに過ぎないとたとえ知っていても、それ考えるのは後にして、とか思って。 つーかウチら日本人でも書きたいですよ。こんな当たり前のコード。 んでお約束として、後になったって書き直される事なくリリースされるわけですよ。 当然strに"あいう"って入ったら速攻Error: 4invalide UTF-8 sequence。関係ないけどこの4て何だろ。 最初からstrがオブジェクトなら、str[1]は”2文字目”、str.lengthも”文字数”に抽象化できる。 UTF-8が文字列の基礎というDの現状を考えると、クラス化して生のバイト列を隠蔽してやるべきだと思う。
行番号。 2バイト文字対応なchar型が出ると涙が出てくるのに。
次スレ頼んだ
>>982 wcharとかdcharとかじゃだめなのか?
配列はremoveやらinsertやらが無いし、 C++のvectorみたいなのも標準じゃないし、 C++より劣っているね。
int foo(int hoge) { ... } foo = 2; // foo(2); になる プロパティじゃなくてもこうなるんだけど、 正直これってどうなんだろうな。
プロパティとの明確な区別が無いから今のところはしょうがない
1バイト圏の人が好んでwcharやらを使うわけが無い。 ってか、char廃止とかしたらおもしろそうなんだけど。
import std.stdio; template apply(Ret, Args...) { Ret apply(Ret function(Args) func, Args args) { return func(args); } } template Tuple(T...) { alias T Tuple; } int add(Tuple!(int, int) x) { return x[0] + x[1]; } void main() { writefln(apply(&add, Tuple!(1, 2))); } うーむ。タプルが必要になるのはあまりエレガントではないなあ。
適当にString構造体は作ってるけどな
poseidon復活したようやね
0.22は2ヶ月前に出ててそこから動き無しか。
import std.stdio, std.stream, std.socket, std.socketstream; void main() { char[] buf = new char[16]; Socket sock = new TcpSocket(new InternetAddress("somewhere", 80)); Stream s = new SocketStream(sock); s.writeLine("GET / HTTP/1.0"); s.writeLine(""); s.read(buf); } これを実行するとメモリ使用量がとんでもないことになるんだけどなぜなんだぜ? なぜか s.writeLine(""); を消すとなんともない 使用してるのは DMD v1.005 で Win2k SP4
996 :
995 :2007/02/10(土) 20:39:51
すまんかった void read(out char[] s)が呼ばれて鯖から返って来た"HTTP/1.1 200 OK"のHTTPが 長さ0x80848472と認識されてメモリを確保しにいってたのか orz
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。