2016-08-10 2 views

ответ

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 на коллекции, если это не уже последующие и возвращает пустой список, если коллекция была nil.

2

прежде всего, они относятся к пустому аргументу последовательности по-разному:

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

также sequence имеет дополнительные арностей для работы на преобразователях

от Docs:

Clojure. сердцевина/последовательность

[Coll]

[XForm Coll]

[XForm Coll & colls]

Добавлено в 1,0 Колл Осуществляет приведение (возможно, пустой) последовательности, если она уже не один. Не заставит ленивый след. (последовательность nil) дает(), когда подается преобразователь , возвращает ленивую последовательность приложений преобразование в элементы в столбцах, то есть к набору первых элементов каждого колла, а затем набор из вторых предметов в каждом столбе, до тех пор, пока не будет исчерпан любой из колов. Любые остальных элементов в других коллах игнорируются. Преобразование должны принимать числа-colls аргументы

clojure.core/сл

[Coll]

Добавлены в 1,0 Возвращает НомерСтарт на коллекции. Если коллекция пуста, возвращает nil. (seq nil) возвращает nil. seq также работает с Строками, родными массивами Java (ссылочных типов) и любыми объектами , реализующими Iterable. Обратите внимание, что значения кэша seqs, поэтому seq не должны использоваться ни на одной итерации, чей итератор повторно возвращает тот же измененный объект.

Смежные вопросы