有没有办法在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解决方案首选
答案 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