... Tal vez la programación imperativa con datos variables se perfora demasiado profundo en mi cerebro, pero encuentro que el código para construir vectores de datos en Clojure es prolijo, difícil de manejar y enrevesado . ¡Debe haber una mejor manera!¿La mejor manera de acumular resultados en un vector en Clojure? (El código funcional puro parece feo y prolijo)
en Ruby podría escribir código como:
results = []
a_collection.each do |x|
x.nested_collection.each do |y|
next if some_condition_holds
results << y
end
end
En Clojure, no sé de una mejor forma de hacerlo que utilizar una función recursiva, tal vez como el siguiente código (horrible):
; NEWBIE ALERT! NEWBIE ALERT!
(loop [results []
remaining a_collection]
(if (empty? remaining)
results
(recur
(loop [results results
nested (nested_collection (first remaining))]
(if (empty? nested)
results
(if (some_condition_holds)
(recur results (rest nested))
(recur (conj results (first nested)) (rest nested)))))
(rest remaining))))
Sin datos mutables y bucles iterativos, debe usar recursividad para crear una colección. Cada una de estas funciones recursivas necesita una cláusula de guardia (empty?)
, etc. etc. Todo es tan repetitivo que me dan ganas de gritar.
En casos simples, map
sería suficiente, pero estoy pensando en casos en los que hay múltiples niveles de anidación, y en cada nivel, puede haber condiciones que requieren omitir una iteración.
En Common Lisp podría usar la macro loop
o mapcan
. ¿Clojure no tiene nada como mapcan
?
¡GRACIAS A TODOS LOS CARTELES! ¡SUS RESPUESTAS ERAN TODAS IMPRESIONANTES! Fue difícil elegir qué respuesta aceptar. –
Se ha dicho antes, pero la base de la programación funcional es la composición de funciones y el uso de funciones de orden superior, no el uso de recursión. Como regla general, la recursividad solo debe utilizarse si una solución con HOF se vuelve más compleja que una que usa recursividad. – NielsK
Para explicar: utilizará toneladas de recursión, pero casi todo debería ser una recursión que alguien más ya escribió para usted, por ejemplo, en 'mapa': sería bastante raro escribir recursiones a mano. – amalloy