27236
clojure 1.8 を使っています。  
特にIDEなどは使っておらず、mifesやときどきvimでコードを書いておりまして、`java`コマンドから直接REPL起動させ、実行結果を試しています。

純粋関数をなるべく多用することで大分デバッグが楽になったと感じているのですが、`trampoline`を使うときは引数に指定された関数が返してくる関数をさらに実行しながら進むので、動的に関数の実行順序や関数に渡すデータが変わっていきます。そういう状況では`println`くらいでしかデバッグの方法が分かりませんでした。

しかしこの方法は `do` 関数に `println`
をいくつも書いたりしなくてはならなくなって、括弧の数も多くなりがちです。可読性が大分悪くなってしまいました。  
もしきちんとプログラムを組むのであれば、こういう類をメンテナンスしていくのは正直辛くなってしまいそうです。しかしそんなことを多くの人が敢えて耐えているとも考えにくく。

そこで質問ですが、表題の通り、`trampoline`の動作をデバッグするのに効率の良い方法というのがあったら教えていただきたいです。よろしくお願いします。
CC BY-SA 3.0
2016-06-30T09:00:57.720
27214
2016-07-01T00:10:09.930
2016-06-30T09:25:35.157
9403
9403
question
clojure
trampolineのデバッグ方法について
僕の回答はひとつの意見として参考までに受け取っていただけたらと思います。

結論から書くなら Cursive や CIDER の利用をまず最初に検討するべきです。  
デバッグ環境が既に IDE やそれに準ずるプラグインなどで実装されているので、それらを利用すればこの問題は簡単に解決するでしょう。

参考までに CIDER でのデバッグ画面を貼っておきます。  
[![画像の説明をここに入力](https://i.stack.imgur.com/Y0aFI.png)](https://i.stack.imgur.com/Y0aFI.png)

例えば `trampoline` を利用する場合はこのようなコードに対して利用することになると思うのですが、何の問題もなくデバッグが可能です。

ただ、このような IDE やそれに準ずるプラグインを利用するのが、個人の主義に合わない場合もあると思います。その場合は書かれているように `do` マクロや
`print` を駆使してデバッグするしかないでしょう。

あるいは相互再帰を利用して記述することが本当に綺麗な解法であるのか検討した方がいいのかもしれません。一般的なアプリケーションを書く場合、余程のことがない限り相互再帰で絶対に記述しなければならないというケースは稀有だと思います。

まとめると

  1. Cursive や CIDER などを利用しましょう
  2. 相互再帰で書かなればいけないのか見直しましょう

というところでしょうか。

追記:

spyscope という Leiningen や Boot で利用できるプラグインがあるので、これを利用するというのもひとつの手だと思います。  
<https://github.com/dgrnbrg/spyscope>
CC BY-SA 3.0
2016-07-01T00:10:09.930
27236
2016-07-01T00:10:09.930
9525
27214
answer