Остановка бесконечных циклов при выполнении тестов clojure в emacs с leiningen и swank/slime


В некоторых видах кода относительно легко вызвать бесконечный цикл, не взрывая стек. При тестировании кода такого рода с помощью clojure-test можно ли прервать текущие запущенные тесты без перезапуска сервера swank?

В настоящее время мой рабочий процесс включает

$ lein swank

Подключитесь к swank с emacs, используя slime-connect, и переключитесь на тесты, выполняйте с C-c C-,, тесты запускаются до бесконечного цикла, а затем просто возвращаются, но один процессор все еще работает на тест. Единственный способ остановить это, который я нашел, - перезапустить lein swank, но, похоже, это будет относительно распространенная проблема? У кого-нибудь есть лучшее решение?

3 12

3 ответа:

Да, это обычная проблема для программистов, чтобы написать бесконечные циклы в разработке :). И ответ очень прост. Это называется "Команда прерывания", и это C-c C-b

Лейнинген не имеет к этому никакого отношения. Это слизь / Суонк / Клоджур. При оценке кода в Emacs вы создаете новый поток в Clojure. SLIME сохраняет ссылку на эти потоки и показывает, сколько из них запущено в Emacs modeline. Если вы находитесь в графической среде, вы можете нажать на модельную линию, где он указывает ваше пространство имен и видит множество вариантов. Один из вариантов - "команда прерывания"

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.

Если все остальное не сработает.. alt-x slime-quit-lisp и перезапустить REPL. сначала, конечно, попробуйте ответить на вопрос Псилло.