Clojure-将一个序列拆分为多个序列

Clojure-将一个序列拆分为多个序列,clojure,Clojure,我正在开发一个函数,该函数将日期序列(或任何其他内容)拆分为基于给定数字x的向量中包含的多个序列 (date1 date2 date3 date4 date5 date6 date7) 因此,给定上面的日期列表并传入变量2,它将生成下面的向量 [(date1 date2) (date3 date4) (date5 date6) (date7)] 到目前为止,我的代码如下,但它返回的是一个包含nil的向量 (defn date-splitter [date-count dates

我正在开发一个函数,该函数将日期序列(或任何其他内容)拆分为基于给定数字x的向量中包含的多个序列

   (date1 date2 date3 date4 date5 date6 date7)
因此,给定上面的日期列表并传入变量2,它将生成下面的向量

   [(date1 date2) (date3 date4) (date5 date6) (date7)]
到目前为止,我的代码如下,但它返回的是一个包含nil的向量

(defn date-splitter [date-count dates x]
  (loop [i date-count, current-split dates, split-dates (vector)]
        (if (<= i x)
            (conj split-dates (get current-split 1))
            (let [s (split-at x current-split)]
              (recur (int (- i x)) (get s 1) (conj split-dates (get s 0)))))))
(定义日期拆分器[日期计数日期x]
(循环[i日期计数、当前拆分日期、拆分日期(向量)]

(如果(查看
split
的近亲
partition

=> (partition-all 2 '(1 2 3 4 5 6 7))
((1 2) (3 4) (5 6) (7))
如果要执行基于索引的操作,可以使用
映射索引
保持索引

=> (map-indexed (fn [idx itm] [(Math/floor (/ idx 2)) itm]) [1 2 3 4 5 6 7])
([0.0 1] [0.0 2] [1.0 3] [1.0 4] [2.0 5] [2.0 6] [3.0 7])
在FP中,非基于索引的操作通常是更好的选择。 基于索引的解决方案可视为代码气味


有几种方法可以在不使用索引的情况下使用FP方式进行分区。Ankur是一个很好的例子,说明了如果分区都不在core clojure中,如何解决这个问题。

这是一种更简单的方法。谢谢。
=> (map-indexed (fn [idx itm] [(Math/floor (/ idx 2)) itm]) [1 2 3 4 5 6 7])
([0.0 1] [0.0 2] [1.0 3] [1.0 4] [2.0 5] [2.0 6] [3.0 7])