LINUX.ORG.RU

[lisp] как расширить отладчик

 


0

1

В отладчике обычно есть один или несколько рестартов. Я хочу сделать следующее: когда asdf показывает ошибку, сложно понять, к какому файлу эта ошибка относится. Это нетехнологично. В то же время, компонент имеется в стеке и его можно узнать (из кода).

Я хочу добавить свой restart «редактировать» к тому, которые предлагает asdf. Мне нужно, чтобы этот restart вызвал мою функцию (открывающую файл для редактирования) и после этого остался в дебаггере. Т.е., по сути я хочу добавить ещё одну команду дебаггера. Можно ли это сделать и если да, то как? Я что-то не вижу способа (обходные пути не надо предлагать, я их знаю, мне нужен именно такой путь). Как минимум, нужна возможность повторно вызвать ошибку, а ещё лучше, просто выполнить функцию и остаться в подсказке дебаггера, но чтобы эта функция вызывалась так же, как продолжение, через :c.

★★★★★

Хех. То ли лисперы спят, то ли я задал сверхзадачку. Вот моё решение (прагматичное, но кривое). Извините, патч делать в офтопике не знаю чем, поэтому будет весь файл asdf.lisp целиком.

http://ecovillage.narod.ru/lisp/asdf.lisp.txt

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Общая идея - устанавливаю «пустой» рестарт, который эквивалентен повторной попытке. Этот рестарт нужен только для того, чтобы вывести следующий текст (для склеротиков, таких, как я).

5 To edit system1-file1, type in asdf::e, to edit system1, type in asdf::ep

Далее юзер пускай сам набирает asdf::e или asdf::ep, которым назначены define-symbol-macro.

Хотя, может быть, SLIME всё это и так умеет, я не знаю.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

> То ли лисперы спят, то ли я задал сверхзадачку.

Заходи на lisper.ru ;) Обсуждать на ЛОРе такие вопросы не прёт, да и не все на ЛОР ходят.

archimag ★★★
()
Ответ на: комментарий от archimag

Да ладно, вопрос уже снят. На лиспер.ру когда нибудь зайду. Хотя я надеюсь, что отпустит меня эта программерская мания.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Хотя можно бы ещё кое о чём подумать. Например, как находить место ошибки в других случаях. Я знаю (в теории, на практике может не получиться) как сделать это для случаев «неправильно поставленная запятая в шаблоне» и «закрывающая скобка на верхнем уровне». Для начала хотелось бы узнать, есть ли православный способ диагностировать подобные проблемы (например, в SLIME).

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Если ты можешь вытащить имена файлов из condition, то попробуй restart-bind. Он по умолчанию не выходит из дебаггера (см. (macroexpand '(restart-case ...))). Чтобы в рестарт передать condition, можно сконструировать замыкание. Вот пример:

(let (condition)       
  (restart-bind ((edit (lambda () (ed (get-file-name condition)))
                       :test-function (lambda (c) (setf condition c))))
    (blah)))
anonymous
()
Ответ на: комментарий от anonymous

О, спасибо, именно этой фишки и не хватало. Про test-function я просто не знал. Так будет нормально?

(let (condition)       
  (restart-bind ((edit (lambda () (ed (get-file-name condition)))
                       :test-function (lambda (c) (setf condition c))))
    (edit-file-at-error condition) ; открываем в другом треде
    (signal condition) ; чтобы остаться в дебаггере   
  ))
Тут, правда, ещё вопрос, как перешибить compile-file. У меня есть небольшое API для безопасной подмены кода функции с возможностью вызова старой функции. Смысл в том, что оно безопасно, даже если его используешь два раза - функция подменяется только один раз. Видимо, возможность подмены compile-file зависит от реализации. Или можно менять команды редактора.

Тут, кстати, я наконец-то прочитал мануал и узнал, наконец, как выключить ту вещь, которая меня всю жизнь бесила: лисп (был) слишком многословен и печатал при компиляции, например, имена всех функций, которые он скомпилировал, а также настройки оптимизации. Я это отключил, хотя у меня есть подозрение, что теперь я не смогу понять, где находится «error between functions».

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.