Clojure中seq和sequence之间有什么区别?

时间:2016-08-10 14:24:33

标签: clojure functional-programming lisp clojurescript

以下示例产生相同的输出。

(seq [1 2 3 4])
=> (1 2 3 4)

(sequence [1 2 3 4])
=> (1 2 3 4)

2 个答案:

答案 0 :(得分:4)

不同之处在于sequence总是返回seq,即使集合为空(在这种情况下为空列表),而seq返回nil表示空集合。此外,sequence可与transducers一起使用。

查看源代码:

user=> (source sequence)
(defn sequence
  "Coerces coll to a (possibly empty) sequence, if it is not already
  one. Will not force a lazy seq. (sequence nil) yields (), ..."
  ([coll]
     (if (seq? coll) coll
         (or (seq coll) ())))
  ...

所以如果集合中只有一个集合调用sequence,则调用seq(如果它不是seq),如果集合是nil,则返回一个空列表。

答案 1 :(得分:2)

首先,他们对待空序列参数的处理方式不同:

user> (seq nil)
nil
user> (seq ())
nil
user> (sequence ())
()
user> (sequence nil)
()

sequence还有额外的智能操作传感器

截至文档:

  

clojure.core /序列

     

[COLL]

     

[xform coll]

     

[xform coll& colls]

     

在1.0中添加     Coerces会绑定到(可能是空的)序列(如果还没有)     一。不会强迫懒惰的seq。 (序列为零)yield(),当a     提供传感器,返回一个懒惰的应用程序序列     转换为coll(s)中的项目,即转换为first的集合     每个coll的项目,然后是第二组     每个coll中的项目,直到任何一个colls用尽。任何     其他colls中的剩余项目将被忽略。转型应该接受     colls of of colls参数

     

clojure.core / SEQ

     

[COLL]

     

在1.0中添加     返回集合上的seq。如果收藏是       空,返回零。 (seq nil)返回nil。 seq也适用       字符串,本机Java数组(引用类型)和任何对象       实现Iterable。注意seqs缓存值,因此seq       不应该在迭代器重复使用的任何Iterable上使用       返回相同的可变对象。