15

バイナリ ツリーを出力しようとしていますが、Clojure がシーケンスを正しく出力するのに苦労しています。

'(1 2 3)たとえば、ノードのリストがあります。

各反復で、各要素の前後に多数のスペースを含むノードを出力したいと考えています。

(defn spaces [n]
  (apply str (repeat n " ")))

すごい、これはうまくいくようです。

それで、私がnodes '(:a :b :c)1行に印刷したいリストを持っているとしましょう。

(println (map #(str (spaces before) % (spaces (dec before))) nodes))

私はアイテムのリストを持っています。マップを使用して、文字列オブジェクトのリストを取得します。よし、印刷できるぞ!

しかし、これは私にこれを与えます:

(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)

そこで、遅延シーケンスを印刷する方法をグーグル検索し、print-strコマンドを使用するようになりました。ドキュメントによると、これは文字列に出力され、返されます。

(println (print-str (map #(str (spaces before) % (spaces (dec before))) nodes)))

しかし、これは私にこれを与えます:

(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)

変わらない..うーん。どんな助けでも大歓迎です。

4

1 に答える 1

31
user> (str (map inc (range 10)))
"clojure.lang.LazySeq@c5d38b66"
user> (pr-str (map inc (range 10)))
"(1 2 3 4 5 6 7 8 9 10)"

toStringメソッドはLazySeqによって呼び出されstrます。これにより、オブジェクト ID を不透明に表示することで値の遅延シーケンスを実現することを回避できます。このpr-str関数はprint-dup、オブジェクトの multimethod を呼び出します。これは、読者が理解できるもののバージョンを取得するように設計されています (LazySeqつまり、 equal を作成するリテラル値の場合LazySeq)。

構造のきれいな書式設定については、きれいな印刷の動作をカスタマイズするための、 、およびさまざまな関数を持つclojure.pprintに付属の名前空間を確認してください。clojure.corepprintprint-table

user> (require '[clojure.pprint :as pprint :refer [pprint print-table]])
nil
user> (pprint [:a [:b :c :d [:e :f :g] :h :i :j :k] :l :m :n :o :p :q [:r :s :t :u :v] [:w [:x :y :z]]])
[:a
 [:b :c :d [:e :f :g] :h :i :j :k]
 :l
 :m
 :n
 :o
 :p
 :q
 [:r :s :t :u :v]
 [:w [:x :y :z]]]
nil
user> (print-table (map #(let [start (rand-int 1e6)] (zipmap % (range start (+ start 10)))) (repeat 5 [:a :b :c :d :e :f :g :h :i :j])))

|     :a |     :c |     :b |     :f |     :g |     :d |     :e |     :j |     :i |     :h |
|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
| 311650 | 311652 | 311651 | 311655 | 311656 | 311653 | 311654 | 311659 | 311658 | 311657 |
|  67627 |  67629 |  67628 |  67632 |  67633 |  67630 |  67631 |  67636 |  67635 |  67634 |
| 601726 | 601728 | 601727 | 601731 | 601732 | 601729 | 601730 | 601735 | 601734 | 601733 |
| 384887 | 384889 | 384888 | 384892 | 384893 | 384890 | 384891 | 384896 | 384895 | 384894 |
| 353946 | 353948 | 353947 | 353951 | 353952 | 353949 | 353950 | 353955 | 353954 | 353953 |
nil
于 2014-05-01T12:11:35.640 に答える