Lispのイントロスペクション?関数が呼び出されたときと関数が終了したとき

StackOverflow https://stackoverflow.com/questions/231649

  •  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]> 

他のヒント

Common Lisp には、指定された各呼び出しの関数、引数、および結果の値を報告する TRACE 関数があります。ここに Steel Bank のバージョンのドキュメント ページがありますが、ほとんどの実装で同様のものが見つかるはずです。

http://www.sbcl.org/manual/Function-Tracing.html

このシステムにはプロファイラーも含まれています。

http://www.sbcl.org/manual/Det​​erministic-Profiler.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top