【问题标题】:How to turn a clojure lazy-seq of strings into separate strings?如何将字符串的clojure惰性序列转换为单独的字符串?
【发布时间】:2020-11-07 17:49:23
【问题描述】:

我在尝试“解构”的 seq 中有随机数量的字符串?分成单独的字符串,同时删除 seq 中的最后一个字符串。

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

我尝试了一些方法,最接近的是 (apply str (drop-last args)),但您可能知道,这会将字符串的 seq 转换为单个字符串.. "ab"

我该怎么做?

【问题讨论】:

  • 你不能有多个字符串在蓝色。使用 drop-last 会给你一个缺少最后一个元素的 seq,但它仍然是一个你可以坚持的 seq——你需要一些容器来坚持。也许添加更多信息你的最终目标是什么?
  • @cfrick 我正在尝试将可变数量的字符串作为参数传递给函数。
  • 我想您可能正在寻找apply?简单地说,它允许您使用 seq 作为函数的参数。

标签: clojure seq lazy-sequences


【解决方案1】:

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

(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)))))

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

【讨论】:

  • 很好的答案。谢谢。
  • 我刚看到vararg-func 并意识到我搞砸了,因为函数入口总是一个重复点——所以我不需要显式循环。同样,我重新执行seq-func 以递归到函数的头部,而不是内部的loop 点。有时我会陷入思考——我想是时候进行更多的电击治疗了! :-)
  • seq-fn 可以是 (defn seq-fn [[x & xs :as data]] (when (seq data) (println "x =" x) (recur xs))) ,而 vararg-fn (defn vararg-fn [& args] (loop [[x & xs :as data] args] (when (seq data) (println "x =" x) (recur xs))))
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2011-04-12
相关资源
最近更新 更多