Как я могу сделать след Sly's разумным? - PullRequest
0 голосов
/ 10 января 2020

Всякий раз, когда я получаю сообщение об ошибке, Sly отображает перезагрузку и возврат. Я видел людей на inte rnet, у которых есть читаемые следы, которые являются разумными вызовами функций. Когда я вписываю (fun duf) в ответ, я получаю что-то вроде этого:

Backtrace:
 0: ((LAMBDA ()))
 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (FUN DUF) #<NULL-LEXENV>)
 2: (EVAL (FUN DUF))
 3: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
 4: (SLYNK::CALL-WITH-RETRY-RESTART "Retry SLY mREPL evaluation request." #<CLOSURE (LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1) {100308AA1B}>)
 5: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
 6: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER))
 7: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (* . 13) (** . 10) (***) (/ 13) (// 10) ...) #<CLOSURE (LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER) {100308A68B}>)
 8: (SLYNK-MREPL::MREPL-EVAL-1 #<SLYNK-MREPL::MREPL mrepl-2-2> "(fun duf)")
 9: (SLYNK-MREPL::MREPL-EVAL #<SLYNK-MREPL::MREPL mrepl-2-2> "(fun duf)")
...

Это намного больше. Это делает невозможным для меня отладку моего кода. Я пробовал: (declaim (optimize (debug 3))), но это не имеет значения. Кроме того, даже если вызов является реальной функцией, вывод не лучше. Я пытался с gnuclisp и sbcl.

1 Ответ

4 голосов
/ 12 января 2020

Я думаю, что вы чувствуете, что многое из того, что вы видите, является «мусором» только потому, что вы еще не знаете, что это такое.

  • В строках 9 и 8 вы видите функции что REPL использует для обработки вашего ввода. На этом этапе вход является строкой, как вы можете видеть.
  • В строке 7 есть некоторые привязки, помещенные в стек, так что используется правильный пакет, и от * до *** привязываются к последним результатам (удобная функция для REPL).
  • В строке 6, call-with-listener, вероятно, устанавливает, что вывод должен go Sly.
  • В строке 5 эта анонимная функция - та, которая содержится в замыкании, которое было аргументом в строке 6. Другими словами, подробности реализации.
  • В строке 4 устанавливается перезапуск retry. В этом кадре управление будет передано, если вы вызовете перезапуск Retry в отладчике.
  • В строке 3 вы снова увидите выполнение аргумента функции. Обратите внимание на call-with-… соглашение об именах.
  • В строке 2 вы видите, что ваш ввод был read , т.е. преобразован в структуру данных lisp. Теперь он оценивается с помощью стандартной функции eval.
  • В строке 1 вы видите, как SBCL делает это в этом случае - подробности реализации.
  • В строке 0 вы видите некоторое анонимное функция, опять же что-то, что исходит из реализации eval.

Здесь особо не на что смотреть, потому что первое, что eval делает, это оценивает duf, что не получается.

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

Что вам нужно узнать, так это узнать, где вы находитесь интересует старты. Здесь все эти вещи Slynk (очевидно?) Ниже вашего контекста, так что вам действительно нужно смотреть на деталь только до первой строки eval. В данном случае это только первая строка, которая имеет смысл, потому что введенная вами строка просто не срабатывает при первом поиске. Для Sly-разработчика эти кадры с более низким стеком могут быть интересны.

Конечно, в более реалистичном c сценарии ios есть некоторые реализации, которые имеют более четкие обратные следы, чем другие. Это не то, что Хитрый может что-то сделать. Что он делает, так это дает вам возможность перейти с любой строки в обратном следе к соответствующей позиции исходного файла, если она доступна (в SLIME это v (просмотр), не знаю о Sly). Вы можете сделать гораздо больше, например, проверить локальные привязки / переменные / аргументы и вызвать перезапуски. Взгляните на руководство.

...