C言語でオブジェクト指向

C言語オブジェクト指向っぽくプログラミングする為の方法論とかライブラリとかは既にいろいろありますが、効率とか実装の綺麗さとかを無視してとことんやったらどこまでできるかとふと思い、書き始めました。型の解決などは当然実行時にします。
C++Rubyの実装を真剣に勉強する気力はないのでかなり我流で。

現在までの成果は多態。GCは未実装(というか考え中)なのでメモリリークしてます。
http://mad-projects.iobb.net/svn/cros/

#include "numeric.h"
#include "string.h"
#include "nil.h"

int
main()
{
  P(nil);
  P(FixnumNew(100));
  P(StringNew("Hello"));
  P(StringNew2("100 = %d", 100));
  return 0;
}

出力

nil
100
Hello
100 = 100

これからエラー処理とか型チェックとか例外処理とか継承とか実装していこうと思いますが、一番問題なのがガベージコレクション
基本的にはBoehmみたいにすればいいのだと思うけれど、違うやり方は無いかと思い考え中。
スコープの切り替わりの瞬間を何とか補足する方法はないかと考えていますが、コンパイラに頼らずにやるのは難しそうな気がしてます。スタックポインタなどを定期的に読むとかではどうだろう...??

[追記] リストも実装してみた

#include "numeric.h"
#include "string.h"
#include "nil.h"
#include "list.h"

int
main()
{
  Object list = ListNew();

  ListAppend(&list, FixnumNew(100));
  ListAppend(&list, FixnumNew(500));
  ListAppend(&list, StringNew("Hello"));
  ListAppend(&list, FixnumNew(1000));

  Puts(list);

  return 0;
}

出力

100500Hello1000

List.ToSの実装とかめちゃくちゃ非効率だけれど見た目はだいぶオブジェクト指向っぽくなってきた。そろそろGCをやってみよう。