Lisp内省?当一个函数被调用并退出时

时间:2008-10-23 21:44:26

标签: lisp introspection

使用常见的lisp,我假设内省属性。如何将代码添加到常用的lisp代码中,这些代码将告诉我何时调用函数以及何时执行完毕。我想采取任何lisp代码和代码的这种特殊修改。我想通过lisp的AST分析,这应该是可能的。

3 个答案:

答案 0 :(得分: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]> 

答案 1 :(得分:3)

如果CLOS是一个选项,则其before, after, and around methods在其他方法之前,之后和周围运行。

答案 2 :(得分:2)

Common lisp有一个TRACE函数,用于报告指定的每个调用的函数,参数和结果值。这是Steel Bank版本的doc页面,但在大多数实现中你应该找到类似的东西:

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

系统还包括一个分析器:

http://www.sbcl.org/manual/Deterministic-Profiler.html