Изучая clojure, я был очень удивлен, обнаружив, что эти два объекта относятся к разным типам:
(list? `(inc)) ;; true
(list? `(inc 1)) ;; false
Теоретически я понимаю, почему вторая форма возвращает false, этот объект на самом деле является clojure.lang.Cons
. Однако на практике я не понимаю, почему это происходит.
Почему читатель читает `(inc)
иначе, чем `(inc 1)
? Что происходит под капотом?
(list? `(a))
с(list? `(a b))
. Во всяком случае,(type ..)
показывает, что первый — это PersistentList, а второй — Cons. Но почему.. без понятия. - person user2864740   schedule 18.03.2015nil
, это список из одного элемента (т.е.(inc)
). Отличается ли это в clojure? - person Malabarba   schedule 18.03.2015(type `(a b c))
также приводит к минусам. Отличается только форма`(singular)
, которая читается как PersistentList. - person user2864740   schedule 18.03.2015(list? '(a b))
возвращаетtrue
. Я предполагаю, что синтаксическая цитата не возвращает список, потому что проще реализовать соединение~@
с общими последовательностями (сconcat
или чем-то еще). Вероятно, было бы разумнее проверитьseq?
вместоlist?
. - person DaoWen   schedule 18.03.2015seq?
? Я знаю, что он проверяетISeq
, но я не знаю, реализуют ли какие-либо другие коллекцииISeq
. (в любом случае, это побочная тема, мне все еще любопытен вопрос) - person Malabarba   schedule 19.03.2015(defn code? [x] (or (list? x) (instance? clojure.lang.Cons x)))
- person DaoWen   schedule 19.03.2015clojure.lang.PersistentList
является единственным коллекция, которая реализуетISeq
и будет истинной дляseq?
. (Внизу, начиная чуть выше предикатов и функций.) - person Shannon Severance   schedule 19.03.2015(seq? `(x y))
верно, а(list? `(x y))
ложно. Что, думаю, противоречит этому. - person Malabarba   schedule 19.03.2015clojure.lang.Cons
считаются коллекциями, и он реализуетISeq
. - person Shannon Severance   schedule 19.03.2015coll?
:-\ - person Malabarba   schedule 19.03.2015