Sono molto nuovo nel clojure e non ho ancora fatto un sacco di lisp in precedenza. Ho una funzione che contiene il seguente:clojure: modo idiomatico di rimuovere la duplicazione in un "se"?
(defn chord
([scale degree num_voices]
(if
(keyword? degree)
(take num_voices (take-nth 2 (cycle (invert scale (.indexOf scale degree)))))
(take num_voices (take-nth 2 (cycle (invert scale degree))))))
Ovviamente, questo codice è scarsa a causa avente due funzione quasi identica chiamate qui è subottimale, dove l'unica differenza è (.indexOf scale degree)
vs degree
.
Qual è il modo Clojure/Lisp per rimuovere questa duplicazione del codice? Sento che dovrebbe coinvolgere un let, ma non sono positivo. Sono anche apprezzati tutti gli altri suggerimenti generali relativi a questo blocco di codice.
Edit: ho ri-presi il codice secondo il suggerimento di Andrew Cooke, la funzione ora legge:
(defn chord
([scale degree num_voices]
(let [degree (if (keyword? degree) (.indexOf scale degree) degree)]
(take num_voices (take-nth 2 (cycle (invert scale degree))))
)
)
Grazie a tutti coloro che hanno risposto così in fretta.
Almeno per common-lisp (e presumo clojure pure), quelle ultime due parentesi sono di solito poste alla fine della linea (prendere ...); con un buon editor che indentizzi correttamente il codice Lisp, l'indentazione prenderà il posto di quello che stai facendo con quelle ultime due parentesi. –