【问题标题】:Clojure evaluate lazy sequenceClojure 评估惰性序列
【发布时间】:2018-08-20 05:54:39
【问题描述】:

您好,我需要从 stringify 函数返回字符串,但目前我正在获取惰性序列。无法理解如何评估惰性序列。

所以我需要的是这样的链式调用: (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)))

【问题讨论】:

  • 我会考虑使用clojure.string/replace 而不是Java interop 和.replaceAll

标签: clojure lazy-sequences


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多