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),即 这些类型不需要校验。
NILSXPNILSXP 的一种对象 R_NilValue
没有数据。
SYMSXPPRINTNAME (一种CHARSXP),SYMVALUE
和 INTERNAL 访问
三个节点,名字,值和内部结构的指针。
(如果符号的值是一个 .Internal 函数,
最后一个则是一个指向适当 SEXPREC 的指针。)
许多符号有 SYMVALUE R_UnboundValue。
LISTSXPLISTSXP 或 NULL)和 TAG
(通常是 SYMSXP)的指针.
CLOSXPENVSXPNULL 或
VECSXP)的指针。框架指的是一个标记过的
成对列表(标签是符号,CAR是绑定的值)。
PROMSXPNULL。
LANGSXPLISTSXP 用于函数调用的一种特别类型。
(CAR 引用函数(一般通过符号或语言对象),而 CDR是以标签指定
特定参数的参数列表。)
R-层次的文档提到`表达式'(`expressions')/`语言对象'( `language objects')
多半指 LANGSXP,但它们也可以是符号(SYMSXP) 或表达式向量
(EXPRSXP)。
SPECIALSXPBUILTINSXP.Internal 表中的偏移量。
CHARSXPlength,truelength后面有字节块相随
(允许nul结尾)。
LGLSXPINTSXPlength,truelength 后面有 C 的int(整数)构成
的块相随(在所有的R平台上都是32位的)。
REALSXPlength,truelength 后面有C 的 double 构成
的块相随。
CPLXSXPlength, truelength后面有 C99 的
double complex 或等价结构构成的块相随。
STRSXPlength,truelength 后面有指针(
指向CHARSXP的 SEXP)构成的块相随。
DOTSXPLISTSXP中为... 符号绑定的值设计的一个特殊类型:
允诺的成对列表。
ANYSXPVECSXPEXPRSXPlength, truelength后面有指针构成的块相随。
这些类型在内部一致(同STRSXP)但在
语句解释时可能会不一样2。
BCODESXPEXTPTRSXPSYMSXP)。
WEAKREFSXPWEAKREFSXP 是一种长度为4,含有元素
key, value, finalizer 和 next
的特殊 VECSXP 类型。key 可以是 NULL,环境或者外部指针,
而 finalizer 是一个函数或 NULL。
RAWSXPlength,truelength 后面有字节块相随。
S4SXP