使用懒惰的字符串集合在clojure中进行分区

Bra*_*man 5 clojure lazy-evaluation

从一组字符串开始,如:

(def str-coll ["abcd" "efgh" "jklm"])
Run Code Online (Sandbox Code Playgroud)

目标是从字符串集合的头部提取特定数量的字符,生成分区的字符串分组.这是所需的行为:

(use '[clojure.contrib.str-utils2 :only (join)])
(partition-all 3 (join "" str-coll))

((\a \b \c) (\d \e \f) (\g \h \j) (\k \l \m))
Run Code Online (Sandbox Code Playgroud)

但是,使用整个集合的连接力评估,这会在处理非常大的字符串集合时导致内存问题.我的具体用例是通过解析大型分隔记录文件生成的惰性集合生成字符串子集:

(defn file-coll [in-file]
  (->> (line-seq (reader in-file))
    (partition-by #(.startsWith ^String % ">"))
    (partition 2))))
Run Code Online (Sandbox Code Playgroud)

并且正在建立上一个问题的工作.我已经尝试了reduce,partition和join的组合,但是无法提出正确的咒语从第一个字符串的头部拉出字符并根据需要懒惰地评估后续字符串.非常感谢任何想法或指示.

Ale*_*art 5

不太确定你的目的是什么,但以下是你的第一个例子所做的事情,并且这样做是懒惰的.

逐步说明:

user=> (def str-coll ["abcd" "efgh" "jklm"])
#'user/str-coll
user=> (map seq str-coll)
((\a \b \c \d) (\e \f \g \h) (\j \k \l \m))
user=> (flatten *1)
(\a \b \c \d \e \f \g \h \j \k \l \m)
user=> (partition 3 *1)
((\a \b \c) (\d \e \f) (\g \h \j) (\k \l \m))

现在都在一起了:

(->> str-coll 
  (map seq)
  flatten
  (partition 3))