...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

interfaceにDbC

架空のコードです.

interface I
{
  void f() in { assert(g()==1); } out { assert(g()==2); } // 最後に ; 必要か?
  int g();
  invariant() { assert(g()==1 || g()==2); }
}
class C : I
{
  int v;
  void f() // I の in と out を継承
  {
    v = (v==1 ? 2 : 1);
  }
  int g() { return v; }
  // I の invariant を継承
}
void main()
{
  I x = new C;
}

interface の in/out/invariant には関数呼び出ししか書けないのでいまいち使い勝手がよくない気がしてきた.
でもあれば役に立つのかな?

課題

  • C にも in/out/invariant が定義されたらどうする?
    • 上書きは契約を変えられることになるのでダメ
    • 関数の実装が複数の in/out/invariant を持てるように dmd を改造する必要がある
      • parse.c:parseContracts()とか・・・
  • invariant()ではpublic/exportな関数は呼び出せないとされている.なぜ?