erlang数据类型的c源码解析(2)-list

本文深入探讨Erlang中List类型的C源码实现,解释List在C层面表现为链表的结构,并解析了`erlang:length/1`和`erlang:tuple_to_list/1`两个关键函数,帮助读者理解Erlang List在底层的表示和操作。
摘要由CSDN通过智能技术生成

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语言&

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值