Estoy teniendo dificultades para entender la diferencia entre rest
y next
en Clojure. The official site's page on laziness indica que la preferencia debería ser probablemente usar rest
, pero realmente no explica claramente la diferencia entre los dos. ¿Alguien puede dar alguna idea?Clojure: resto vs.
Respuesta
A medida que la página se ha vinculado descrito, next
es más estricta que (el nuevo comportamiento de) rest
porque necesita para evaluar la estructura de los contras perezosos para saber si se debe devolver nil
o una ss.
rest
Por otro lado, siempre devuelve un seq, por lo que no es necesario evaluar nada hasta que realmente utilice el resultado de rest
. En otras palabras, rest
es más vago que next
.
OK, creo que podría entender lo que quieres decir. ¿Estás diciendo que 'next' siempre devuelve un cons cell, mientras que 'rest' simplemente devuelve un ISeq (o el tipo que sea en realidad)? –
@Daniel:' next' devuelve 'nil' o un' seq' no ocupado '.' rest' siempre devuelve un' seq', que podría estar vacío. – sepp2k
Así que considero que, para algunas secuencias, determinar si hay más elementos es una operación costosa. Con una lista normal de células cons, yo pensaría que es trivial determinar si ha llegado al final de la lista. Sin embargo, con una secuencia diferida (de lazy-seq, quizás), esta determinación puede ser costosa. I No entendí completamente que nil era diferente de la secuencia vacía. Parece que las subsecuencias producen con el resto garantías débiles y, por lo tanto, pueden ser más eficientes. –
Es fácil si usted tiene esto:
(next '(1))
=> nil
Así next
se ve en la siguiente cosa y si la línea está vacía se devuelve nil
en lugar de un vacío ss. Esto significa que necesita mirar hacia el futuro (al primer elemento que devolvería) lo que hace que no sea totalmente vago (quizás no necesite el siguiente valor, pero next
desperdicia el tiempo de cálculo para mirar hacia adelante).
(rest '(1))
=>()
rest
no se ve adelante y sólo devuelve el resto de la SEC.
Quizás piense: ¿Por qué molestarse en usar dos cosas diferentes aquí? La razón es que normalmente quiere saber si no queda nada en el seq y simplemente devuelve nil
, pero en algunos casos donde el rendimiento es muy importante y evaluar un elemento más podría significar un gran esfuerzo puede usar rest
.
solo para matarlo: (resto nil) =>() – gtrak
next
es como (seq (rest ...))
.
rest
devolverá la pieza restante de una secuencia. Si esa parte de la secuencia aún no se ha realizado, rest
no la fuerza. Ni siquiera te dirá si quedan más elementos en la secuencia.
next
hace lo mismo pero luego obliga a que se realice al menos un elemento de la secuencia. Entonces, si next
devuelve nil
, sabrá que ya no quedan más elementos en la secuencia.
ahora prefieren utilizar next
con reursion, como el escape de evaluación es más simple/Limpiador:
(loop [lst a-list]
(when lst
(recur (next lst))
vs
(loop [lst a-list]
(when-not (empty? lst) ;; or (when (seq? lst)
(recur (rest lst))
Un caso para el uso de rest
, sin embargo, sería si usa una colección como cola o pila. En ese caso, desea que su función devuelva una colección vacía al abrir o quitar el último elemento.
- 1. XML-RPC vs RESTO
- 2. with-meta vs^{} - Clojure
- 3. Clojure: reducir vs aplican
- 4. clojure vs. Ruby
- 5. Idiomatic en Clojure: (soltar 1 str) o (resto str)?
- 6. Clojure nil vs Java null?
- 7. RESTO vs SOAP - ¿Es SOAP realmente más seguro que REST?
- 8. clojure pmap/preduce vs fork-join
- 9. clojure cons vs conj con lazy-seq
- 10. Clojure: cons (seq) vs. conj (lista)
- 11. JavaScript RESTO Biblioteca cliente
- 12. Cuándo usar let vs. if-let en Clojure
- 13. Clojure def vs defn para una función sin argumentos
- 14. let vs letfn para definir funciones locales en clojure?
- 15. Buen ejemplo de concurrencia de Java vs. Clojure
- 16. Rendimiento de estructuras perezosas Clojure vs hashes/sets/vectores?
- 17. Clojure mirar hacia arriba vector rendimiento vs conjunto
- 18. clojure: (aplicar coll fn) vs (aplicar # (aplicar coll fn% y))
- 19. Definición de función de Clojure integradas: def vs defn
- 20. Numpy Indexación: Devolver el resto
- 21. ¿Qué significa & & resto en elisp?
- 22. Resto de la división flotante
- 23. de carga de archivos desde un cliente resto a un servidor resto
- 24. TagSoup vs Jsoup vs HTML Analizador vs vs HotSax
- 25. Clojure - Citando Confusión
- 26. Clojure: Conversión de archivo Clojure a YAML
- 27. ¿Hay buenos puntos de referencia de Clojure?
- 28. RESTO servicio WCF a través de SSL
- 29. RESTO - Eliminar una colección de objetos
- 30. RESTO Servicio WCF y sesión en ASP.NET
Este punto no vale una respuesta por separado: Lo que las respuestas hasta ahora no han hecho completamente explícito es que '()' es verdadero, mientras que 'nil' es falso. Entonces '(defn keep-going [my-coll] (if (rest my-coll) (keep-going (rest my-coll))" Finalizado.")' continuará por siempre - o más bien, desbordará la pila - mientras '(defn keep-going [my-coll] (si (next my-coll) (keep-going (next my-coll))" Terminado. ")' Terminará. (OP seguramente ya lo ha resuelto, estoy agregando esta observación para otros.) – Mars