Как я могу выполнить пошаговую отладку в Common Lisp ECL? - PullRequest
2 голосов
/ 26 февраля 2020

Я изучаю Common Lisp, используя ECL. Я попытался сослаться на https://malisper.me/debugging-lisp-part-1-recompilation/ для метода отладки, но выполнение шага не работало должным образом.

Когда я вставляю «(break)» и выбираю «RETRY», обработка останавливается первой в перерыве. Это намеренное поведение, как показано на странице выше.

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

При следующем нажатии клавиши S было отображено следующее сообщение об ошибке, даже если на него нужно было пойти.

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

1 Ответ

3 голосов
/ 26 февраля 2020

Один вариант: STEP в ECL. Используйте :h для просмотра команд в шаговом двигателе.

> (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
#<a DIVISION-BY-ZERO>

Available restarts:

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

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