2011-01-31 28 views
5

Tôi đang học Clojure, và tôi cần một sự thúc đẩy đúng hướng với vấn đề này mà tôi đã đưa ra.Câu hỏi về clojure thành ngữ khi chuyển đổi chuỗi

Tôi có một chuỗi sự kiện. Mỗi sự kiện bao gồm một 'ngày'.

(def events 
    [ 
    [1509 :marry "Catherine of Aragon"] 
    [1527 :unmarry "Catherine of Aragon"] 
    [1533 :marry "Anne Boleyn"] 
    [1536 :unmarry "Anne Boleyn"] 
    [1536 :marry "Jane Seymour"] 
    [1537 :unmarry "Jane Seymour"] 
    [1540 :marry "Anne of Cleves"] 
    [1540 :unmarry "Anne of Cleves"] 
    [1540 :marry "Catherine Howard"] 
    [1542 :unmarry "Catherine Howard"] 
    [1543 :marry "Catherine Parr"]]) 

Tôi muốn chuyển đổi điều này thành dòng thời gian lười biếng, tức là chuỗi có chứa một vector mỗi năm. Bắt đầu với năm của sự kiện đầu tiên và tiếp tục vô cùng.

[[[:marry "Catherine of Aragon"]] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [[:unmarry "Catherine of Aragon"]] [] [] [] [] [] [[:marry "Ane Boleyn"]] [] [] [[:unmarry "Anne Boleyn"] [:marry "Jayne Seymour"]] ...] 
+0

Tôi muốn xem xét lại định dạng tuân theo Lisp ước/clojure đưa các dấu ngoặc trên cùng một dòng, xem: http://techbehindtech.com/2010/12/09/clojure-good-coding-guidelines/ – 0x89

Trả lời

8
(def timeline 
    (let [events-by-year (group-by first events)] 
    (map #(map next (events-by-year %)) 
     (iterate inc (reduce min (keys events-by-year)))))) 

nhanh kiểm tra:

=> (take 30 timeline) 
(((:marry "Catherine of Aragon"))()()()()()()()()()()()()()()()() 
() ((:unmarry "Catherine of Aragon"))()()()()() ((:marry "Anne Boleyn"))() 
() ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour")) 
()) 
3

tôi sẽ đề nghị một cái gì đó như:

(defn timeline 
    ([] (timeline (ffirst *events*) *events*)) 
    ([time evts] 
    (let [[now later] (split-with #(= time (first %)) evts)] 
     (cons (map rest now) 
      (lazy-seq (timeline (inc time) later)))))) 

Test:

user> (take 30 (timeline)) 
(((:marry "Catherine of Aragon"))()()()()()()()()()()()()()()()()() 
((:unmarry "Catherine of Aragon"))()()()()() ((:marry "Anne Boleyn"))()() 
((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour"))()) 

Tôi giả định rằng danh sách các sự kiện là vô hạn cũng :)

cập nhật với những cải tiến và mượn một vài ý tưởng từ cgrand (cảm ơn :)

+0

Cảm ơn. Nó phá vỡ khi có nhiều sự kiện trong cùng một ngày, tức là [1515: c] [1515: d]. Tuy nhiên, có rất nhiều con trỏ tốt trong đó, vì vậy có lẽ tôi có thể tự mình nghĩ ra. – GHZ

+0

@GHZ Ah, bỏ lỡ điều đó. Vâng, cgrand là đẹp hơn anyway :) Refactored, để lại như là một lựa chọn thứ hai. –