Top / Alan言語仕様 / クラス定義

クラス定義

文法: class定義 ::= class ID [ [ID列] ] { メンバ変数定義 | メンバ関数定義 }+ end
# 基本形
class Point
  int: x, y
end

Point: p
p.x = 3; p.y = 4;
put(p, "\n")        # デフォルトメソッド Point.put(stdout) が呼ばれます。

#----------------------------------------------
# メンバ関数、コンストラクタ、デストラクタ
class Address_book
  str:  name, zip, address

  init(str: n, z, a)  # コンストラクタ
    name    = n
    zip     = z
    address = a
  end

  term()              # デストラクタ
    putf("Address_book.term(): % for % is deleted\n", address, name)
  end

  void: show()        # メンバ関数
    putf("% % %\n", name, zip, address)
  end
end

Address_book: a = ("Wells", "000-000", "Japan, Okinawa")
a.show

#----------------------------------------------
# 総称型
class Complex[T]
  T: re, im

  # v0.31 では、メンバ関数内で T は使えません。orz
end

Complex[int]: c
c.re = 3
c.im = 4
put(c)

  1. 基本的に C++ のクラスに沿っています。 つまり、メンバデータ、メンバ関数、コンストラクタ/デストラクタから成ります。

  2. コンストラクタ
    文法: コンストラクタ ::= init(引数) {}+ end
    (クラス定義の例を参照)
    関数名は予約語の init です。 また、普通のユーザ定義関数と異なり、戻り値を指定しません。

    C++ コンストラクタと大体同じです。変数定義式において、暗黙に呼ばれます。

  3. デストラクタ
    文法: デストラクタ ::= term() {}+ end
    (クラス定義の例を参照)
    関数名は予約語の term です。 また、普通のユーザ定義関数と異なり、戻り値を指定しません。

    C++ デストラクタと大体同じです。スコープの終了時に暗黙に呼ばれます。

制約

目指すところは総称型 + オブジェクト指向(特に多重継承) ですが、現在は以下の制約があります:
  1. オブジェクト指向にはまだ対応できていません。
  2. メンバ関数内で型パラメータの変数を定義(宣言)できません。orz
  3. private などの情報隠蔽はまだです。

Top / Alan言語仕様 / クラス定義





Alan ver0.31