2016-11-25 19 views
0

我厭倦了編寫一個批次代碼來打印列表結構,基於列表的結構。例如,對於Clojure:將任意列表轉換爲字符串表示,希望懶惰?

'(1 2 3),我會

(apply str '(1 2 3))

'((1 2 3) (4 5)),我應該

(map #(apply str %) '((1 2 3) (4 5)))

等根據列表的嵌套結構。

我不知道什麼是一個優雅的函數來處理任意列表結構的字符串?

下面是一個草圖,希望能夠學到更好的解決方案。

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

在此先感謝!

+0

請注意,如果你引用另一個報價中,第二個'''將擴展爲'quote'並且不被評估。你可能只需要在整個表達式中使用一個''''。 – Alex

+0

@Alex,謝謝指出使用'inside'的錯誤。 –

回答

2

pprint將打印格式良好的數據結構:

user=> (clojure.pprint/pprint '('(1 2 3) '(4 5))) 
('(1 2 3) '(4 5)) 

您可以使用with-out-str綁定*out*pprint輸出發送到一個字符串,而不是stdout

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

,如果你想得到一些一致但完全控制的方式來格式化任何數據,您可以使用clojure.pprintcl-format函數。它是普通lisp的真棒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" 

等等。有一個很好的教程在這裏:http://www.gigamonkeys.com/book/a-few-format-recipes.htmlclhs

更多信息,你可以走得更遠,例如,使某種格式生成函數(或宏):

user> (defmacro make-fstring [level] 
     (nth (iterate #(str "~{" % "~^ ~}") "~{~a~}") (dec level))) 
#'user/make-fstring 

user> (cl-format nil (make-fstring 2) '((1 2 3) (4 5 6))) 
"123 456" 

user> (cl-format nil (make-fstring 3) '(((1 2) (3 4) (5 6) (7 8)) 
             ((9 10) (11 12)))) 
"12 34 56 78 910 1112"