2011-02-25 10 views
12

In determinati tipi di codice è relativamente facile provocare un loop infinito senza far esplodere lo stack. Quando si prova un codice di questa natura usando il clojure-test, c'è un modo per interrompere i test correnti senza riavviare il server swank?Arresto di loop infiniti durante l'esecuzione di test del clojure in emacs con leiningen e swank/slime

Attualmente il mio flusso di lavoro ha coinvolto

$ lein swank 

Connect to Swank con emacs utilizzando slime-connect, e passare le prove di, eseguire con C-c C-,, i test eseguiti fino loop infinito, poi basta tornare, ma una CPU è ancora sfornando via sul test. L'unico modo per fermare questo ho trovato è quello di riavviare lein Swank, ma sembra che questo sarebbe un problema relativamente comune? Qualcuno ha una soluzione migliore?

risposta

12

Sì, è un problema comune per i programmatori scrivere cicli infiniti nello sviluppo :). E la risposta è molto semplice. Si chiama "Interrupt Command" ed è C-c C-b

Leiningen non ha nulla a che fare con questo. Questo è SLIME/Swank/Clojure. Quando valuti il ​​codice in Emacs stai generando un nuovo thread all'interno di Clojure. SLIME mantiene il riferimento a quei thread e mostra quanti sono in esecuzione nella modeline Emacs. Se ti trovi in ​​un ambiente grafico puoi fare clic sulla modeline dove indica il tuo spazio dei nomi e vedere molte opzioni. Un'opzione è "Interrupt Command"

Eval (while true) e C-c C-b per ottenere una finestra di dialogo che mostra un errore java.lang.ThreadDeath con probabilmente solo un'opzione. È possibile digitare 0 o q per uscire da quel thread, eliminare il buffer dei messaggi di errore e restituire lo stato attivo al buffer precedente.

1

Come da this old discussion, aggiungendo (use 'clojure.contrib.repl-utils)) e (add-break-thread!) per user.clj dovrebbe consentire di premere C-c C-c per il passaggio SIGINT alla valutazione/processe lunga corsa.

+0

Il mio attuale setup di Emacs lega 'C-c C-c' a' slime-interrupt' che si comporta come ci si aspetterebbe – skuro

1

se tutto il resto fallisce .. alt-x slime-quit-lisp e riavviare REPL. prova la risposta di Psyllo prima di tutto.