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"

どちらが分かりやすいですか?

覚書

ガベージコレクションの実装について調べたい。