关于序列变换的习惯性clojure问题
我正在学习Clojure,我需要在正确的方向上推动我提出的这个问题 我有一系列事件。每个事件都包含一个“日期”关于序列变换的习惯性clojure问题,clojure,Clojure,我正在学习Clojure,我需要在正确的方向上推动我提出的这个问题 我有一系列事件。每个事件都包含一个“日期” (def events [ [1509 :marry "Catherine of Aragon"] [1527 :unmarry "Catherine of Aragon"] [1533 :marry "Anne Boleyn"] [1536 :unmarry "Anne Boleyn"] [1536 :marry "Jane Seymou
(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"]])
我想把它转换成一个懒散的时间轴,即每年包含一个向量的序列。从第一个事件的年份开始,一直持续到无限
[[[:marry "Catherine of Aragon"]] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [[:unmarry "Catherine of Aragon"]] [] [] [] [] [] [[:marry "Ane Boleyn"]] [] [] [[:unmarry "Anne Boleyn"] [:marry "Jayne Seymour"]] ...]
我想提出如下建议:
(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))))))
测试:
我假设事件列表也是无限的:)
更新了一些改进,并借鉴了cgrand的一些想法(谢谢)
快速测试:
=> (take 30 timeline)
(((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () ()
() ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) ()
() ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour"))
())
谢谢当同一日期有多个事件时,即[1515:c][1515:d],该事件中断。然而,这里有很多好的指针,所以也许我可以自己解决剩下的问题。@GHZ啊,错过了。好吧,CGRAME是更好的反正:)重构,留下作为第二个选项。我会考虑重新格式化坚持LISP/Culjule公约把尾随的父母一行,见:
(def timeline
(let [events-by-year (group-by first events)]
(map #(map next (events-by-year %))
(iterate inc (reduce min (keys events-by-year))))))
=> (take 30 timeline)
(((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () ()
() ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) ()
() ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour"))
())