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)))
concat
在 seq
上操作,而不是字符串。它适用于字符串,但将它们视为字符序列。它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...)`
您好,我需要从 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)))
concat
在 seq
上操作,而不是字符串。它适用于字符串,但将它们视为字符序列。它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...)`