Clojure评估延迟序列

时间:2018-08-20 05:54:39

标签: clojure lazy-sequences

嗨,我需要从stringify函数返回字符串,但是目前我正在偷懒的seq。无法确定如何评估延迟序列。

所以我需要的是像这样的连锁店: (println "Formated: " (fmt (stringify m)))

(defn stringify [m]
    "Construct string expression"
    (let [res (reduce-kv (fn [acc k v]
                    (let [s (str/join "" [v (name k)])]
                      (if (pos? v)
                        (if (empty? acc)
                          (concat acc ["+" s])
                          (concat acc s))
                        (concat acc s))
                      ))

          "" m)]
      res))

(defn fmt [s]
    "Apply formating rules"
    (-> s
        (.replaceAll "([+-])" " $1 ")
        (println)))

2 个答案:

答案 0 :(得分:3)

concatseq而不是字符串上运行。它适用于字符串,但将其视为字符序列。它是returns a lazy seq,您可以使用clojure.string/join将其实现为字符串。

res替换stringify函数中的最后一条语句(clojure.string/join "" res)应该可以解决问题。但是,您可以从一开始就使用reduce-kv而不是joinconcat构建一个字符串。您可以简化为任何内容,而不仅仅是集合/序列。

答案 1 :(得分:1)

处理字符串时,只需使用str进行串联:

(concat acc s))         => (str acc s)
(concat acc ["+" s])    => (apply str [acc "+" s])  ; note moved `[`

示例:

=> (str "abc" "def")
"abcdef"

=> (apply str ["abc"  "de" "fgh"] )
"abcdefgh"

=> (clojure.string/join ["abc"  "de" "fgh"] )  ; like `(apply str...)`