【问题标题】:Lisp introspection? when a function is called and when it exitsLisp 内省?何时调用函数以及何时退出
【发布时间】:2008-10-23 21:44:25
【问题描述】:

使用普通的 lisp,我假设具有自省属性。如何将代码添加到常见的 lisp 代码中,以告诉我何时调用函数以及何时完成执行。我想采用任何 lisp 代码和对代码的特殊修改。我用lisp的AST分析估计,应该是可以的。

【问题讨论】:

    标签: lisp introspection


    【解决方案1】:

    您可以使用(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]> 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Common lisp 有一个 TRACE 函数,它报告指定的每个调用的函数、参数和结果值。这是 Steel Bank 版本的文档页面,但您应该在大多数实现中找到类似的内容:

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

        该系统还包括一个分析器:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-16
          • 2020-06-07
          • 1970-01-01
          • 2011-01-06
          相关资源
          最近更新 更多