Clojure 评估惰性序列

Clojure evaluate lazy sequence

您好,我需要从 stringify 函数获取 return 字符串,但目前我正在使用惰性 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 "([+-])" "  ")
        (println)))

concatseq 上操作,而不是字符串。它适用于字符串,但将它们视为字符序列。它returns a lazy seq,你可以用clojure.string/join实现成一个字符串。

将 stringify 函数中的最后一条语句 res 替换为 (clojure.string/join "" res) 应该可以解决问题。但是,您可以从一开始就使用 reduce-kv 构建一个字符串,使用 join 而不是 concat。你可以减少到任何东西,而不仅仅是 collections/seqs.

处理字符串时,只需使用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...)`