【问题标题】:Clojure sequences and collectionsClojure 序列和集合
【发布时间】:2019-01-29 17:23:24
【问题描述】:

在 Lisp 中,cons 单元格 构建的所有数据结构,即它们本质上是链表或二叉树或两者兼而有之(如果我错了,请纠正我)。 Clojure 数据结构有 lists、vectors、maps 和 sets。 Clojure 为这些数据结构合并了两个包容性抽象:collections 和 sequences。 Sequence 抽象定义了first、rest 和cons 操作,而collection 抽象定义了集合特定的操作,例如conj 和into。 p>

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

【问题讨论】:

  • “在 Lisp 中,所有数据结构都由 cons 单元构建” - 这是一个常见的误解,但所有 lisp(除了一些玩具 lisps)也有其他数据结构。

标签: clojure lisp lazy-evaluation cons


【解决方案1】:

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

(list 1 2 3)

其他一切都是高效的数据结构(即矢量、地图)。

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

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

原始的 map 和 filter 函数是惰性的,许多其他函数也是如此。然而,在语言中添加了急切/命令版本mapv 和filterv,这已经足够令人头疼了(实现时间不可预测)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多