Lispのイントロスペクション?関数が呼び出されたときと関数が終了したとき
-
04-07-2019 - |
質問
Common Lisp では、イントロスペクションのプロパティを想定しています。関数がいつ呼び出され、いつ実行が終了したかを知らせるコードを Common Lisp コードに追加するにはどうすればよいですか。任意の Lisp コードと、コードに対するこの特定の変更を取り込みたいと考えています。Lisp の AST 分析を使えば、これは可能だと思います。
解決
(trace function)
シンプルなメカニズム。より複雑なことについては、 comp.lang.lisp 。
[CL_USER]>
(defun fac (n)
"Naïve factorial implementation"
(if (< 1 n)
(* n (fac (- n 1)))
1))
FAC
[CL_USER]> (trace fac)
;; Tracing function FAC.
(FAC)
[CL_USER]> (fac 5)
1. Trace: (FAC '5)
2. Trace: (FAC '4)
3. Trace: (FAC '3)
4. Trace: (FAC '2)
5. Trace: (FAC '1)
5. Trace: FAC ==> 1
4. Trace: FAC ==> 2
3. Trace: FAC ==> 6
2. Trace: FAC ==> 24
1. Trace: FAC ==> 120
120
[CL_USER]>
他のヒント
CLOS がオプションの場合、他のメソッドの前後、前後に実行されるメソッドの前後、前後。
>Common Lisp には、指定された各呼び出しの関数、引数、および結果の値を報告する TRACE 関数があります。ここに Steel Bank のバージョンのドキュメント ページがありますが、ほとんどの実装で同様のものが見つかるはずです。
http://www.sbcl.org/manual/Function-Tracing.html
このシステムにはプロファイラーも含まれています。
所属していません StackOverflow