3

これはClojure のフォローアップです: Pre/Post 関数のコンパイル時挿入

私の目標は、例外をスローする代わりにデバッグ関数を呼び出すことです。これを達成するために、スタック フレーム、関数呼び出し、およびそれらの引数のリストを保存する最良の方法を探しています。

関数 (my-uber-debug) が必要なので、(例外をスローする代わりに) 関数を呼び出すと、次のことが起こります。

  • 新しい Java ウィンドウがポップアップします
  • 現在のclojureスタック フレームの記録があります
  • スタック フレームごとに、関数に渡された引数の記録があります。

これは、スタック フレームを上下に移動し、渡された引数を調べて現在のポイントに到達できるようにするためです。[どういうわけか、魔法のように、「let」環境で定義された変数を取得できれば、それも素晴らしいことです。]

現在のアイデア

スレッド ローカル変数uber-debugを用意します。この変数の型は次のとおりです: List of StackFrames where StackFrame = function + arguments

各関数呼び出しでプッシュし (cons 現在の関数 + uber-debugへの引数)、関数呼び出しの最後にuber-debugから最初の要素を削除します。

次に、(my-uber-debug) を呼び出すと、新しい Java ウィンドウがポップアップ表示され、uber-debugを操作できるようになります。

質問

これまでのアイデアは、おそらくこれを設定するには理想的ではありません。この問題を解決する正しい方法は何ですか?

編集:

質問は Swing/GUI 部分に関するものではありません。スタックフレームの格納方法についてです。

ありがとう!

4

1 に答える 1

0

あなたの答えは多くの要因に依存する可能性があるので、私の考えを述べてこれに答えるつもりです.

例外が発生したときに関数呼び出しとそのパラメーターを格納するだけの場合は、マクロまたは関数をラッパーとして記述して、これを実現します。次に、呼び出されるすべての関数をこのラッパーに渡す必要があります。ラッパーは、try catch 操作とその他の必要なものを実行します。

ラッパーを作成するだけでなく、 Clojure のメタデータを調べることもできます。これは、実行中のコードがそのメタデータを見て、それに基づいて決定を下す可能性があるためです。メタデータを使用したことはありませんが、リンクの情報は有望に見えます。

最終的な考えとして、元の投稿を編集してそこに情報を配置することで、これを行うことで達成したいことをさらに明確にすることが役立つ場合があります.

たとえば、これらのスタック トレースはライブラリまたはメイン プログラムですか?

このすべての情報の保存に関して、複数のスレッドがそれを必要としますか、それとも 1 つだけですか?

プログラムの最上位レベルで let バインディングに情報を格納することで取得できますか、それとも ref のようなものが必要ですか?

于 2012-06-09T18:35:33.153 に答える