Каковы эффективные способы отладки Common Lisp в Emacs и SLIME?

Мне интересно, каковы некоторые эффективные способы отладки Common Lisp интерактивно с помощью Emacs и SLIME.

что я делал раньше: как кто-то, кто изучил C и Python с помощью IDEs (VS и PyCharm), я привык устанавливать точки останова, добавлять часы и делать шаг. Но когда я начал использовать CL, я обнаружил, что рабочий процесс отладки принципиально отличается. Я не нашел хороших способов установить точки останова, шагнуть через линии и посмотреть, как меняются переменные.

тупой метод, который я использовал, добавлял "печать" в коде и запускал код снова и снова, что очень неэффективно. Я знаю, что мы можем "проверять" переменные в SLIME, но не уверен, как это сделать в интерактивном режиме.

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

что хочется: Я искал в интернете, но нашел минимальные учебники, демонстрирующие, как опытный Lisper на самом деле разработка и отладка своих программ. Мне не терпится узнать о таком опыте.

  • как отлаживать интерактивно?
  • Каковы некоторые хорошие практики и советы? Как добавить точку останова и шаг?
  • какие ярлыки / инструменты / рабочий процесс вы используете чаще всего / найти большинство полезно при отладке?

1 ответов


есть ряд вещей, которые вы можете сделать:

  • вы можете отслеживать вызов функции (см. TRACE и UNTRACE В общем Lisp или slime-toggle-trace-fdefinition*). Это помогает при рекурсивных вызовах: вы можете видеть, что вы передаете и что они возвращают на каждом уровне.
  • стандартная вещь: добавить (format t ...) в местах. Думаю, не стоит комментировать.
  • если код ломается, вы попадете в отладчик. Оттуда вы можете изучить стек, посмотреть, что было вызвано и какие аргументы были пройденный. См. ссылку @jkiiski: у нее действительно отличная информация об этом, включая (break) форма, которая будет действовать как точка останова и приведет вас к отладчику. спойлер: вы можете изменить значения в инспекторе, вы можете изменить и повторно скомпилировать свой код и перезапустить из (почти) любого места в стеке.
  • последнее, но не менее важное: для отладки макросов вам понадобится slime-macroexpand-1 (обертка над MACROEXPAND-1) и даже лучше C-c M-e для макроса stepper.

последний совет: если вы хотите сделать серьезную отладку, включите (declaim (optimize (debug 3))) в вашем файле, в противном случае некоторые реализации CL имеют тенденцию оптимизировать вызовы в стеке или сделать аргументы недоступными.