我对clojure很陌生,而且我以前没有做过大量的lisp。我有一个包含以下内容的函数:
(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)
vs degree
。
删除此代码重复的 Clojure/Lisp 方式是什么?我觉得它应该涉及一个让,但我并不积极。与此代码块相关的任何其他通用指针也值得赞赏。
编辑:我根据安德鲁·库克的建议重构了代码,函数现在显示为:
(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))))
)
)
感谢所有这么快回答的人。