[Anthy-dev 2712] Re: コードの抽象化 (was: to 太田さん )

アーカイブの一覧に戻る

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*****
-------------------------------------------------


Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る