核心集合数据结构(列表、向量、映射和集合)都有用于创建它们的可变参数函数:list
、vector
、hash-map
、hash-set
。其中2个具有1参数的函数可以接收一个集合并转换为所需的特定集合类型:vec
和set
。映射和列表没有此类函数。我认为我理解为什么映射没有:在需要成对时,中间没有步骤进行成对转换时,无法将其转换为其他集合类型。
但似乎缺少一个函数,可以接受任何集合类型的单个对象并将其转换为具体的持久化列表。就像这样的简单函数(defn to-list [coll] (clojure.lang.PersistentList/create coll))
。为什么会排除这样一个函数?
我提问/想要这样一个函数的原因是我在构建和遍历嵌套数据结构,并且当Clojure核心函数如list*
和cons
以及语法引号等操作“列表”时返回非持久化列表时,这可能会很具挑战性。我自己写了一个to-list
,并在必要时将其展现在必要的地方,以便在意识到list*
并不适合我的需求后,使我的决策树更加容易。
我知道序列抽象是Clojure思维模式的一个重要组成部分,但Program列表不对我知道的确切有限尺寸的对象返回true使我有些挫败。
我主要想了解对这种函数故意排除的任何推理,但如果核心团队感兴趣,我可以为其添加补丁。