📝Clojure デバッグ

📝Clojure デバッグ

Clojure 開発におけるデバッグまとめ.

refs: 📝Clojure DX 📝Clojure REPL Driven Development

printデバッグ #

古代人から現代まで引き継がれている由緒正しきデバッグ手法, aka. わたしの得意技.

Clojureでもっとも有名な標準出力関数.

pr/prn/pr-str #

オブジェクトの内容をいい感じに出力してくれる.

(println “おれはここだよ”)のようなトレースデバッグにはprintlnをつかい, データの中身をみる(Inspectする)にはprnをつかうのが使い分け.

str #

clojure.pprint #

Pretty Print for Clojure.

clojure.pprint namespace | ClojureDocs.

(require '[clojure.pprint/pprint :as pp])
  • pprint: いい感じに出力.

prnでオブジェクトを表示すると, たとえば大きなネストしたMapは1行に表示されて見にくい.その場合は, clojure.pprint.pprintをつかうと見やすくなる.

REPLで (pp) と評価すると最終評価結果が表示される. このppの便利な使い方は, 普通に標準出力した結果が複雑だったときに, 再度ppを通じて表示することでさっきのデータ構造がいい感じになる.

Javaのクラスによく自分で実装するtoStringメソッドがClojureにもほしい!

-> print-method というmultimethodをつかう.

toStringをオーバーライドするとJavaのクラスをSystem.out.printlnするときにクラスの内容表示を自分でカスタマイズできる.

clojureでは print-methodというmultimethodが定義されている.

ただし, 基本的にはClojureはデータをMapで扱うことが推奨されているので, そもそもいらないかもしれない. JavaでtoStringが必要だったのはオブジェクトの中身を見る必要があるから. Clojureなら直接Eval!

hashp #

https://github.com/weavejester/hashp

hashpをつかうと spy的に変数の内容を補足できる.

コレは大変べんり!

clojure.core tap #

Clojure1.10から導入された機能.

  • add-tap で出力先を指定.
  • tap> で出力するデータを指定.
  • remove-tapで出力先を削除.

tap自体はEditorやREPLから使うのだが, これと連携するツールが便利. GUIによるデータの可視化が可能になる.

see more -> 📝Clojure Data Visualization Tools

logging #

ref: Clojure: Logging

Clojure REPLエラーメッセージまとめ #

REPLで評価したときに出てくるエラーメッセージの分類とその対処.

CIDERにおけるerror-buffer #

エラーメッセージは cider-error bufferに出力される.

stack-frameはデフォルトでたくさんでてくるが, filterをつかうと見やすくなる.

(setq cider-stacktrace-default-filters '(tooling dup))
;; or
(setq cider-stacktrace-default-filters '(project))

Unhandled clojure.lang.ArityException #

関数呼び出し時の引数の数が違う.

1. Unhandled clojure.lang.ArityException
   Wrong number of args (0) passed to: xxxx

Tips #

nREPLを再起動せずにパッケージを追加したい #

https://github.com/clj-commons/pomegranate

References #