Как смотреть локальные переменные с помощью встроенного отладчика Emacs на Common LISP? - PullRequest
0 голосов
/ 10 февраля 2019

Я пишу общий код LISP с помощью sbcl и slime на моем iMac.Я могу вызвать встроенный отладчик Emacs, вставив (break) между строками кода или вызвав (step) функцию.Ниже приведен шаг процедуры отладки.

Restarts:
 0: [STEP-CONTINUE] Resume normal execution
 1: [STEP-OUT] Resume stepping after returning from this function
 2: [STEP-NEXT] Step over call
 3: [STEP-INTO] Step into call
 4: [RETRY] Retry SLIME REPL evaluation request.
 5: [*ABORT] Return to SLIME's top level.
 --more--

Backtrace:
  0: ((LABELS RECURSE :IN PARTIAL-EVAL) X)
      Locals:
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = X
        #:G0 = X
  1: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
  2: ((LABELS RECURSE :IN PARTIAL-EVAL) (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
      Locals:
        ARGS#1 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        #:G0 = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        #:G5 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        OP = -
  3: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (1 (- A X (- C C) (- 9 9) (+ Z # #))))
  4: ((LABELS RECURSE :IN PARTIAL-EVAL) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))))
      Locals:
        ARGS#1 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        #:G0 = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        #:G5 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        OP = /
  5: (PARTIAL-EVAL (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
  6: ((LAMBDA (&REST SB-DI::ARGS) :IN SB-DI::HANDLE-SINGLE-STEP-AROUND-TRAP) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
  7: ((LAMBDA ()))
  8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((SB-IMPL::*STEP-OUT* :MAYBE)) (UNWIND-PROTECT (SB-IMPL::WITH-STEPPING-ENABLED #))) #S(SB-KERNEL:LEXENV :FUNS NIL :VARS NIL :BLOCKS NIL :TAGS NIL :TYPE-RESTRICTIONS ..
  9: (SB-INT:SIMPLE-EVAL-IN-LEXENV (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))) #<NULL-LEXENV>)
 10: (EVAL (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))))
 --more--

Когда я расширяю каждый стек, я могу отслеживать и видеть некоторые локальные переменные, но не все локальные переменные.Как я могу добавить эти отсутствующие локальные переменные в список наблюдения?Когда я использовал другую IDE, наблюдать за переменными было очень легко, но в Emacs я не смог найти, как это сделать.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Как я сказал в комментарии, возможно, что переменные, которые не появляются в отладчике, еще не связаны.Например, внутри конструкции, такой как LET, когда несколько лексических переменных вводятся и ограничиваются некоторым значением, если в отладчике отображается только несколько из них, это может означать, что ошибка произошла при оценке формы инициализациипервая переменная не показана.

Конечно, это зависит также от системы времени выполнения (компилятор или интерпретатор), поэтому рекомендуется следовать советам Evhince и правильно настроить параметры оптимизации.

0 голосов
/ 11 февраля 2019

Возможно, что компилятор оптимизирует вещи и, таким образом, скрывает промежуточные переменные.Вы можете попробовать

(declaim (optimize (speed 0) (space 0) (debug 3)))

(и перекомпилировать ваш код)

https://lispcookbook.github.io/cl-cookbook/debugging.html#the-interactive-debugger

Вы также говорите о функции отладчика «watch»: она недоступно в SBCL, но в других реализациях (например, LispWorks).https://lispcookbook.github.io/cl-cookbook/debugging.html#advise-and-watch

...