Lisp展开/部分评估功能

时间:2015-07-14 10:56:09

标签: 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

寻找一种可视化递归的方法,并为一个小课程返回一般值。 我知道(step fn)(optimize (debug 3)))遗憾的是,这不会产生所需的输出,或者我不知道如何告诉它。

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

1 个答案:

答案 0 :(得分:6)

这不是您要求的所有内容,具体的输出取决于实现,但您可以从标准trace中获得一些好的结果。它不会像您所展示的那样展示扩展,但它绝对是满足您某些需求的方式

  

[to]可视化递归并返回一般值...以查看每一步的整个表达式。就像每个函数调用的调试打印一样。

许多实现包括可以自定义事物跟踪方式,打印内容等的其他参数。以下是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