以下示例产生相同的输出。
(seq [1 2 3 4])
=> (1 2 3 4)
(sequence [1 2 3 4])
=> (1 2 3 4)
答案 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上使用 返回相同的可变对象。