Sono nuovo di Clojure e ho tradotto alcuni lavori di manipolazione dei dati che ho svolto di recente come aiuto per l'apprendimento. Ho una traduzione di funzioni che funziona bene, ed è più breve, ma si sente molto meno leggibile. Qualcuno può suggerire un modo più leggibile e/o più idiomatico per gestirlo?Qual è il modo migliore per gestire questa trasformazione di sequenza in Clojure?
In 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
Il mio tentativo di traduzione 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))))))
Potrebbe essere che è meno leggibile solo a causa della mia inesperienza con Clojure, ma in particolare, il trucco di anteporre un elemento al vettore di input mi sembra che offuschi l'intenzione. Tutte le soluzioni che ho provato e che non hanno utilizzato il trucco in preparazione sono state molto più lunghe e brutte.
Molte trasformazioni della sequenza sono incredibilmente eleganti in Clojure, ma quelli che trovo difficile finora sono quelli come questo, che a) si prestano a manipolazioni da parte indice piuttosto che per elemento, e/o b) richiedono una gestione speciale per alcuni elementi.
Grazie per eventuali suggerimenti.
Molto interessante.Dimentico sempre che posso fare ciò '(map pippo x (riposa x))' cosa - di solito raggiungo 'partition' invece, con qualcosa come' (per [[ab] (partizione 2 1 v)] (- ba)) '. La mappa è molto più bella, grazie per il promemoria. – amalloy
Grazie. Questa è una spiegazione molto chiara e un modo * molto * più elegante di esprimerlo. Mi sta sicuramente prendendo un po 'di tempo per avvolgere la mia mente sul modo di pensare Clojure, ma sto già vedendo dei profitti. – eggsyntax
Heh. Cinque anni dopo, ora uno sviluppatore di Clojure/script professionale, mi è capitato di imbattermi di nuovo in questo. Ha scritto una soluzione in modo indipendente, e ha finito per essere quasi parola per parola identica alla tua, @ Daniel. Grazie per avermi aiutato a prendere la strada giusta da quella parte :) – eggsyntax