実行中にコードを生成するclojureで記述されたアプリケーションがあるとします。ソースコードがないコードをデバッグするにはどうすればよいですか?
編集:私は同僚とclojureについてチャットしていて、上記の理由でclojureプログラムをテストするのは難しい(または不可能である)と言ったので、この質問をしています。これは評価者の悲観的なアプローチだと思いました。それがテスト不可能だったとしたら、誰もそれを使用しなかっただろう。
実行中にコードを生成するclojureで記述されたアプリケーションがあるとします。ソースコードがないコードをデバッグするにはどうすればよいですか?
編集:私は同僚とclojureについてチャットしていて、上記の理由でclojureプログラムをテストするのは難しい(または不可能である)と言ったので、この質問をしています。これは評価者の悲観的なアプローチだと思いました。それがテスト不可能だったとしたら、誰もそれを使用しなかっただろう。
debug
Clojureは非常に強力なので、Java、C++などの他のそれほど強力ではない言語で一般的なスタイルを開発する必要はありません。
このプログラミングスタイルを維持すると、本当にデバッグが必要になる可能性が低くなります。あなたの場合、REPLによってすべての仕事をすることができます。ロギングにより、「デバッグ」動的コードを生成する関数の入力パラメーターを取得できます。その後、同じ方法でこの動的コードの入力パラメーターを取得します。最後に、生成された「デバッグ」コードと入力パラメーターの両方があります。したがって、状況を簡単に再現してテストできます。
更新します。質問の編集された部分に関して、プログラムがその場でコードを生成するという理由だけで、「clojureプログラムをテストするのは難しい(または不可能)」と言うのは正しくありません。生成されたコードは、通常のデータ収集として操作できるデータであることに注意してください。ブレークポイントでアプリケーション全体をビルド、実行、フリーズして、そこで何が起こっているかを確認する必要はありません。動的コードをテストする方法については、すでに説明しました。
clojure / tools.traceのメソッドを使用して、生成されたコードにある種のトレースを含めるようにしてみてください。
たとえば、関数を定義している場合は、deftrace
代わりに関数を使用defn
して呼び出しをトレースできます。
古いドキュメントから(以前はclojure-contribにありましたが、1.3の時点ではclojure / tools.traceにあります-このドキュメントはcontribページからのものです編集: リンク):
deftrace
使用法:(定義名と定義)
defnの代わりに使用します。引数を含め、このfnの各呼び出し/戻りをトレースします。deftraceされた関数へのネストされた呼び出しは、ツリーのような構造を出力します。
libには他にも便利なメソッドがあります。
少し面倒ですが、生成されたコードを一時ファイルに書き込み、その後そのコンテンツをロードして評価すると、スタックトレースの行番号ごとにデバッグ情報が取得されます。
他のすべてのコードと同様に、デバッグステートメント(ログなど)をコードに追加します。F10-F10-F10スタイルのデバッガーは、これ以上複雑なコードには役に立たないため、使用しないでください。