我想使用一个步进函数来查看它是如何进入预期输出的,但它不起作用。
就像这个简单的例子:
(STEP (IF (ODDP 3) 'YES 'NO))
但没有任何反应。
有没有任何优化让我无法看到跟踪步骤???
如何关闭它?
谢谢!
答案 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定义,而不关心每个自我保存几个周期呼叫”。
或评估以下表格:
(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))