1、前言
在erlang数据类型的c源码解析(1)-Eterm讲到,当Eterm的低2位为01B时,就是List类型,剩余的位数表示一个指向列表的指针。
另外就是,先讲结论,有助于理解,Erlang中的List在C的层面上是一个链表。
2、宏定义
// CONS用于构建一个链表节点
#define CONS(hp, car, cdr) \
(CAR(hp)=(car), CDR(hp)=(cdr), make_list(hp))
// CAD:取出链表结点的数据部分
#define CAR(x) ((x)[0])
// CDR:取出链表结点的Next指针
#define CDR(x) ((x)[1])
// make_list最后会调用到_unchecked_make_list(x), 向Eterm打上list的标签,实质上是置Eterm的低2位为10B
// COMPRESS_POINTER为压缩,与下面的EXPAND_POINTER对应
#define make_list(x) _ET_APPLY(make_list,(x))
#define _unchecked_make_list(x) ((Uint) COMPRESS_POINTER(x) + TAG_PRIMARY_LIST)
// list_val最后会调用到_unchecked_list_val(x), 将低2位的标签去掉,再取对应地址的值
#define list_val(x) _ET_APPLY(list_val,(x))
#define _unchecked_list_val(x) ((Eterm*) EXPAND_POINTER((x) - TAG_PRIMARY_LIST))
(这些蛋疼的命名来源于lisp语言&