一般的な Lisp では、イントロスペクションのプロパティを想定しています。関数がいつ呼び出され、いつ実行が終了したかを知らせるコードを一般的な Lisp コードに追加するにはどうすればよいですか。Lispコードと、このコードへの特定の変更を取りたいと思います。私は、Lisp の AST 分析を考えれば、これは可能であるはずです。
質問する
997 次
3 に答える
6
(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]>
于 2008-10-24T06:25:12.410 に答える
3
CLOSがオプションの場合、他のメソッドの前、後、および周囲で実行される before、after、および around メソッドがあります。
于 2008-10-28T03:41:44.417 に答える
2
Common Lisp には、指定された各呼び出しの関数、引数、および結果の値を報告する TRACE 関数があります。これは Steel Bank のバージョンのドキュメント ページですが、ほとんどの実装で同様のものを見つける必要があります。
http://www.sbcl.org/manual/Function-Tracing.html
システムにはプロファイラーも含まれています。
于 2008-10-23T22:27:24.577 に答える