以下示例产生相同的输出。
(seq [1 2 3 4])
=> (1 2 3 4)
(sequence [1 2 3 4])
=> (1 2 3 4)
以下示例产生相同的输出。
(seq [1 2 3 4])
=> (1 2 3 4)
(sequence [1 2 3 4])
=> (1 2 3 4)
区别在于,sequence
始终返回一个序列,即使集合为空(此时返回一个空列表),而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
并返回空列表(如果集合为nil
)。
user> (seq nil)
nil
user> (seq ())
nil
user> (sequence ())
()
user> (sequence nil)
()
此外,sequence
还有其他操作 transducers 的多个参数。
根据文档:
clojure.core/sequence
[coll]
[xform coll]
[xform coll & colls]
从1.0版本开始添加 如果 coll 不是一个序列(可能为空),则将其强制转换为序列。不会强制执行惰性序列。(sequence nil)产生 ()。当提供一个 transducer 时,返回对 coll(s) 中的项目应用 transform 后的惰性序列,即对每个 coll 的第一个项目集合进行转换,然后对每个 coll 的第二个项目集合进行转换,直到其中任何一个 coll 耗尽。忽略其他 coll 中的任何剩余项目。transform 应接受 number-of-colls 参数。
clojure.core/seq
[coll]
从1.0版本开始添加 返回集合的 seq。如果集合为空,则返回 nil。 (seq nil)返回 nil。seq 还适用于字符串、本机 Java 数组(引用类型)和实现 Iterable 的任何对象。请注意,seq 缓存值,因此不应在其迭代器重复返回相同可变对象的任何 Iterable 上使用 seq。