Tôi rất mới để che giấu, và tôi đã không thực hiện một tấn lisp trước đây. Tôi có một chức năng có chứa những điều sau đây:clojure: cách thành ngữ của việc loại bỏ trùng lặp trong một "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))))))
Rõ ràng, mã này là nghèo vì có hai chức năng gần như giống hệt nhau gọi đây là tối ưu, nơi sự khác biệt duy nhất là (.indexOf scale degree)
vs degree
.
Cách Clojure/Lisp để xóa trùng lặp mã này là gì? Tôi cảm thấy như nó nên liên quan đến một let, nhưng tôi không tích cực. Bất kỳ con trỏ chung khác liên quan đến khối mã này cũng được đánh giá cao.
Edit: Tôi đã tái yếu tố mã theo gợi ý andrew Cooke, chức năng bây giờ đọc:
(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))))
)
)
Nhờ tất cả những người đã trả lời một cách nhanh chóng.
Ít nhất cho chung lisp (và tôi giả clojure cũng), hai dấu ngoặc đơn cuối cùng thường được đặt ở cuối dòng (take ...); với một trình soạn thảo tốt mà thụt lề mã lisp, thụt đầu dòng sẽ thay thế cho những gì bạn đang làm với hai dấu ngoặc đơn cuối cùng. –