如何将字符串的 clojure lazy-seq 转换为单独的字符串?

How to turn a clojure lazy-seq of strings into separate strings?

我试图“解构”seq 中的随机数量的字符串?分成单独的字符串,同时也删除 seq.

中的最后一个字符串

("a" "b" "c") -> "a" "b"

我尝试了一些东西,我得到的最接近的是 (apply str (drop-last args)),但是你可能知道,这会将字符串的序列变成一个字符串..“ ab

我该怎么做?

听起来你会使用顺序解构:

(def col-of-strings '("a" "b" "c" "d" "e"))

(let [ [a b c & etc ]  col-of-strings
       last            (drop-last etc) ]
  (println "a=" a " b=" b " c=" c " and etc=" etc " last=" last))

打印

a= a  b= b  c= c  and etc= (d e)  last= (d)

另一种选择是先删除最后一个字符串,然后解构:

(let [ col-minus-last  (drop-last col-of-strings)
              [ a b c & etc]  col-minus-last ]
  (println "a=" a " b=" b " c=" c " etc=" etc))

打印

a= a  b= b  c= c  etc= (d)

如果您真的不知道集合中有多少元素,那么我认为您最好的选择可能是使用循环:

(loop [ c  (drop-last col-of-strings) ]
  (let [s  (first c) ]
    (println "s=" s)
    (if (nil? s)
      nil
      (recur (rest c)))))

编辑

OP 说他想传递可变数量的字符串进行处理。在那种情况下,听起来递归地遍历列表是合适的:

(defn vararg-func [ s & etc]
  (println "s=" s)
  (if (nil? s)
    nil
    (recur (first etc) (rest etc))))

但是由于 OP 说他已经有了一个惰性字符串序列(文件名),我认为处理它的最简单方法是简单地将序列传递给函数并循环遍历它:

(defn seq-func [ s ]
  (loop [ str     (first s)
          usw     (rest s) ]
    (println "str=" str)
    (if (nil? str)
      nil
      (recur (first usw) (rest usw)))))

这与之前的代码非常相似。