Kazuki Ohta
mover****@hct*****
2005年 12月 15日 (木) 10:11:54 JST
太田です。 > 色々と目につく点がありますが、とりあえずcommitしちゃってください。 > 順次議論を進めながら改訂していきましょう。 了解です。 > まず最初に、'tag'という用語の位置付けが私と食い違っているようで > す。以下のマクロ等で使われている'TAG_VALUE'という語は何を指して > いますか? > > #define SCM_OTHERS_CDR_TAG_WIDTH_SYMBOL > SCM_OTHERS_CDR_PRIMARY_TAG_WIDTH #define > SCM_OTHERS_CDR_TAG_OFFSET_SYMBOL > SCM_OTHERS_CDR_PRIMARY_TAG_OFFSET #define > SCM_OTHERS_CDR_TAG_VALUE_OFFSET_SYMBOL > SCM_OTHERS_CDR_PRIMARY_VALUE_OFFSET #define > SCM_OTHERS_CDR_TAG_VALUE_MASK_SYMBOL (~0U << > SCM_OTHERS_CDR_TAG_VALUE_OFFSET_SYMBOL) 'tagの上位bitを占めているvalue'という意味ですが、分かり辛いですね。んで、 改善案を考えていたのですが、そもそもこうやってタイプ毎に mask や offset を 作るのは冗長な気がします。 考えてみると、結局アクセスする際には"タグの除去 (strip操作)"だけが有れば 十分な気がしました。そこで次のようなインターフェースを考えてみたんですが、ど うでしょう? primary tag や ext tag 等が露呈してしまいますが、操作がかなり 直感的になっています。 #define SCM_SYMBOL_VCELL(a) \ ((ScmObj)(SCM_STRIP_GCBIT(SCM_CELL_CAR(a)))) #define SCM_SYMBOL_NAME(a) \ ((char*) (SCM_STRIP_OTHERS_CDR_PRIMARY_TAG(a))) #define SCM_SYMBOL_SET_VCELL(a, vcell) \ (SCM_SET_CELL_CAR((a), \ (SCM_STRIP_GCBIT(vcell) | SCM_GCBIT(SCM_CELL_CAR(a))))) #define SCM_SYMBOL_SET_NAME(a, name) \ (SCM_SET_CELL_CDR((a), \ (SCM_CAST_UINT(name) |SCM_OTHERS_CDR_PRIMARY_TAG_SYMBOL))) ちなみに元のだとこうなります。 #define SCM_SYMBOL_VCELL(a) \ ((ScmObj)(SCM_STRIP_GCBIT(SCM_CELL_CAR(a)))) #define SCM_SYMBOL_NAME(a) \ ((char*)(SCM_CAST_UINT(SCM_CELL_CDR(a)) & SCM_OTHERS_CDR_TAG_VALUE_MASK_SYMBOL)) #define SCM_SYMBOL_SET_VCELL(a, vcell) \ SCM_SET_CELL_CAR((a), (SCM_STRIP_GCBIT(vcell) | SCM_GCBIT(SCM_CELL_CAR(a)))) #define SCM_SYMBOL_SET_NAME(a, name) \ SCM_SET_CELL_CDR((a), (SCM_CAST_UINT(name) | (SCM_CAST_UINT(SCM_CELL_CDR(a)) & ~SCM_OTHERS_CDR_TAG_VALUE_MASK_SYMBOL))) > > (1) C_FUNC_POINTER型を何故作らないのか? > > reservedを一つ消費してC_FUNC_POINTER型を作るとC_POINTER型と > > の混同が無くなると思うのですが。マクロ実装時に reserved 領域が二つ > > 必要? > > 単に領域がもったいないと思っただけです。内部表現が違うだけでユー > ザにはC_FUNC_POINTERとC_POINTERは別々の型として提供されますよ。 いや、内部表現 C_POINTER が 外部表現 C_POINTER と C_FUNC_POINTER を内包していて、Name Violationが起きるのが気持ち悪いなぁと。内部的に1つの 型に押し込むならば内部表現のC_POINTERという名前は変えたいですね。 > > そもそも C_FUNC_POINTER と C_POINTER の区別を S->cdr の 7bit 目 > > で行っているのは正しいのか? > > 何か問題になりましたっけ? 余ってるslotのvalueフィールドに型IDを > 設定しただけだったと思いますが。 あぁ、'ID'をセットしたかったんですね。と云う事は内部表現C_POINTER型には C_POINTERやC_FUNCPOINTER以外の pointer も将来的に格納できる余地 を残したいという事でしょうか? > > (2) STRIP_GCBIT > > GC phase 以外では GCBIT は常に 0 なので、STRIP_GCBITは効率を下 > > げるだけ。なので、安定動作を確保した後にGC phase用に同じ accessor > > を色々用意したい。以下のようにマクロの名前を分けようと思っているが、他 > > に何か良い方法は無いだろうか? > > > > 例 > > #define SCM_CAR(a) \ > > その隠蔽に意義はありますか? > > GCまわりのコードが直にSTRIP_GCBIT(CAR(obj))と書いた方が操作の意 > 味の明示からもメンテナンス性からもよいような気がします。 > > 多重継承とobject compositionの関係に似ていますが、2つの機能を組 > み合わせたものを作る場合は、逆に概念を複雑化させてないかどうかの > 見極めが大事だと思います。 compact,h 内で完結させよう、させようという気が働いていました。 確かにそちらの方が明示的ですね。 ------------------------------------------------- Kazuki Ohta : mover****@hct***** -------------------------------------------------