1.1.3 data
Next: Allocation classes,Previous: Rest of header,Up: SEXPs
1.1.3 `data'
SEXPREC 是一种 C 结构。它包括一个 32 位的如上所述的头字节,三个指针(指向属性,前后节点)和一个用联合(union)表示的节点数据
union {
struct primsxp_struct primsxp;
struct symsxp_struct symsxp;
struct listsxp_struct listsxp;
struct envsxp_struct envsxp;
struct closxp_struct closxp;
struct promsxp_struct promsxp;
} u;
所有这些可选对象(除了第一个,它是int)是三个指针,因此一个联合占用了三个词(three words)。
向量类型有 RAWSXP,CHARSXP, LGLSXP,INTSXP, REALSXP, CPLXSXP, STRSXP,VECSXP, EXPRSXP 和 WEAKREFSXP。需要明白的是,这些类型都是 VECTOR_SEXPREC,每一个都含有头字节和同样的三个指针,但随后的两个整数给出向量的长度和`事实长度'(`true length')1,而后是数据(根据需要排列:在大多数32位系统中,数据通过 24 字节的VECTOR_SEXPREC 节点直接连在节点后面)。数据是以适当长度存储`事实长度'的元素的内存块(大约是8字节的倍数,通过在 gc() 的档案记录的8字节块的`Vcells'存储 )。
不同类型的`data'(数据)在下面的表中列出。许多类型是解释型的(interpretation),即这些类型不需要校验。
NILSXP- 只有类型
NILSXP的一种对象R_NilValue没有数据。 SYMSXP- 通过
PRINTNAME(一种CHARSXP),SYMVALUE和INTERNAL访问三个节点,名字,值和内部结构的指针。(如果符号的值是一个.Internal函数,最后一个则是一个指向适当SEXPREC的指针。)许多符号有SYMVALUER_UnboundValue。 LISTSXP- 指向 CAR, CDR (通常是
LISTSXP或NULL)和 TAG(通常是SYMSXP)的指针. CLOSXP- 指向形式参数(formals,一个成对列表),内容和环境的指针。
ENVSXP- 指向框架,闭包环境和哈希表(
NULL或VECSXP)的指针。框架指的是一个标记过的成对列表(标签是符号,CAR是绑定的值)。 PROMSXP- 指向值,表达式和环境(在里面对表达式求值)的指针。一旦一个允诺被求值,环境就会被设为
NULL。 LANGSXP- 这是
LISTSXP用于函数调用的一种特别类型。(CAR 引用函数(一般通过符号或语言对象),而 CDR是以标签指定特定参数的参数列表。)R-层次的文档提到`表达式'(`expressions')/`语言对象'( `language objects')多半指LANGSXP,但它们也可以是符号(SYMSXP) 或表达式向量(EXPRSXP)。 SPECIALSXPBUILTINSXP- 指定primitives/
.Internal表中的偏移量。 CHARSXPlength,truelength后面有字节块相随(允许nul结尾)。LGLSXPINTSXPlength,truelength后面有 C 的int(整数)构成的块相随(在所有的R平台上都是32位的)。REALSXPlength,truelength后面有C 的double构成的块相随。CPLXSXPlength,truelength后面有 C99 的double complex或等价结构构成的块相随。STRSXPlength,truelength后面有指针(指向CHARSXP的SEXP)构成的块相随。DOTSXPLISTSXP中为...符号绑定的值设计的一个特殊类型:允诺的成对列表。ANYSXP- 该类型用于放置任何类型:这种类型没有真实的对象。
VECSXPEXPRSXPlength,truelength后面有指针构成的块相随。这些类型在内部一致(同STRSXP)但在语句解释时可能会不一样2。BCODESXP- 为今后的字节码编译器设计。
EXTPTRSXP- 有三个指针,分别指向指针,保护值(the protection alue,在运行时,保护该对象的 R 对象)和标签(可能是
SYMSXP)。 WEAKREFSXPWEAKREFSXP是一种长度为4,含有元素key, value, finalizer 和 next的特殊VECSXP类型。key 可以是NULL,环境或者外部指针,而 finalizer 是一个函数或NULL。RAWSXPlength,truelength后面有字节块相随。S4SXP- 两个没有使用的指针和一个标签。
Footnotes
[1] 这很少使用。现在只用于环境的哈希表(VECSXP),其中length 是表的大小而 truelength 是实际使用的原始槽变量(primary slots)的个数;或者用于串行化的参考哈希表(VECSXP),其中 truelength也是实际使用的槽变量的个数。
[2] 译者注:原句为“Theseare internally identical (and identical to STRSXP) but differ inthe interpretations placed on the elements.”
Hits:Loading...
- Previous Page: 1.1.2 头字段的其它部分
- Next Page: 1.1.4 资源分配类型
