Tôi đang làm việc trên mẫu Rails và đang cố gắng viết một đoạn mã cho phép tôi điền một bảng hoặc nhiều cột thẻ ul "từ trên xuống dưới" và "từ trái sang phải" qua nhiều cột Tôi chỉ định. Tôi chỉ nhận được hang của Ruby vì vậy tôi không thể hình dung ra điều này. Tôi cũng tò mò về một phiên bản Haskell thành ngữ cho đoạn trích hữu ích này. Cải tiến lên phiên bản Clojure đánh giá cao:Bạn sẽ viết đoạn mã Clojure này trong Ruby và/hoặc Haskell như thế nào?
(defn table [xs & {:keys [cols direction]
:or {cols 1 direction 'right}}]
(into []
(condp = direction
'down (let [c (count xs)
q (int (/ c cols))
n (if (> (mod c q) 0) (inc q) q)]
(apply map vector (partition n n (repeat nil) xs)))
'right (map vec (partition cols cols (repeat nil) xs)))))
Với chút mã này sau đó tôi có thể làm như sau:
(table (range 10) :cols 3)
in ra này sẽ trông giống như vậy:
0 1 2
3 4 5
6 7 8
9
Và phức tạp hơn một:
(table (range 10) :cols 3 :direction 'down)
Có vẻ như vậy:
0 4 8
1 5 9
2 6
3 7
Ba điều bạn có thể có thể thay đổi trên phiên bản clojure 1 Sử dụng defnk (clojure.contrib.def) của nó một chút tốt đẹp để đọc. 2. từ khóa thay vì ký hiệu 3. thay vì thực hiện chuyển đổi thành vectơ hai cách hợp nhất nó với (vec (bản đồ vec (condp .....))) – nickik