String 在Clojure中连接多个惰性字符串序列

String 在Clojure中连接多个惰性字符串序列,string,clojure,concatenation,lazy-sequences,String,Clojure,Concatenation,Lazy Sequences,我有几个字符串: (def a "some random string") (def b "this is a text") 现在我想把它们的一部分连接起来,创建一个字符串“sometext”。不幸的是,下面的两个字符串都不起作用 (clojure.string/join " " [(take 4 a) (take-last 4 b)]) (str (take 4 a) " " (take-last 4 b)) 这是因为函数take和take last返回惰性序列。问题是:连接多个延迟字符串

我有几个字符串:

(def a "some random string")
(def b "this is a text")
现在我想把它们的一部分连接起来,创建一个字符串“sometext”。不幸的是,下面的两个字符串都不起作用

(clojure.string/join " " [(take 4 a) (take-last 4 b)])
(str (take 4 a) " " (take-last 4 b))
这是因为函数
take
take last
返回惰性序列。问题是:连接多个延迟字符串序列并返回一个字符串的正确方法是什么


编辑:我找到了一个解决方案——
(应用str(concat(take 4a)”(take last 4a))
——但这是最正确的方法吗?

与其使用序列函数来分割输入字符串,不如使用效率更高的
subs
(对于子字符串;请注意,有一个与GC相关的警告,请参见下文):

前面提到的警告是,只要在这里的第一个示例中返回的
“s”
仍然不符合垃圾收集的条件,那么原始的
“asdf”
(因为
subs
返回一个“视图”输入
字符串
,而不分配新的存储—这是Java的
子字符串
方法的行为,它将
子字符串
包装起来。如果您立即将
交给
转到
subs
并且不保留对它的其他引用,因为
join
将在提取字符后丢弃它


如果您最终使用的是惰性字符序列,那么除了使用类似
(map(partial apply str)[这里的向量])
的方法将
clojure.string/join
的输入转换为字符串之外,别无选择。

尝试一下,是的,由于惰性,代码的结果是不正确的

(str (apply str (take 4 a)) " " (apply str (take-last 4 b)))

在我看来,编辑的方式很好。问题不在于太懒。但是对懒散的字符序列调用toString不会返回由该序列中的字符组成的字符串。OP在字符向量或字符列表方面也会有类似的问题。
(str (apply str (take 4 a)) " " (apply str (take-last 4 b)))
(str/join " " (map (fn [f col] (f col))
               [first last]
               (map #(str/split % #" ") [a b])))