Lisp展开/部分评估功能

Roc*_*ock 3 lisp debugging 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
Run Code Online (Sandbox Code Playgroud)

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

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

Jos*_*lor 6

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

[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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)