Clojure序列和集合

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

6
“在Lisp中,所有的数据结构都是由cons单元构建的” - 这是一个常见的误解,但是除了一些玩具Lisp之外,所有的Lisp都有其他的数据结构。 - jkiiski
1个回答

2

在Clojure中,唯一的单向链表数据结构是实际的list,例如:

Original Answer翻译成"最初的回答"

(list 1 2 3)

除此之外,一切都是高效的数据结构(例如向量、映射)。

一个“懒惰序列”(nominally)由当前值和生成下一个值的方法组成。一旦计算完成,元素将被缓存并且不会重新计算。

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

最初的mapfilter函数是懒惰的,还有许多其他的函数也是懒惰的。然而,这足以成为一个头痛问题(难以预测的实现时间),所以急切/命令式版本的mapvfilterv被添加到了语言中。


1
一个 clojure.lang.Cons,比如 cons 创建的,是一个链表,正如源代码所示。而 clojure.lang.persistentList 是另一种不同的链表:例如它是可计数的,而 clojure.lang.Cons 则不是。 - Thumbnail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接