Остановка бесконечных циклов при выполнении тестов clojure в emacs с leiningen и swank/slime
В некоторых видах кода относительно легко вызвать бесконечный цикл, не взрывая стек. При тестировании кода такого рода с помощью clojure-test можно ли прервать текущие запущенные тесты без перезапуска сервера swank?
В настоящее время мой рабочий процесс включает
$ lein swank
Подключитесь к swank с emacs, используя slime-connect
, и переключитесь на тесты, выполняйте с C-c C-,
, тесты запускаются до бесконечного цикла, а затем просто возвращаются, но один процессор все еще работает на тест. Единственный способ остановить это, который я нашел, - перезапустить lein swank, но, похоже, это будет относительно распространенная проблема? У кого-нибудь есть лучшее решение?
3 ответа:
Да, это обычная проблема для программистов, чтобы написать бесконечные циклы в разработке :). И ответ очень прост. Это называется "Команда прерывания", и это
Лейнинген не имеет к этому никакого отношения. Это слизь / Суонк / Клоджур. При оценке кода в Emacs вы создаете новый поток в Clojure. SLIME сохраняет ссылку на эти потоки и показывает, сколько из них запущено в Emacs modeline. Если вы находитесь в графической среде, вы можете нажать на модельную линию, где он указывает ваше пространство имен и видит множество вариантов. Один из вариантов - "команда прерывания"C-c C-b
Eval
(while true)
иC-c C-b
, чтобы получить диалоговое окно, показывающее ошибкуjava.lang.ThreadDeath
С, вероятно, только одним вариантом. Вы можете ввести0
илиq
, чтобы выйти из этого потока, убить буфер сообщений об ошибках и вернуть фокус к предыдущему буферу.
Согласно этой старой дискуссии, добавление
(use 'clojure.contrib.repl-utils))
и(add-break-thread!)
к пользователю.clj должен позволить вам нажатьC-c C-c
для передачи SIGINT в долго работающую оценку / processe.