В чем разница между seq и seq? - PullRequest
4 голосов
/ 27 января 2012
-------------------------
clojure.core/seq
([coll])
  Returns a seq on the collection. If the collection is
    empty, returns nil.  (seq nil) returns nil. seq also works on
    Strings, native Java arrays (of reference types) and any objects
    that implement Iterable.
-------------------------
clojure.core/seq?
([x])
  Return true if x implements ISeq
-----

Очевидно, пусто? основан на след. какая разница между пустыми? и ноль? Я так смущен.

clojure.core/empty?
([coll])
  Returns true if coll has no items - same as (not (seq coll)).
  Please use the idiom (seq x) rather than (not (empty? x))

И еще:

(not (seq? ())) ;;false
(not (seq ())) ;;true
(not nil) ;;true

1 Ответ

10 голосов
/ 27 января 2012
  • seq преобразует коллекцию в последовательность и возвращает ноль, если коллекция пуста;также возвращает ноль, если аргумент равен нулю.
  • seq? возвращает значение true, если аргумент является последовательностью (реализует интерфейс ISeq).
  • empty? будет возвращать значение true, если аргумент равен нулю или пустой коллекции.
  • nil? вернет true, если аргумент равен nil.

Я думаю, что бит о идиоме (seq x) в строке документации для empty? применим к обычной практике использования if-letвот так:

(defn print-odd-numbers [coll]
  (if-let [x (seq (filter odd? coll))]
    (println "Odd numbers:" x)
    (println "No odd numbers found.")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...