YamaKen
yamak****@bp*****
2005年 10月 14日 (金) 07:51:04 JST
ヤマケンです。開発おつかれです。 At Thu, 13 Oct 2005 13:25:07 -0700, jun.l****@gmail***** wrote: > > On Fri, 14 Oct 2005 03:16:46 +0900 > Kazuki Ohta <mover****@hct*****> wrote: > > > [ 変更点その1 ] > > まず、即値(immediate value)の部分です。char型はポインタを一つ持っているだけですが、 > > アラインメントの関係上(mallocは8byteにアラインメントされたメモリアドレスを返す)ので、下 > > 位4ビットを占有出来ません。そこでCharだけを特別扱いしています。 > > また、なるべくintegerの取れるビット数を増やしたいと思い、Integerも特別扱いしています。 charは数値として扱いましょう。R5RSがchar->integer, integer->char が可能な事を仮定してるので。 > Other types に押し込んでもいいでしょうけど、Unicode 系を全部 UCS-4 に > べったり符号化したものに canonicalize すると即値にもできます。Emacs の > src のどっかに "RMS によれば世界中の文字をあらわすには 22 bits いるかも > しれないので数 bit 予約云々" とあったので、24 あれば相当先まで大丈夫で > しょう。元がどの符号化方式だったかの管理はハナから schemer に押しつけて > るので無問題。 値のエンコーディングは各character codecまかせという事でcanonical な内部形式まではSigSchemeで規定しなくてもよいと思います(少なくと も現時点では)。同一codecを使う限り数値及び文字列との変換で情報の 欠落や変質が無い事さえ保証されてれば。 > > [ 変更点その2 ] > > 次にその他(other types)の部分です。Symbol, Continuationは共にポインタを2つ抱えてい > > る為、これもまたアラインメントの関係から特別視しています。 > > String->len, Vector->len, Port->type等はint型なので、S-Yに無理矢理押し込めようと > > 思っています。 > > ちゃんと見てないので間違ってるかもしれませんが、継続の pointer の一方は > jmpbuf の横に置いておけばいいのでは? > > ScmObj Scm_CallWithCurrentContinuation(ScmObj proc, ScmEvalState *eval_state) > { > struct { > jmp_buf state; > void *opaque; > } env; > ScmObj cont = SCM_FALSE; > ScmObj ret = SCM_FALSE; > ... > } これでOKです。 上記の事情を踏まえて以下のようなフォーマットはどうでしょう。 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) ------------------------------ S->Y of Others O Type content of O ........|001 : Symbol : vcell ........|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) ・定数はeq?さえできればOKなので即値向けの専用の型は作らない ・NULL|tagによく使う定数をエンコード。大抵のアーキテクチャで immediate operandに収まる事を期待。CONSP等にNULLチェックが必要 になるけどそこは妥協 ・#t, EOF, UndefはOthersに押し込める ・#fは効率のため0にエンコード (重要) ・CONSTANTPを効率化するためint, charの即値は11Gに変更 ・UnboundはSCM_INVALIDとしても使う ・こいつらは定数ではなく普通のsyntaxやsymbolとして扱う - Quote - Quasiquote - Unquote - UnquoteSplicing ------------------------------- ヤマケン yamak****@bp*****