在Lisp中,所有数据结构都由cons单元构建,即它们本质上是链接列表或二叉树或两者兼有(如果我说错了,请纠正我)。Clojure数据结构包括列表,向量,映射和集合。Clojure为这些数据结构提供了两个全面的抽象:集合和序列。 序列抽象定义了
Clojure的核心函数,如
first
, rest
和cons
操作,而集合抽象则定义了特定于集合的操作,例如conj
和into
。Clojure的核心函数,如
map
和filter
,在序列抽象上操作,但可以接受任何数据结构并执行隐式转换。这些函数也是惰性的。这是否意味着默认情况下Clojure在更高效的数据结构(例如索引数组)中存储数据,并且只在需要时切换到链接列表?Clojure实际上如何将集合转换为序列?是使用迭代器以流式方式构建序列还是将整个序列构建后再传递给消费者?