私は 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))))))
明らかに、このコードは貧弱です。なぜなら、ここで 2 つのほぼ同一の関数呼び出しを使用することは最適ではないためです。唯一の違いは(.indexOf scale degree)
vsdegree
です。
このコードの重複を取り除く Clojure/Lisp の方法は何ですか? let を含むべきだと思いますが、私は肯定的ではありません。このコード ブロックに関連するその他の一般的なポインタも歓迎します。
編集:アンドリュー・クックの提案に従ってコードをリファクタリングしました。関数は次のようになります。
(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))))
)
)
とても早く答えてくれたみんなに感謝します。