conditionals arrays loops clojure for-loop

arrays - conditionals - Cómo implementar un bucle For en Clojure



clojure conditionals (2)

La respuesta de Jeremy es buena para hacer un ciclo for en Clojure idiomática.

Si realmente quieres un estilo imperativo para el ciclo en Clojure, puedes crear uno con esta macro:

(defmacro for-loop [[sym init check change :as params] & steps] `(loop [~sym ~init value# nil] (if ~check (let [new-value# (do ~@steps)] (recur ~change new-value#)) value#)))

Uso de la siguiente manera:

(for-loop [i 0 (< i 10) (inc i)] (println i))

Me gustaría implementar este pequeño código en Clojure, pero estoy luchando:

struct mystruct { int id; int price; }; mystruct mydata[10]; for (int i=0; i<10; i++) { myfunction(mydata[i].id, mydata[i].price); //other things... }

Soy un principiante con Clojure y es realmente complicado para mí hacer algo tan simple como este, pero estoy tratando de aprender tanto como sea posible, ya que sé que Clojure ofrece grandes ventajas, como el uso de refs ...

Realmente apreciaría si alguien pudiera ayudarme. ¡¡Gracias!!


Una forma de traducir un imperativo para loop a Clojure es usar el macro for .

(for [i (range 10)] (inc i))

La función anterior devolverá todos los números de 0 a 9 incrementados por 1. Sin embargo, parece que simplemente desea iterar sobre una colección secuencial y usar cada elemento. Si eso es todo lo que necesita, entonces no necesita hacer referencia a un valor de índice, sino que puede hacer referencia directamente a cada elemento.

(for [d my-vec-of-data] (my-function d))

Sin embargo, para este caso simple, la función de map probablemente sea una mejor opción porque está diseñada para invocar funciones con argumentos de colecciones. El siguiente ejemplo es equivalente al uso de for arriba.

(map my-function my-vec-of-data)

Ambos map y for devolver una colección de valores formados por los valores devueltos por my-function . Esto se debe a que las estructuras de datos de Clojure son inmutables, por lo que es necesario que se devuelva una nueva colección. Si eso no es lo que necesita o si su función tiene efectos secundarios, puede usar doseq lugar de for , que devuelve nil .