Ich bin sehr neu zu Clojure, und ich habe nicht eine Tonne Lispeln zuvor. Ich habe eine Funktion, die Folgendes enthält:clojure: idiomatische Art der Beseitigung von Doppelarbeit in einem "wenn"?
(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))))))
Offensichtlich ist dieser Code ist schlecht, weil mit zwei fast identische Funktion hier nennt, ist suboptimal, wo der einzige Unterschied (.indexOf scale degree)
vs degree
ist.
Wie ist die Clojure/Lisp-Methode zum Entfernen dieser Code-Duplizierung? Ich habe das Gefühl, es sollte eine Vermietung beinhalten, aber ich bin nicht positiv. Alle anderen allgemeinen Zeiger, die mit diesem Codeblock in Beziehung stehen, werden ebenfalls geschätzt.
Edit: Ich habe den Code nach Andrew Cooke Vorschlag erneut berücksichtigt, liest die Funktion jetzt:
(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))))
)
)
Dank an alle, die so schnell beantwortet.
Mindestens für Common-Lisp (und ich nehme an clojure auch), diese letzten zwei Klammern sind normalerweise am Ende der (take ...) Linie platziert; Mit einem guten Editor, der den Lisp-Code korrekt einrückt, wird der Einzug den Platz einnehmen, den Sie mit den letzten beiden Klammern machen. –