Debugging Lisp展开/部分求值函数

Debugging Lisp展开/部分求值函数,debugging,lisp,common-lisp,Debugging,Lisp,Common Lisp,是否有一种方法可以在Common Lisp中显示评估步骤,如下所示: > (defun fac (n) (if (= n 0) 0 (if (= n 1) 1 (* n (fac (- n 1)))))) FAC > (step-by-step (fac 3)) 0: (FAC 3) 1: (* 3 (FAC 2)) 3: (* 3 (* 2 (FAC 1))) 4: (* 3 (* 2 (1))) 5: (* 3 2) 6: 6 Result: 6 寻找一种可视化递归和返回值的方

是否有一种方法可以在Common Lisp中显示评估步骤,如下所示:

> (defun fac (n) (if (= n 0) 0 (if (= n 1) 1 (* n (fac (- n 1))))))
FAC
> (step-by-step (fac 3))
0: (FAC 3)
1: (* 3 (FAC 2))
3: (* 3 (* 2 (FAC 1)))
4: (* 3 (* 2 (1)))
5: (* 3 2)
6: 6
Result: 6
寻找一种可视化递归和返回值的方法。 我知道
(步骤fn)
(优化(调试3))
不幸的是,这不会产生所需的输出,或者我不知道如何告诉它


注意:首选非emacs/slime解决方案

这并不是您所要求的一切,具体输出取决于实现,但您可能会从标准中获得一些很好的借鉴。它不会像您所展示的那样展示扩展,但它绝对是满足您某些需求的一种方式

[要]可视化递归和返回值,请查看每个步骤的整个表达式。就像每个函数调用都有一个调试打印

许多实现包括可以自定义跟踪方式、打印内容等的附加参数。以下是SBCL的默认行为示例:

CL-USER> (defun fac (n) (if (= n 0) 0 (if (= n 1) 1 (* n (fac (- n 1))))))
FAC
CL-USER> (trace fac)
(FAC)
CL-USER> (fac 3)
  0: (FAC 3)
    1: (FAC 2)
      2: (FAC 1)
      2: FAC returned 1
    1: FAC returned 2
  0: FAC returned 6
;=> 6
在CLISP中:

CL-USER> (fac 3)
1. Trace: (FAC '3)
2. Trace: (FAC '2)
3. Trace: (FAC '1)
3. Trace: FAC ==> 1
2. Trace: FAC ==> 2
1. Trace: FAC ==> 6
;=> 6

现在还不清楚输出应该如何生成,以及背后的原理是什么。您的示例看起来像Lisp可以进行术语重写,但它没有这样做。它使用了一个递归计算算法。我试图展示递归计算是如何被感知的。(步骤fn)做了一些接近的事情,但我希望看到每一步的整个表情。就像每个函数调用都有一个调试打印。Lisp中没有一个完整的表达式。您可以只跟踪您感兴趣的调用,或者您需要编写一个自定义求值,其中这些表达式是以某种方式构造的(例如使用堆栈)。好的,谢谢。我担心这可能是我唯一的选择。