2

シーケンス全体が 1 行に印刷されず、シーケンスの各要素がそれぞれの行に印刷されないように、シーケンスを印刷しようとしています。例えば

[10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29]

pprint-newline改行がどのように印刷されるかを判断できることを示すドキュメントを見つけました。残念ながら、 と組み合わせて使用​​する方法の例を見つけることができずpprint、doc 文字列からは多くの洞察が得られません。

-------------------------
clojure.pprint/pprint-newline
([kind])
  Print a conditional newline to a pretty printing stream. kind specifies if the 
newline is :linear, :miser, :fill, or :mandatory. 

This function is intended for use when writing custom dispatch functions.

Output is sent to *out* which must be a pretty printing writer.

pprintのオプションの 2 番目の引数を指定します。writerデフォルトでは に設定されています*out*。ただし、この場合に「送信」pprint-writerする方法がわかり*out*ません。たとえば、以下の例のようなものは機能していないようです

(clojure.pprint/pprint [1 2 3 4] (*out* (clojure.pprint/pprint-newline :miser)))
4

2 に答える 2

3

Guillermo は一般的にプリティ プリントのディスパッチを変更する方法を説明しましたが、1 つのコレクションを別の方法でプリントしたいだけであれば、それも可能です。

たとえば、cl-format(after (use '[clojure.pprint :as pp)) を使用すると、次のようになります。

(binding [pp/*print-pretty* true
          pp/*print-miser-width* nil
          pp/*print-right-margin* 10]
  (pp/cl-format true "~<[~;~@{~a~^ ~:_~}~;]~:>~%" '[foo bar baz quux]))

お好みで設定*print-right-margin*してください。

これにはフォーマットを使用する必要はありません。フォーマット ディレクティブは、必要に応じて、それぞれのプリティ プリンター関数に変換できます。フォーマット文字列の説明:論理ブロック~<を確立します。~:>ブロック内には、 で区切られた 3 つのセクションがあります~;。最初と最後のセクションはプレフィックスとサフィックスであり、要素は中間セクションに と を使用して出力され~@{ます~}。各要素について、要素は を使用し~aて出力され、必要に応じてスペースが続き、条件付きの塗りつぶしスタイルの改行が続きます。

(CL では、フォーマット文字列を に簡略化できますが"~<[~;~@{~a~^ ~}~;]~:@>~%"、Clojure 1.5 では機能しないようです。)

于 2013-10-18T16:38:19.403 に答える
1

ヘルプにあるように、この関数はカスタム ディスパッチ関数で使用するためのものです。

シーケンスの pprint の動作を変更するには、新しいディスパッチ関数を提供する必要がありますclojure.lang.ISeq

で見つけることができるシーケンスの現在のディスパッチ関数clojure/pprint/dispatch.clj

(use-method simple-dispatch clojure.lang.ISeq pprint-list) 
...
(defn- pprint-simple-list [alis]
    (pprint-logical-block :prefix "(" :suffix ")"
      (print-length-loop [alis (seq alis)]
        (when alis
      (write-out (first alis))
      (when (next alis)
        (.write ^java.io.Writer *out* " ")
        (pprint-newline :linear)
        (recur (next alis)))))))    

印刷はデータ型のオーバーライドに従ってディスパッチされるため、方法のようです。

アイデアについては、ソース コードを参照してください。

于 2013-10-18T15:42:33.653 に答える