我对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)
和degree
。Clojure/Lisp的方法是如何消除这种代码重复的?我觉得应该涉及let,但我不确定。任何与此代码块相关的其他一般指针也将不胜感激。
编辑:我已经按照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))))
)
)
感谢所有快速回答的人。