STEP宏在Clozure CL中不起作用

时间:2012-02-23 14:30:48

标签: common-lisp ccl

我想使用一个步进函数来查看它是如何进入预期输出的,但它不起作用。

就像这个简单的例子:

(STEP (IF (ODDP 3) 'YES 'NO))

但没有任何反应。

有没有任何优化让我无法看到跟踪步骤???

如何关闭它?

谢谢!

5 个答案:

答案 0 :(得分:3)

我不认为Clozure CL支持踩踏。 IIRC尚未资助此功能。这需要一些工作,因为Clozure CL缺少一个解释器(可以相对无痛地支持步进)。

其他实现支持步进。

答案 1 :(得分:3)

CCL不支持STEP。

TRACE解决方案:

  

当使用DEFUN定义(全局命名的)函数FOO时,允许编译器假定对该函数名的函数引用引用所定义的函数(除非它们是词法阴影的);因此,它可以在自调用(从FOO内调用FOO)中跳过隐式SYMBOL-FUNCTION(“调用FOO的功能单元中的任何内容”)。这会在这些调用上保存一两条指令,但是(从TRACE通过更改SYMBOL-FUNCTION返回的内容来工作,这些内联自调用无法跟踪。

     

但是,如果函数名在自调用时声明为NOTINLINE,编译器不能这样做(甚至不能假设DEFUN定义的内容不会在以后重新定义):

示例:

? (defun fact (x acc)
    (declare (notinline fact))
    (if (= x 0)
        acc
        (fact (- x 1) (* x acc))))

? (trace fact)
NIL

? (fact 3 1)
0> Calling (FACT 3 1) 
 1> Calling (FACT 2 3) 
  2> Calling (FACT 1 6) 
   3> Calling (FACT 0 6) 
   <3 FACT returned 6
  <2 FACT returned 6
 <1 FACT returned 6
<0 FACT returned 6

? (step (fact 3 1))
0> Calling (FACT 3 1) 
 1> Calling (FACT 2 3) 
  2> Calling (FACT 1 6) 
   3> Calling (FACT 0 6) 
   <3 FACT returned 6
  <2 FACT returned 6
 <1 FACT returned 6
<0 FACT returned 6
  

这是对编译器说的方式,“作为一个政策问题,我宁愿有能力追踪调用自己的函数,并使用DEFUN定义,而不关心每个自我保存几个周期呼叫”。

来自:DebugWithOpenMCL

或评估以下表格:

(DECLAIM (OPTIMIZE (DEBUG 3)))

在定义任何要跟踪的函数之前。

答案 2 :(得分:3)

这是因为我在CCL上实现了CL:STEP,我实现了com.informatimago.common-lisp.lisp.stepper。 你可以通过quicklisp获得它。 文档位于:https://gitorious.org/com-informatimago/com-informatimago/source/2b53ae44e8fa4d040fafcf4d93976500a8e464dc:common-lisp/lisp/stepper-packages.lisp#L146

答案 3 :(得分:1)

此库不再分布在quicklisp上,但是当作为本地quicklisp项目安装时,它可以成功构建。

答案 4 :(得分:0)

使用cl-stepper:step而不是cl-user:step,'因为Clozure CL不支持它。 如果您已经安装了quicklisp,请尝试安装它:像这样。

(ql:quickload "com.informatimago.common-lisp.lisp.stepper")

(defpackage :test (:use :cl-stepper))
(in-package :test)

(def bar (hoge)
;; define some function
)

(step (bar 3))