在Lisp中,所有的 cons单元格数据结构均已构建,即它们本质上是链表或二叉树或两者(如果我错了,请纠正我)。 Clojure数据结构是列表,向量,地图和集合。 Clojure为这些数据结构包含了两个包含性的抽象:集合和序列。 序列抽象定义first
,rest
和cons
操作,而 collection 抽象定义诸如{{1} }和conj
。
Clojure核心功能(例如into
和map
)在序列抽象上运行,但是可以接受任何数据结构并执行隐式转换。这些功能也是懒惰的。默认情况下,这是否意味着Clojure在内部将数据存储在更有效的数据结构(例如索引数组)中,并且仅根据需要切换到链接列表? Clojure实际上如何将集合转换为序列?是序列使用迭代器从集合构建以流方式或作为一个整体,然后传递给消费者?
答案 0 :(得分:2)
Clojure中唯一作为单链接列表的数据结构是实际的list
,例如:
(list 1 2 3)
其他所有东西都是有效的数据结构(即矢量,地图)。
(名义上)惰性序列由当前值和用于生成下一个值的配方组成。一旦计算,元素将被缓存,并且不会重新计算。
将集合转换为序列是实现细节,对于最终用户通常并不重要。
原始的map
和filter
函数以及许多其他函数都是惰性函数。但是,这已经足够令人头疼(无法预测的实现时间),因此急需/命令性版本mapv
和filterv
被添加到了该语言中。