Clojure:将任意列表转换为字符串表示,希望是惰性的?

Clojure:将任意列表转换为字符串表示,希望是惰性的?,clojure,Clojure,我已经厌倦了根据列表的结构编写大量代码来打印列表结构。比如说, (13),我会 (应用str'(1 2 3)) 要不是 ((1 2 3)(4 5)),我应该 (map#(apply str%)”((123)(45)) 依此类推,具体取决于列表的嵌套结构 我想知道什么是一个优雅的函数字符串来处理任意列表结构 下面是一个草图,希望能学到更好的解决方案 (defun to-string "convert argument into string." ([x & xs] (str (to-str

我已经厌倦了根据列表的结构编写大量代码来打印列表结构。比如说,

(13),我会

(应用str'(1 2 3))
要不是

((1 2 3)(4 5)),我应该

(map#(apply str%)”((123)(45))

依此类推,具体取决于列表的嵌套结构

我想知道什么是一个优雅的函数字符串来处理任意列表结构

下面是一个草图,希望能学到更好的解决方案

(defun to-string
"convert argument into string."
([x & xs] (str (to-string x) (to-string xs) "\n"))
([x] (str x))
)

提前谢谢

pprint
将打印格式良好的数据结构:

user=> (clojure.pprint/pprint '('(1 2 3) '(4 5 )))
('(1 2 3) '(4 5))
您可以使用带out str的
来绑定
*out*
以将
pprint
的输出发送到字符串,而不是
stdout

(def s 
  (with-out-str 
     (clojure.pprint/pprint '('(1 2 3) '(4 5 )))))

pprint
将打印格式良好的数据结构:

user=> (clojure.pprint/pprint '('(1 2 3) '(4 5 )))
('(1 2 3) '(4 5))
您可以使用带out str的
来绑定
*out*
以将
pprint
的输出发送到字符串,而不是
stdout

(def s 
  (with-out-str 
     (clojure.pprint/pprint '('(1 2 3) '(4 5 )))))

如果您想获得一致但完全受控的方式来格式化任何数据,可以使用
clojure.pprint
中的
cl-format
函数。它是common lisp的awesome
format
函数的端口。例如:

user> (require '[clojure.pprint :refer [cl-format]])
nil

user> (cl-format nil "~{~a~}" '(1 2 3 4))
"1234"

user> (cl-format nil "~{~{~a~}~^ ~}" '((1 2) (3 4) (5 6)))
"12 34 56"
等等。这里有一个很好的教程:还有更多信息

例如,您可以更进一步,制作一些格式生成函数(或宏):


如果您想获得一致但完全受控的方式来格式化任何数据,可以使用
clojure.pprint
中的
cl-format
函数。它是common lisp的awesome
format
函数的端口。例如:

user> (require '[clojure.pprint :refer [cl-format]])
nil

user> (cl-format nil "~{~a~}" '(1 2 3 4))
"1234"

user> (cl-format nil "~{~{~a~}~^ ~}" '((1 2) (3 4) (5 6)))
"12 34 56"
等等。这里有一个很好的教程:还有更多信息

例如,您可以更进一步,制作一些格式生成函数(或宏):


请注意,如果您在另一个引号内引用,则第二个
将扩展到
引号
,并且不会进行计算。您可能只需要在整个表达式中使用一个
。@Alex,感谢您指出使用“inside”的错误。请注意,如果在另一个引号中引用,则第二个
将扩展到
引号,并且不会进行计算。您可能只需要在整个表达式周围使用一个“
。@Alex,谢谢您指出使用“inside”的错误。