Каковы эффективные способы отладки 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 имеют тенденцию оптимизировать вызовы в стеке или сделать аргументы недоступными.