关于 slime:如何在 Common Lisp ECL 中执行分步调试?

How can I execute step-by-step debugging in Common Lisp ECL?

我正在使用 ECL 学习 Common Lisp。我尝试参考 https://malisper.me/debugging-lisp-part-1-recompilation/ 的调试方法,但步骤执行不正常。

当我插入 "(break)" 并选择 "RETRY" 时,处理首先在中断处停止。这是如上页所示的预期行为。

1
2
3
4
5
6
(defun fib (n)
  (break)
  (if (<= 0 n 1)
      (/ 1 0)
      (+ (fib (- n 1))
         (fib (- n 2)))))
1
2
Break
   [Condition of type SIMPLE-CONDITION]

我下一次按 S 键时,显示以下错误消息,即使它应该已被踩。

1
2
3
4
5
6
7
8
9
SWANK/BACKEND: ACTIVATE-STEPPING not implemented
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [ABORT] Return to sldb level 1.
 1: [CONTINUE] Return from BREAK.
 2: [RETRY] ??Retry SLIME REPL evaluation request.
 3: [* ABORT] Return to SLIME's top level.
 4: [ABORT] ABORT

这可能是ECL实现的问题,但是我想知道ECL中一般都做什么样的调试。

最好的问候,
NOEU


一个选项:ECL 中的 STEP。使用 :h 查看??步进器中的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
> (defun fib (n)                                                                                                            
    (if (<= 0 n 1)                                                                                                            
        (/ 1 0)                                                                                                                
        (+ (fib (- n 1))                                                                                                      
           (fib (- n 2)))))

FIB
> (step (fib 3))
 (FIB 3) -
 (BLOCK FIB ...) -
 (IF (<= 0 ...) ...) -
 (<= 0 ...) -
 (+ (FIB #) ...) -
 (FIB (- N ...)) -
 (- N ...) -
 (BLOCK FIB ...) -
 (IF (<= 0 ...) ...) -
 (<= 0 ...) -
 (+ (FIB #) ...) -
 (FIB (- N ...)) -
 (- N ...) -
 (BLOCK FIB ...) -
 (IF (<= 0 ...) ...) -
 (<= 0 ...) -
 (/ 1 ...) -

Condition of type: DIVISION-BY-ZERO
#

Available restarts:

1. (RESTART-TOPLEVEL) Go back to Top-Level REPL.

Broken at FIB. In: #<process TOP-LEVEL 0x104f16f80>.