2016-11-25 10 views
0

リストの構造に基づいて、リスト構造を出力するためのロットコードを書くのはうんざりです。例えば、Clojure:任意のリストを文字列表現に変換してください。

'(1 2 3)ため、Iよ

(apply str '(1 2 3)) しかし

'((1 2 3) (4 5))ため、I

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

ので、リストの入れ子構造に依存する上で必要があります。

任意のリスト構造に対処するために、どのようなエレガントな関数to-stringが必要なのでしょうか?

以下は、より良い解決策を学ぶことを望むスケッチです。

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

ありがとうございます!

+0

注意2番目の ''は '' quote'に展開され、評価されません。おそらく、式全体で1つの ''だけが必要です。 – Alex

+0

@Alex、 'inside'を使用する間違いを指摘してくれてありがとうございます。 –

答えて

2

pprintはきれいにフォーマットのデータ構造を出力します:

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

あなたはむしろstdoutよりも文字列にpprintの出力を送信するために*out*をバインドするwith-out-strを使用することができます:あなたがしたい場合は

(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" 
関連する問題