Emacs/Slime and SBCL: stepping - Lisp
Формулировка задачи:
Друзья, конкретно у меня никогда не было мысли пользоваться пошаговой отладкой в Common Lisp, и тут:
Известно, что Common Lisp спроектирован таким образом, что при возникновении ошибки стек не опустошается и в отладчике мы, как минимум, всегда можем посмотреть backtrace и информацию об окружении. Посему значимость пошаговой отладки драматически уменьшается и можно обойтись без неё.
Но всё же я допускаю, что может быть удобно пошагать чутка вперёд и посмотреть что будет после исправления, например, корректируемой ошибки.
Я разобрался. В SBCL есть степпер http://www.sbcl.org/manual/#Single-Stepping. Он работает иногда странно: вычислят формы без спросу. Но, на сколько я понял, такие формы, которые не очень интересны (некоторые функции из стандартной библиотеки). Но весь пользовательский код потенциально может быть пройден. То есть имеем вполне пригодный к использованию степпер.
В Slime заявлена функциональность подобной отладки: https://www.common-lisp.net/project/....html#Stepping. И оно работает! Эта фича поддерживает SBCL-ый степпер. С Clozure CL всё плохо. Поэтому, если нужна такая функциональность, CCL выбирать нельзя.
Товарищ
Также я привык к [...], к пошаговому отладчику [...].
Почему я должен быть наказан и лишён всего этого, если я хочу программировать на лиспе? В чём профит? Отвечу: а просто ни в чём. Нет никакого профита, мазохизм в чистом виде. Я программирую на лиспе _вопреки_ убожеству тех средств разработки, которые для лиспа предлагаются.
budden
, тебе нужна была такая функциональность, а ты не разобрался и зазря поругал Emacs и Lisp. Ц-ц-ц не хорошоРешение задачи: «Emacs/Slime and SBCL: stepping»
textual
Листинг программы
(cl:defun ЛВГ::Ж1 (ЛВГ::А cl:&key (ЛВГ::Б 1 ) ) (cl:declare (cl:type COMMON-LISP:INTEGER ЛВГ::А )) (perga-implementation:perga ЛВГ:|тело| (ТРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1| "Вход в сост.оп") (ТРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1| (ЯР-СТ-БИБ::-° NIL ЛВГ::А ЛВГ::Б ))) )
Объяснение кода листинга программы
В коде определен функционал для реализации шагов в emacs/slime и SBCL. Список функций с номерами до 20:
- (cl:defun ЛВГ::Ж1 (ЛВГ::А cl:&key (ЛВГ::Б 1) )
- (cl:declare (cl:type COMMON-LISP:INTEGER ЛВГ::А ))
- (perga-implementation:perga ЛВГ:|тело|
- (ТРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1|
Вход в сост.оп
) - (ТРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1| (ЯР-СТ-БИБ::-° NIL ЛВГ::А ЛВГ::Б )))
В первом определении функции (1) используется ключевое слово cl:&key для создания ключевого слова, которое может принимать одно значение, указанное в скобках. Ключевое слово имеет значение 1.
Во втором определении (2) используется декларация типа для переменной ЛВГ::А, которая должна быть типа COMMON-LISP:INTEGER.
В третьем определении (3) используется функциональный тип PERGA для реализации шагов в Emacs/Slime и SBCL.
В четвертом определении (4) используется функциональный тип TРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1| для реализации шагов в Emacs/Slime и SBCL.
В пятом определении (5) используется функциональный тип TРАНСЛЯТОР-ЯРА-В-ЛИСП::|Стоп-выр-1| для реализации шагов в Emacs/Slime и SBCL.
Некоторые переменные, используемые в коде:
- ЛВГ::А
- ЛВГ::Б
- NIL В коде также используются функциональные типы и ключевые слова, которые специфичны для реализации шагов в Emacs/Slime и SBCL.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д