如何单步调试Common Lisp代码并查看表单返回值?
Common Lisp调试器单步执行并显示返回值的实现方法
Common Lisp的ANSI标准并未标准化调试器的单步追踪细节,这类显示每个表单返回值的功能属于具体实现的扩展特性,不同Common Lisp实现的支持方式和效果存在差异。
针对SBCL的实现方案
SBCL默认的step在编译代码下信息有限,但切换到解释模式后,单步执行时会显示每个表单的求值结果:
- 定义测试用阶乘函数:
(defun fact (n) (if (<= n 0) 1 (* n (fact (- n 1)))))
- 设置解释执行模式(避免编译代码丢失调试信息):
(setf sb-ext:*evaluator-mode* :interpret)
- 启动单步调试:
(step (fact 5))
在调试器提示符下输入n(代表next,单步执行),会逐行显示每个表单的求值过程及返回值:
Evaluating: (<= 5 0)
=> NIL
Evaluating: (- 5 1)
=> 4
Evaluating: (FACT 4)
... 后续递归步骤会依次显示对应表单的返回值
针对CMUCL的实现方案
CMUCL的step工具同样支持解释模式下的单步返回值显示,操作流程与SBCL类似:
- 定义阶乘函数(同上)。
- 确保函数以解释方式加载(默认未编译的函数即为解释模式)。
- 执行
(step (fact 5)),在调试器中输入n单步,即可看到每个表单的求值结果。
其他实现的差异
像CLISP、CCL(Clozure CL)这类实现,默认的step工具就会自动显示每个表单的返回值,无需额外配置。
内容的提问来源于stack exchange,提问作者Alessandro Bertulli
相关产品推荐
相关产品推荐

