Clojure序列和集合

时间:2019-01-29 17:23:25

标签: clojure lisp lazy-evaluation cons

在Lisp中,所有的 cons单元格数据结构均已构建,即它们本质上是链表或二叉树或两者(如果我错了,请纠正我)。 Clojure数据结构是列表向量地图集合。 Clojure为这些数据结构包含了两个包含性的抽象:集合序列序列抽象定义firstrestcons操作,而 collection 抽象定义诸如{{1} }和conj

Clojure核心功能(例如intomap)在序列抽象上运行,但是可以接受任何数据结构并执行隐式转换。这些功能也是懒惰的。默认情况下,这是否意味着Clojure在内部将数据存储在更有效的数据结构(例如索引数组)中,并且仅根据需要切换到链接列表? Clojure实际上如何将集合转换为序列?是序列使用迭代器从集合构建以流方式或作为一个整体,然后传递给消费者?

1 个答案:

答案 0 :(得分:2)

Clojure中唯一作为单链接列表的数据结构是实际的list,例如:

(list 1 2 3)

其他所有东西都是有效的数据结构(即矢量,地图)。

(名义上)惰性序列由当前值和用于生成下一个值的配方组成。一旦计算,元素将被缓存,并且不会重新计算。

将集合转换为序列是实现细节,对于最终用户通常并不重要。

原始的mapfilter函数以及许多其他函数都是惰性函数。但是,这已经足够令人头疼(无法预测的实现时间),因此急需/命令性版本mapvfilterv被添加到了该语言中。