4

編集コードのすべての行を「インデント」することだけでなく、「きれいな印刷」および/または「インデント」のより広い定義について質問しています。行は、含まれているものに応じてグループ化/分割されます。

これは、私がきれいに印刷しようとしている関数です(これはオイラーの問題を解決するために書きましたが、それは重要ではありません。別の方法で書くこともできました)。

手動でインデントされたバージョン:

(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000)))))

どうやら、これは真の Lisp のインデント/印刷スタイルではないようで、最初から良い習慣を身につけたいので、Emacs のslime-repl clojure REPLから次のようにして、「きれいに印刷」しようとしました。

user> (doc pprint)      ;; just to show which version of pprint I'm using
clojure.pprint/pprint
...

だから私はやろうとした:

user> (pprint '(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000))))))

そして、私は以下を得ました:

(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    (fn*
     [p1__13958#]
     (if
      (=
       (str (* x p1__13958#))
       (apply str (reverse (str (* x p1__13958#)))))
      (* x p1__13958#)
      0))
    (range x 1000)))))

私が理解しているように、ラムダの#(...)表記は「リーダーマクロ」です。では、マクロの展開をトリガーせずにきれいに印刷するにはどうすればよいでしょうか? より一般的には、「テキスト エディターに表示されているもの」をきれいに印刷するにはどうすればよいですか?

また、ほとんどすべてが改行されるのは普通ですか? 例えば:

(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    ...

かなりの垂直画面領域を無駄にしているようです。これLisp コードをインデントする方法ですか?

最後の関連する質問: Emacs は、選択した領域または.cljバッファー全体を「きれいに印刷」するように構成できますか?

4

3 に答える 3

3

Lisp コードをインデントする「正式な」方法はありませんが、私は clojure-mode が clojure コードをインデントする方法が好きです (以下を参照)。

なぜ pprint がこのようにコードを出力するのかはわかりませんが、このページによると、まだ機能が完成していない初期リリースです。

emacs のインデント部分については、clojure-modeを参照してください。

于 2012-05-02T10:53:14.760 に答える
2

コンセンサスに最も近いのは、「Emacsのようにインデントする」ことです。政治的に正しいと思いますが、「vimのようにインデントする」という結果を含める必要があります。eclipse+CCW などの他のエディターは、これにかなり近いようです。ただし、デフォルトのプリティ プリンタではさらに改行が追加されます。

于 2012-05-02T20:15:14.273 に答える
0

これが私が現在行っていることです:

(defn pprint-code [code]
  (with-pprint-dispatch code-dispatch
    (binding [*print-suppress-namespaces* true]
      (pprint code))))

注: free-vars を解決するには、clojure.pprint を調べてください。

確かに改善です。*print-miser-width*調整方法や*print-right-margin*より良い出力を得る方法はまだ正確にはわかりません。YMMV。私の現在のビーフは (auto-) gensyms を使用しています。特定のコンテキストで pprinting しているときに、それらをデマングルしたいと考えています。

理想的には、フォーム/関数は独自のフォーマット規則を定義できます。たとえば、let バインディングは常に別の行にある必要があります。clojure.core でこれができるとは知りませんでした。

参考までに、この概要を参照してください。

于 2014-07-04T06:06:08.430 に答える