YamaKen
yamak****@bp*****
2005年 12月 17日 (土) 12:06:54 JST
At Sat, 17 Dec 2005 11:04:27 +0900, mover****@hct***** wrote: > > > 確かにSymbolだけを見れば綺麗です。それは認めます、はい。しかしですよ、String や > > > CFunc、Pointer、Int等はこの抽象化の範疇に収まりきらず、かなり複雑な操作になっ > > > てしまいます。結局下の層の中身を見てしまいますよね? > > > > いや綺麗に収まる事を期待しちゃってるんですけど、下の方の層を書い > > ただけなんで問題を把握できてません。具体例出してもらえますか? なるほど、色々ありますね。「結局下の層の中身を見てしまう」の部分 が、場合によりbit幅やoffsetを参照する必要があるという意味ならそ れはそうです。ただし、その参照はあくまでも統一された形式の抽象的 なシンボルを通して行われるだけで、直接「tagが5bitで…」とか考え る事はありません。 もちろんエンコーディング形式を決める時には直接bit数を認識してい るわけですが、一旦それが格納可能な事がわかった後は何が何bitかと いった情報は隠蔽して楽にコードを扱えるようにしたいわけです。実際 この前までcompact representaionの詳細はきれいさっぱり忘れてまし たが、r1857のコードを読んだらすらすらと思い出せました。 > まず、Stringについては immutable or mutable flag を 1 bit だけ car の2 > bit目に確保しています。 valueフィールドをさらに2つに分割して使う事になりますね。下層のイ ンタフェイスに対して出し入れするvalueがpacked形式になっただけの 話です。 そして、flagをエンコーディングするbit位置は「2bit目に…」といっ た直接的な構成を意識する事なく、valueのLSBとだけ認識していれば bit幅が足りている限りは下層の構成を無視できます。 > Pointerについては、alignedなポインタが入ってくるとは限らないので、LSB > だけを cdr の一部に退避させる必要があります。(carのLSBはGC bitに使 > われています) これも同様。「LSBだけをcarに…」ではなく、「cdrのvalue幅から溢れ た分をcarのvalueに格納」とすれば下層の構成を無視できます。 > 。int については符号を意識する必要があります(そういえば井上さんが案を > 出してくれたのまだ見てないや...)。 これも取り出したvalueをどうshiftするかの問題であって、出し入れの 手順については抽象化されてた方がいいんじゃないでしょうか。 > > それと、単に記述を短かくするのではなく「タグ幅に関係なくvalueを > > 読み書き」という単純な概念に抽象化する事を重視しているつもりです。 > なるほど、これはかなり成功していますが、やはり例外が気になりますね。 ------------------------------- ヤマケン yamak****@bp*****