【问题标题】:Convert list of lists into string in Clojure在 Clojure 中将列表列表转换为字符串
【发布时间】:2020-06-26 06:22:03
【问题描述】:

如何将作为列表列表的 LazySeq 转换为具有完全相同结构和括号的字符串?

(def my-list (lazy-seq '((a b 0 1 x y) (a b 0 4 x y) (a b 0 3 x y) )))
(def string-list (print-to-string my-list ))

string-list
;; should return "((a b 0 1 x y) (a b 0 4 x y) (a b 0 3 x y) ))"
;; but returns "clojure.lang.LazySeq@72251662"

【问题讨论】:

  • 只是(str my-list)
  • 对不起,我的意思是 LazySeq 这不起作用
  • 能否请您根据实际情况更新您的问题)

标签: clojure


【解决方案1】:

如果您想保持数据原样(或至少尽力而为),请不要使用str,而是使用pr-str。对于简单的事情可能没有什么不同,但对于更复杂的数据结构则可以。

例如

user=> (pr-str (lazy-seq '((a b 0 1 x y) (a b 0 4 x y) (a b 0 3 x y) )))
"((a b 0 1 x y) (a b 0 4 x y) (a b 0 3 x y))"

【讨论】:

【解决方案2】:

对于惰性序列,您可以使用print-str,这与简单的print 相似,但会将结果写入字符串。

user> (print-str my-list)
;;=> "((a b 0 1 x y) (a b 0 4 x y) (a b 0 3 x y))"

但要注意,它显然实现了集合,并且在无限 seq 的情况下它会永远挂起。

您也可以覆盖任何您想要的数据类型的打印行为:

(defmethod print-method clojure.lang.LazySeq [data ^java.io.Writer w]
  (let [[firsts] (split-at 10 data)]
    (if (= 10 (count firsts))
      (.write w (str (seq firsts) " :: more"))
      (.write w (str (seq firsts))))))

user> (print-str (lazy-seq (range 1000)))
;;=> "(0 1 2 3 4 5 6 7 8 9) :: more"

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多