Clojure 中的 seq 和 sequence 有什么区别?

Ert*_*tin 5 lisp functional-programming clojure clojurescript

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

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

(sequence [1 2 3 4])
=> (1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ent 6

不同之处在于,sequence即使集合为空(在这种情况下为空列表),也始终返回 seq,而为空集合seq返回nil。此外,sequence可与换能器一起使用。

查看源代码:

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) ())))
  ...
Run Code Online (Sandbox Code Playgroud)

因此sequenceseq如果集合还不是 seq,则仅使用集合调用该集合,如果该集合是nil.