2

実行中にコードを生成するclojureで記述されたアプリケーションがあるとします。ソースコードがないコードをデバッグするにはどうすればよいですか?

編集:私は同僚とclojureについてチャットしていて、上記の理由でclojureプログラムをテストするのは難しい(または不可能である)と言ったので、この質問をしています。これは評価者の悲観的なアプローチだと思いました。それがテスト不可能だったとしたら、誰もそれを使用しなかっただろう。

4

4 に答える 4

5

debugClojureは非常に強力なので、Java、C++などの他のそれほど強力ではない言語で一般的なスタイルを開発する必要はありません。

  1. REPL。任意の関数または式をいつでも評価できます。環境を準備し、テストする必要のある状況を再現できます。
  2. 不変性。Clojureは、優れた不変のコレクションと純粋関数ライブラリを提供します。また、アプリケーションの完全な状態制御を提供するSTMもあります。プログラムの可変部分を純粋関数型コードから分離し、それらの部分を可能な限り小さくして、状態管理を担当するコードのテストがはるかに簡単になるようにすることができます(一般的な場合)。純粋な機能部分のテストは、より楽しく簡単です。
  3. ボトムアッププログラミング。clojureでは、小さな断片でコードを書くことができます。このプロセスを続行する次のレイヤーの基礎となるレイヤー(ライブラリ、dsl)を構築できるようになるまで、小さな純粋関数で遊んでいます。小さな(純粋)関数のテストは非常に簡単な作業です。
  4. ロギング。明らかに、コードの任意のポイントで任意の入力パラメーター値をログに記録できます。

このプログラミングスタイルを維持すると、本当にデバッグが必要になる可能性が低くなります。あなたの場合、REPLによってすべての仕事をすることができます。ロギングにより、「デバッグ」動的コードを生成する関数の入力パラメーターを取得できます。その後、同じ方法でこの動的コードの入力パラメーターを取得します。最後に、生成された「デバッグ」コードと入力パラメーターの両方があります。したがって、状況を簡単に再現してテストできます。

更新します。質問の編集された部分に関して、プログラムがその場でコードを生成するという理由だけで、「clojureプログラムをテストするのは難しい(または不可能)」と言うのは正しくありません。生成されたコードは、通常のデータ収集として操作できるデータであることに注意してください。ブレークポイントでアプリケーション全体をビルド、実行、フリーズして、そこで何が起こっているかを確認する必要はありません。動的コードをテストする方法については、すでに説明しました。

于 2013-01-14T18:11:22.370 に答える
1

clojure / tools.traceのメソッドを使用して、生成されたコードにある種のトレースを含めるようにしてみてください。

たとえば、関数を定義している場合は、deftrace代わりに関数を使用defnして呼び出しをトレースできます。

古いドキュメントから(以前はclojure-contribにありましたが、1.3の時点ではclojure / tools.traceにあります-このドキュメントはcontribページからのものです編集: リンク):

deftrace

使用法:(定義名と定義)

defnの代わりに使用します。引数を含め、このfnの各呼び出し/戻りをトレースします。deftraceされた関数へのネストされた呼び出しは、ツリーのような構造を出力します。

libには他にも便利なメソッドがあります。

トレースライブラリの情報をどこで入手したかなど、その他のデバッグの提案。

于 2013-01-14T18:12:54.253 に答える
0

少し面倒ですが、生成されたコードを一時ファイルに書き込み、その後そのコンテンツをロードして評価すると、スタックトレースの行番号ごとにデバッグ情報が取得されます。

于 2013-01-14T17:30:49.917 に答える
0

他のすべてのコードと同様に、デバッグステートメント(ログなど)をコードに追加します。F10-F10-F10スタイルのデバッガーは、これ以上複雑なコードには役に立たないため、使用しないでください。

于 2013-01-14T15:55:32.927 に答える