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