Я очень новичок в clojure, и раньше я не делал тонны lisp. У меня есть функция, которая содержит следующее:clojure: идиоматический способ удаления дублирования в «if»?
(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))))))
Очевидно, что этот код плох, потому что имеет два почти идентичные функции вызывает здесь неоптимальным, где разница лишь в том (.indexOf scale degree)
degree
против.
Что такое Clojure/Lisp Способ удаления этого дублирования кода? Я чувствую, что это должно включать в себя пустяк, но я не уверен. Любые другие общие указатели, связанные с этим блоком кода, также оценены.
Edit: Я повторно учитываться код в соответствии с предложением AndreW Cooke, то функция теперь гласит:
(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))))
)
)
Спасибо всем, кто ответил так быстро.
По крайней мере, для здравой шепелявости (и я полагаю, Clojure, а также), последние две круглые скобки обычно помещаются в конец строки (взять ...); с хорошим редактором, который правильно отлаживает код lisp, отступ займет место того, что вы делаете с этими двумя последними скобками. –