Остановка бесконечных циклов при выполнении тестов 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-bEval
(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.