Soy nuevo en Clojure, y he estado traduciendo algunos trabajos de manipulación de datos que hice recientemente como una ayuda para el aprendizaje. Tengo una traducción de función que funciona bien, y es más corta, pero se siente mucho menos legible. ¿Alguien puede sugerir una forma más legible y/o más idiomática para manejar esto?¿Cuál es la mejor forma de manejar esta transformación de secuencia en Clojure?
En Python:
def createDifferenceVector(v,startWithZero=True):
deltas = []
for i in range(len(v)):
if i == 0:
if startWithZero:
deltas.append(0.0)
else:
deltas.append(v[0])
else:
deltas.append(v[i] - v[i-1])
return deltas
Mi intento de traducción Clojure:
(defn create-diff-vector [v start-zero]
(let [ext-v (if start-zero
(cons (first v) v)
(cons 0 v))]
(for [i (range 1 (count ext-v))]
(- (nth ext-v i) (nth ext-v (- i 1))))))
Podría ser que es menos legible sólo por mi inexperiencia con Clojure, pero en particular, el truco de anteponer un elemento al vector de entrada me parece que oscurece la intención. Todas las soluciones que probé y que no usaron el truco precedente fueron mucho más largas y feas.
Muchas transformaciones de secuencia son increíblemente elegantes en Clojure, pero las que encuentro desafiantes hasta ahora son las siguientes, que a) se prestan a la manipulación por índice en lugar de por elemento, y/o b) requieren un manejo especial para ciertos elementos.
Gracias por cualquier sugerencia.
Muy bueno.Siempre me olvido de que puedo hacer esto '(map foo x (rest x))' - Por lo general, busco 'partition' en su lugar, con algo como '(para [[ab] (partición 2 1 v)] (- ba)) '. El mapa es mucho más agradable, gracias por el recordatorio. – amalloy
Gracias. Esa es una explicación realmente clara, y una forma * mucho * más elegante de expresarlo. Definitivamente me está llevando algo de tiempo entender lo que piensa Clojure, pero ya estoy viendo recompensas. – eggsyntax
Heh. Cinco años más tarde, ahora un desarrollador profesional de Clojure/script, me topé con esto de nuevo. Escribió una solución de forma independiente, y terminó siendo palabra por palabra idéntica a la tuya, @daniel. Gracias por ayudarme a seguir el camino correcto en aquel entonces :) – eggsyntax