2011-02-25 19 views
12

W niektórych rodzajach kodu stosunkowo łatwo wywołać nieskończoną pętlę bez dmuchania stosu. Czy testowanie kodu tego typu przy użyciu testu clojure jest sposobem na przerwanie bieżących testów bez restartowania serwera?Zatrzymywanie nieskończonych pętli podczas wykonywania testów clojure w emacs z leiningen i swank/slime

Obecnie mój workflow został zaangażowany

$ lein swank 

Połącz z Swank z emacs korzystających slime-connect i przełączyć się do testów, wykonanie z C-c C-,, testy zakończą się aż nieskończoną pętlę, a potem po prostu wrócić, ale jeden procesor jest nadal ubijaniu na próbie. Jedynym sposobem na powstrzymanie tego, co znalazłem, jest ponowne uruchomienie lein swank, ale wydaje się, że byłby to stosunkowo powszechny problem? Ktoś ma lepsze rozwiązanie?

Odpowiedz

12

Tak, dla programistów powszechnym problemem jest pisanie nieskończonych pętli w rozwoju :). Odpowiedź jest bardzo prosta. Nazywa się to "Rozkazem przerywania" i nie ma nic wspólnego z Leiningenem. To jest SLIME/Swank/Clojure. Kiedy oceniasz kod w Emacs, spawnujesz nowy wątek w Clojure. SLIME odwołuje się do tych wątków i pokazuje, ile osób pracuje w modeline Emacs. Jeśli znajdujesz się w środowisku graficznym, możesz kliknąć modeline, w którym wskazuje on Twój obszar nazw i zobaczyć wiele opcji. Jedną opcją jest "Polecenie przerwań":

Eval (while true) i C-c C-b, aby uzyskać okno dialogowe z błędem java.lang.ThreadDeath z prawdopodobnie jedną opcją. Możesz wpisać 0 lub q, aby zamknąć ten wątek, zabić bufor komunikatu o błędzie i przywrócić poprzedni bufor.

1

Zgodnie this old discussion, dodając (use 'clojure.contrib.repl-utils)) i (add-break-thread!) do user.clj powinny umożliwić Ci wcisnąć C-c C-c przekazywania SIGINT na długo systemem oceny/processe.

+0

Moja obecna konfiguracja Emacsa wiąże 'C-c C-c' z' przerywaniem śluzu' które zachowuje się tak, jak można się spodziewać – skuro

1

jeśli wszystko inne zawiedzie ... alt-x slime-quit-lisp i zrestartuj REPL. spróbuj najpierw odpowiedzi Psyllo.