D言語のメモ
DMD v2.018をベースに書いています。
配列スライスではコピーされない
import std.stdio;
void main(){
auto a="aaa".dup;
auto b = a[1..$];
b[0] = 'b';
writefln(a); // 'aba'が表示される
}
連想配列を関数から返せない
連想配列を関数から返せない
???
import std.stdio;
void main(){
writefln(typeid(typeof(['f','o','o'])));
char[3] a = ['f','o','o'];
//string b = a; // error
string c = (['f','o','o']); // ok
}
invariantな配列も静的配列には代入可能?
import std.stdio;
void main(){
string a = "test";
char[4] b = "test";
char[4] c = a;
auto d = "test";
writefln(typeid(typeof(a))); // invariant(char)[]
writefln(typeid(typeof(b))); // char[4]
writefln(typeid(typeof(c))); // char[4]
writefln(typeid(typeof(d))); // invariant(invariant(char)[4])
}
char[]とinvariant(char)[]の連結ではchar[]が返される
import std.stdio;
void main(){
string a = "test";
char[4] b = "test";
writefln(typeid(typeof(a~b))); // char[]
writefln(typeid(typeof(b~a))); // char[]
// string c = a~b; // error
writefln(typeid(typeof(a~=b))); // invariant(char)[]
writefln(typeid(typeof(a~a))); // invariant(char)[]
}
foreach_rangeはポインタにも使える
import std.stdio;
void main(){
auto a = [1,2,3,4,5,6,7,8,9];
foreach(i;&a[0]..&a[$-1]+1)writefln(*i);
}
forの最初の部分には色々入れられる
import std.stdio;
void main(){
for(for(int i;i<10;i++){writefln("test");} false; ) {}
for(pragma(msg,"test");false;){}
for(mixin("int i;");i<10;i++){}
for(return;false; ) {}
}
thisはクラス型のポインタと同じ
class Foo{
void* getthis(){
return cast(void*)this;
}
}
void main(){
auto a = new Foo();
printf("%p %p\n", a.getthis(), cast(void*)a); // 同じ
}
タプルの代入が可能
import std.typetuple, std.stdio;
void main(){
TypeTuple!(int, int) a;
a = TypeTuple!(0, 10);
writefln(a[0], ", ", a[1]);
}
TODO
- __dollar
- _ctor/_dtor
- templateとextern(C)
- ラベルがIdentifierじゃない件
- タプルのinitが簡単に取れない件
- ファイルがあるかどうかの確認(is(typeof(import()
- テンプレートの引数に色々と使えない件