2012-04-05 5 views
11

¿Tiene clojure un poderoso "bucle" como el ceceo común?Obtener dos elementos de una secuencia cada vez

por ejemplo:

obtener dos elementos de una secuencia cada vez

Common Lisp:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b)) 

cómo hacer esto en Clojure?

+1

Puede implementar CL en clojure ... –

+0

Defina "potente". –

Respuesta

13

Al aprovechar for y algunos desestructuración puede alcanzar su ejemplo específico:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b)) 
+0

Tenga en cuenta que 'for' no es una construcción de bucle, sino una lista de comprensión, que produce un conjunto de resultados perezosos. Además, a diferencia de Common LISP, es difícil hacerlo funcionar extremadamente bien. –

+0

@Marko - ¿tiene ejemplos específicos? – sw1nn

+0

No entiendo - ejemplos de qué exactamente? –

2

de Clojure de usos múltiples bucles constructo es for. No tiene tantas características como la de CL loop incorporada (especialmente las de efecto lateral, ya que Clojure fomenta la pureza funcional), por lo que muchas operaciones que de lo contrario podría hacer simplemente con loop se logran alrededor de for. Por ejemplo, para sumar los elementos generados por for, pondría un apply + frente a él; para caminar elementos en pares, lo haría (como muestra sw1nn) use partition 2 en la secuencia de entrada introducida en for.

1

Haría esto con loop, recur y desestructuración.

Por ejemplo, si quería grupo cada dos valores juntos:

(loop [[a b & rest] [1 2 3 4 5 6] 
     result []] 
    (if (empty? rest) 
    (conj result [a b]) 
    (recur rest (conj result [a b])))) 

termina con un resultado de:

=> [[1 2] [3 4] [5 6]]

a y b son el primer y segundo elementos de la secuencia, respectivamente, y luego rest es lo que sobra. Entonces podemos repetir de manera recurrente hasta que no quede nada en rest y listo.

Cuestiones relacionadas