No - un elenco vuoto, non è la stessa di una sequenza infinita di Nils
Questo è relativamente facile da mostrare. Supponiamo di avere:
(def infinite-nils (repeat nil)) ; an infinite lazy sequence of nils
(def empty-list '()) ; an empty list
Hanno un diverso numero di elementi:
(count infinite-nils) => doesn't terminate
(count empty-list) => 0
Prendendo da loro:
(take 10 infinite-nils) => (nil nil nil nil nil nil nil nil nil nil)
(take 10 empty-list) =>()
Se si chiama ss su di loro si ottiene
(seq inifinite-nils) => sequence of infinite nils
(seq empty-list) => nil
La confusione nell'originale può essere più ampia y essere risolto attraverso la comprensione delle seguenti fatti:
- '() è una raccolta (un elenco persistente), non è una sequenza. Tuttavia è sequenziale, quindi è possibile chiamare seq su di esso per convertirlo in sequenza.
- zero rappresenta la sequenza vuota - quindi quindi
(seq '())
restituisce nil, come fa (seq (rest '()))
- first ritorna nil su una sequenza vuota - quindi perché
(first (rest '()))
è nullo.
Quando scrivo le frasi cond per ricorrere in sequenza, il mio primo controllo è di solito (vuoto? Obj). È il modo corretto di recidivare in Clojure? – unj2
Penso che di solito le persone testano (seq obj) piuttosto che '(empty? Obj)'. –
@BrianCarper Perché? C'è una differenza significativa tra le due espressioni? – wrongusername