【发布时间】:2013-02-04 07:59:08
【问题描述】:
我正在调试一个错误,发现undefined 已附加到一个列表中,这导致后来崩溃。
我预计使用 ++ 运算符附加列表以外的内容会导致崩溃。但undefined 并非如此。这是一个例子:
1> [1,2,3] ++ undefined.
[1,2,3|undefined]
虽然它没有崩溃,但列表不再完全正常工作:
1> L = [1,2,3] ++ undefined.
[1,2,3|undefined]
2> L ++ [4].
** exception error: bad argument
in operator ++/2
called as [1,2,3|undefined] ++ [4]
为什么会这样? 这与erlang中列表的底层实现有关吗?
【问题讨论】:
-
因此与#erlang@freenode 的几个伙伴讨论了这个问题。这是一个“不当列表”的例子。它有几个好处。考虑一个元组:
{key, value}。在 erlang VM 内部,这是三个术语。一个术语是二元素元组,另外两个是术语key和value。访问元组时,您必须首先取消引用元组术语以访问它包含的两个术语。但是,假设我们将其实现为不正确的列表:[key|value]。使用这种格式,您不必取消对术语的引用,并且可以节省内存(因为您也不必存储元组术语)。 -
之所以有效,是因为 Erlang 列表是 CONS 列表,这意味着列表的每个单元格都是两个单词对,相当于
struct list_cell {Eterm hd; Eterm tl;}。[a|b]创建一个 list_cell,hd 设置为原子a,tl 设置为原子b。还应该注意的是,iolists 可能(并且合法/合理地)是不适当的列表。 -
听起来正确。以下是一些解释不当列表及其用途的链接:stackoverflow.com/questions/1919097/…stackoverflow.com/questions/5088575/…