Jun Inoue
jun.l****@gmail*****
2005年 10月 14日 (金) 08:59:59 JST
On Fri, 14 Oct 2005 07:51:04 +0900 YamaKen <yamak****@bp*****> wrote: > S Type > 0000000|00G : #f (S = 0) > .......|00G : Cons > ------------------------------ > 0000000|01G : () (S = 0) > .......|01G : Closure > ------------------------------ > 0000000|10G : Unbound (S = 0) > .......|10G : Others > ------------------------------ > ......0|11G : Integer (imm) > ------------------------------ > ......1|11G : Char (imm) > ------------------------------ ここを .......0|11G : Integer (imm) ......01|11G : Const (imm) ......11|11G : Char (imm) とすれば、#f, (), unbound, #t, EOF, undef その他入れたければ 128M 種類が 即値に入ります。int の表現範囲も犠牲になりません。 > S->Y of Others > O Type content of O > ........|001 : Symbol : vcell string name でないといけません。Others の定義は S->Y が ScmObj の convention に縛られない、です。 > ........|011 : String : string length > ........|101 : Vector : vector length > .....|000111 : Values : unused, all 0 (for efficiency) > .....|001111 : Func : ScmFuncTypeCode > .....|010111 : Port : ScmPortDirection > .....|011111 : Continuation : unused, all 0 > .....|100111 : C Pointer : pointer type (0 = void *, 1 = ScmFuncType) この ScmFuncType というのは? sizeof(function pointer) != sizeof(object pointer) への対策でしょうか。でもこういう platform は今でも使われてるん ですか? C99-rationale には PDP-11 がどうとか書いてあった気がしますが。 ;; 何々 pointer というのは C 規格 level での用語の意味。 > .....|101111 : Reserved > .....|110111 : Special Constant : constant ID > 1 : #t > 2 : EOF > 3 : Undef > .....|111111 : FreeCell : unused, all 1 (for efficiency) > > > ・定数はeq?さえできればOKなので即値向けの専用の型は作らない > > ・NULL|tagによく使う定数をエンコード。大抵のアーキテクチャで > immediate operandに収まる事を期待。CONSP等にNULLチェックが必要 > になるけどそこは妥協 > > ・#t, EOF, UndefはOthersに押し込める > > ・#fは効率のため0にエンコード (重要) 何故? >NULL|tag, #f==0 CONSP() が多いので code size は増えそうな気がしますが? というか↑のように して他の即値と一緒に入れましょうよ。 > ・UnboundはSCM_INVALIDとしても使う そうそう、最初 SCM_INVALID を導入したときに choose an appropriate value と書いたのは UNBOUND にするかどうするかというつもりだったんですが、忘れ てました。即値の空間が有り余ってるので、少なくとも debug 中は別物にした 方がいいと思います。Scheme level でバグってるのか C level なのか見分けが つきますし。 > ・こいつらは定数ではなく普通のsyntaxやsymbolとして扱う > > - Quote > - Quasiquote > - Unquote > - UnquoteSplicing そういや symbol 回りを独立させるとかいう話はどうなったのかなー…なんて 言ってみたり とりあえずまとめ: こんなんでどうですか。 S Type .......|00G : Cons ------------------------------ .......|01G : Closure ------------------------------ .......|10G : Other ------------------------------ ......0|11G : Integer (imm) .....01|11G : Char (imm) .....11|11G : Constant (imm) ------------------------------ Constants (showing only (unsigned)S >> 5) 0: INVALID 1: UNBOUND 2: FALSE 3: TRUE 4: NULL () 5: EOF S->Y of Others O Type content of O ........|001 : Symbol : symbol name ........|011 : String : string length ........|101 : Vector : vector length .....|000111 : Values : unused, all 0 (for efficiency) .....|001111 : Func : ScmFuncTypeCode .....|010111 : Port : ScmPortDirection .....|011111 : Continuation : unused, all 0 .....|100111 : C Pointer : pointer type (0 = void *, 1 = ScmFuncType) .....|101111 : Reserved .....|110111 : Special Constant : constant ID 1 : #t 2 : EOF 3 : Undef .....|111111 : FreeCell : unused, all 1 (for efficiency) -- Jun Inoue jun.l****@gmail*****