(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Cider-debug という視覚的、対話的な Clojure のためのデバッガについて。

デバッグについてです。例えば Ruby 界隈だと pry で、 Java な人たちは高性能 IDE に標準装備されているデバッガあるいはプラグインなどを利用していることでしょう。

Clojure も最近はデバッガが cider に標準装備されているようです。ちょっとまだこなれてないところもあるけど、おおよそ使えるので使ってみます。

準備するものは

  • cider-nrepl 0.9 or later

  • cider-mode latest version *1


~/.lein/profiles.clj へと以下のような設定を追加/マージする。

{:user {:plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]]}}

だけです。

するとこんな感じになる。

監視したい関数の中(or 直後)で M-x cider-debug-defun-at-point を実行する*2と、その関数に対して監視が始まります(多分、バグだと思うけど直後に (n)ext ... (i)nject => #'name-spage.any/func みたいに出てくるからこのときは適当に n を押して無視します。 c だと監視できなくなるぽい)。
そうしたら、デバッグしたい式を評価してデバッグモードに入ります。すると

 (n)ext (c)ontinue (i)nject => #'name-spage.any/func 

と minibuffer に出てくるので、適当にポチポチ押していきます。
このときに n を押すとステップ実行で、次の S 式を評価しにいきます。 c だと一気に抜けてデバッグモードを抜けます。 i を押すとそのタイミングで評価される S 式の代わりに新しい任意の S 式を埋め込めます(動画中だと 10 の代わりに 20 を入れるだけという簡単なことをしています)。
動画だとあまり良さが伝わらない感じあるので実際には各個人で試してみてもらいたいですが、評価される S 式のコッカ*3にカーソルあたってどこが評価されているのか分かりやすいし使いやすいなぁという印象でした。

このデバッグ機能は cider のバージョン 0.9 で実装される機能で、まだ 0.9 はリリースされていないので若干バギーではあるんですがある程度使い物にはなるという印象なので紹介まで :)

BTW...

個人的にこれを使いはじめる前まで使っていたのは spyscope というプラグインです*4

まぁつまるところ print デバッグ用便利マクロです。

参考

endlessparentheses.com

*1:ところで Emacs のパッケージってバージョン指定してインストールできますっけ?

*2:C-u C-c C-c / C-u C-M-x

*3:閉じカッコ

*4:一緒に働いている Clojure/Emacs デキル人に教えてもらった