【发布时间】: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