everything converges to D
久々にD言語のバージョンアップをして、ちょっと試し書きをしてみる。まず、簡単に:
#!/opt/dmd/dmd/bin/dmd -run import std.cstream; int main(char[][] arg) { char[] str; str = "Hello D world!" \n "and once more!"; dout.writefln(str); return 0; } // EOF
./hello.d (等) で実行。オブジェクト指向的に一番綺麗で、更に使いやすいのはなのは、std.cstream の dout、din、derr の writef() や writefln() をつかうことかな? writeString() のほうが美しいことは美しいが、toString() しないといけないのがだめっす。
ポインタとプロパティ
のテスト === 演算子は deprecated なんだってさ。is を使うらしい。
#!/opt/dmd/dmd/bin/dmd -run import std.cstream; int main(char[][] args) { A a; dout.writefln(a is null); // a はまだ null a = new A; dout.writefln(a is null); // a はもう null じゃない a.str = "bye"; dout.writefln(a.str); return 0; } class A { private { char[] str_; } public { this() { str_ = "hello" \n; } void str(in char[] value) { str_ = value; } char[] str() { return str_; } } } // EOF
プロパティの書き方、もう少し簡単にならないものかなあ。
そういえば、型推論が出来てたんだっけか
#!/opt/dmd/dmd/bin/dmd -run import std.cstream; int main(char[][] args) { auto a = new A; a.str = "bye"; dout.writefln(a.str); return 0; } class A { private { char[] str_; } public { this() { str_ = "hello" \n; } void str(in char[] value) { str_ = value; } char[] str() { return str_; } } } // EOF
便利便利。
一介のSmalltalkerに御座る
ので、Smalltalkでも書いてみよう。GNU Smalltalk 用:
Object subclass: #A instanceVariableNames: 'str' classVariableNames: '' poolDictionaries: '' category: 'ACategory'. ! !A class methodsFor: 'creation'! new ^super new str: 'hello'. ! ! !A methodsFor: 'accessing'! str ^str. ! str: value str := value. ! ! |a| a := A new. a str: 'bye'. stdout display: a str; nl. ! "EOF"
どちらが分かりやすいですか?
覚書
ガベージコレクションの実装について調べたい。