Scheme処理系作ってるんですが、タグの振りかたでなやんでます。
下位3ビットをタグとすると8つ区別できますよね。
その他即値、その他非即値、ペア、即値整数 あたりは確定だと思います。
あと4つなんですがクロージャ、非即値数、シンボル、ベクタ、継続辺りが候補です。
クロージャを即値にすると扱える環境やコードの量に限界ができるというデメリット
もあるのですが、メモリ使わないのは嬉しいのでできれば即値にしたいです。
非即値数は巨大整数、分数、浮動小数あたりを扱いたいのですが、GMPでは
mpz_tが12, mpq_tが24, mpf_t が16バイトです。8バイトにアライメントすると
mpz_tは4バイト余るのでそこをタグにできると思うんですが、他の二つは無駄が増える
のでちょっと悲しいです(ところで typedef __mpf_struct MP_FLOAT; がコメントアウト
されてるのが何故だか知ってる人いますか?)。
シンボルは string->symbolさえ無ければ3ビットのタグを与える必要もないのですが
GCのこと考えるとやむないのかもしれません。
GCで、なんとなく他のオブジェクトを指してるやつをアライメントで判別した方が
よい気がするのでベクタ、継続が候補に上がります(まだM&SかCopyか決めてません)。
どちらかといえば数値計算回りを高速化したいです。
なにかアドバイスあればお願いします。