Next: , 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)。

向量类型有 RAWSXPCHARSXP, LGLSXP, INTSXP, REALSXP, CPLXSXP, STRSXP, VECSXP, EXPRSXPWEAKREFSXP。需要明白的是, 这些类型都是 VECTOR_SEXPREC,每一个都含有头字节和 同样的三个指针,但随后的两个整数给出向量的长度和`事实长度' (`true length')1,而后是数据( 根据需要排列:在大多数32位系统中,数据通过 24 字节的 VECTOR_SEXPREC 节点直接连在节点后面)。数据是以适当长度 存储`事实长度'的元素的内存块( 大约是8字节的倍数,通过在 gc() 的 档案记录的8字节块的`Vcells'存储 )。

不同类型的`data'(数据)在下面的表中列出。 许多类型是解释型的(interpretation),即 这些类型不需要校验。

NILSXP
只有类型 NILSXP 的一种对象 R_NilValue 没有数据。
SYMSXP
通过PRINTNAME (一种CHARSXP),SYMVALUEINTERNAL 访问 三个节点,名字,值和内部结构的指针。 (如果符号的值是一个 .Internal 函数, 最后一个则是一个指向适当 SEXPREC 的指针。) 许多符号有 SYMVALUE R_UnboundValue
LISTSXP
指向 CAR, CDR (通常是 LISTSXPNULL)和 TAG (通常是 SYMSXP)的指针.
CLOSXP
指向形式参数(formals,一个成对列表),内容和环境的指针。
ENVSXP
指向框架,闭包环境和哈希表(NULLVECSXP)的指针。框架指的是一个标记过的 成对列表(标签是符号,CAR是绑定的值)。
PROMSXP
指向值,表达式和环境(在里面对表达式求值)的指针。 一旦一个允诺被求值,环境就会被设为NULL
LANGSXP
这是 LISTSXP 用于函数调用的一种特别类型。 (CAR 引用函数(一般通过符号或语言对象),而 CDR是以标签指定 特定参数的参数列表。) R-层次的文档提到`表达式'(`expressions')/`语言对象'( `language objects') 多半指 LANGSXP,但它们也可以是符号(SYMSXP) 或表达式向量 (EXPRSXP)。
SPECIALSXP
BUILTINSXP
指定primitives/.Internal 表中的偏移量。
CHARSXP
lengthtruelength后面有字节块相随 (允许nul结尾)。
LGLSXP
INTSXP
lengthtruelength 后面有 C 的int(整数)构成 的块相随(在所有的R平台上都是32位的)。
REALSXP
lengthtruelength 后面有C 的 double 构成 的块相随。
CPLXSXP
lengthtruelength后面有 C99 的 double complex 或等价结构构成的块相随。
STRSXP
lengthtruelength 后面有指针( 指向CHARSXPSEXP)构成的块相随。
DOTSXP
LISTSXP中为... 符号绑定的值设计的一个特殊类型: 允诺的成对列表。
ANYSXP
该类型用于放置任何类型: 这种类型没有真实的对象。
VECSXP
EXPRSXP
lengthtruelength后面有指针构成的块相随。 这些类型在内部一致(同STRSXP)但在 语句解释时可能会不一样2
BCODESXP
为今后的字节码编译器设计。
EXTPTRSXP
有三个指针,分别指向指针,保护值(the protection alue, 在运行时,保护该对象的 R 对象)和标签(可能是SYMSXP)。
WEAKREFSXP
WEAKREFSXP 是一种长度为4,含有元素 key, value, finalizernext 的特殊 VECSXP 类型。key 可以是 NULL,环境或者外部指针, 而 finalizer 是一个函数或 NULL
RAWSXP
lengthtruelength 后面有字节块相随。
S4SXP
两个没有使用的指针和一个标签。

Footnotes

[1] 这很少使用。现在只用于 环境的哈希表(VECSXP),其中 length 是表的大小而 truelength 是实际使用的 原始槽变量(primary slots)的个数;或者用于串行化的 参考哈希表(VECSXP),其中 truelength 也是实际使用的槽变量的个数。

[2] 译者注:原句为“These are internally identical (and identical to STRSXP) but differ in the interpretations placed on the elements.”