我需要一次读取一个字符串(这是一个序列)3个字符。我知道take-while
和take 3
,而take
因为没有更多输入而返回nil
,它似乎是take-while
的完美谓词,但我无法理解如何包装字符串序列,以便它一次返回接下来的3个字符的字符串。如果这是一个面向对象的语言,我会包装序列的读取调用或其他东西,但是对于Clojure,我不知道如何继续进行。
答案 0 :(得分:3)
您可以使用partition
或partition-all
(partition 3 "abcdef")
user=> ((\a \b \c) (\d \e \f))
两者的文档都是
clojure.core/partition
([n coll] [n step coll] [n step pad coll])
Returns a lazy sequence of lists of n items each, at offsets step
apart. If step is not supplied, defaults to n, i.e. the partitions
do not overlap. If a pad collection is supplied, use its elements as
necessary to complete last partition upto n items. In case there are
not enough padding elements, return a partition with less than n items.
nil
clojure.core/partition-all
([n coll] [n step coll])
Returns a lazy sequence of lists like partition, but may include
partitions with fewer than n items at the end.
nil
如果您的字符串不能保证长度是三的倍数,那么您应该使用partition-all
。最后一个分区将包含少于3个元素。如果你想改用partition
,那么为了避免字符串中的字符被切断,你应该使用step = 3和填充集合来填充最后一个分区中的漏洞。
要将每个元组转换为字符串,您可以在每个元组上使用apply str
。因此,您希望在此处使用map
。
(map (partial apply str) (partition-all 3 "abcdef"))
user=> ("abc" "def")
答案 1 :(得分:2)
你可以不用拳击每个角色来做到这一点:
(re-seq #"..." "Some words to split")
;("Som" "e w" "ord" "s t" "o s" "pli")
如果您对@turingcomplete's answer的评论表明您想要其他所有三元组,
(take-nth 2 (re-seq #"..." "Some words to split"))
;("Som" "ord" "o s")