2015-06-16 24 views
9

Quando lancioCome interrompere l'esecuzione in GHCI?

ghci> last [0..] 

posso interromperla con Ctrl + C.

Tuttavia

ghci> last (repeat 0) 

non può essere interrotto con Ctrl + C. GHCI ignora silenziosamente i tasti.

Come interrompere questo comando in GHCI? E 'un errore?

+0

Ho anche notato questo, così sarò felice di vedere una risposta, anche. Forse * è * un bug? – AJFarmar

+5

Temo che quest'ultimo comando non stia mai assegnando memoria. In tal caso, lo scheduler dei thread di GHC è (IIRC) sleale e non trasferirà mai il controllo ad altri thread, né permetterà che l'eccezione asincrona da Ctrl-C venga consegnata. (Per essere onesti, questo era il caso molto tempo fa, e non so se hanno lavorato attorno a questo in qualche modo.) – chi

+0

Conosco il problema di cui stai parlando, ma almeno per me (in GHC- 7.10), Ctrl + C _does_ interrupt 'last (repeat 0)'! –

risposta

9

(Caveat lector:.. Io uso Linux, e zsh corsa su urxvt o gnome-terminal Se si utilizza un sistema diverso operativo, terminale o shell, è possibile questo lavoro in modo diverso per voi)

Il Il modo in cui solitamente gestisco questo è di premere Ctrl + Z (che lo mette in secondo piano, sospendendo l'esecuzione interamente come un effetto collaterale) e poi uccidi il lavoro. Di solito questo è kill %1, anche se è possibile eseguire jobs per ricontrollare.

È anche possibile avviare un nuovo terminale e fare qualcosa come killall -9 ghci, ma questo ha un costo di risorse molto più alto: si stanno generando alcuni nuovi processi, si aprono connessioni X, si fa tutto ciò che fa il terminale quando si inizializza, fare tutto ciò che fa la shell quando si inizializza da solo, ecc. Se ti trovi nella situazione, mi trovo spesso in - ghci si sta scambiando come un matto - che dà a ghci più tempo per rovinare tutto.

0

Ctrl+Z sembra lasciare la shell, ma non chiude completamente il processo.

Per esempio

$ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> 
[4]+ Stopped     ghci 
$ ps 
    PID TTY   TIME CMD 
3160 pts/1 00:00:00 bash 
3554 pts/1 00:00:21 emacs 
5602 pts/1 00:00:00 ghc 
5693 pts/1 00:00:00 ps 

Tuttavia, se lo fai Ctrl+D

$ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> 
Leaving GHCi. 
$ ps 
    PID TTY   TIME CMD 
3160 pts/1 00:00:00 bash 
3554 pts/1 00:00:21 emacs 
5870 pts/1 00:00:00 ps 

Quindi il modo corretto di chiudere haskell-shell è quello di colpire Ctrl+D.

Nota: Testato su Linux (Ubuntu 16.04 LTS)

+0

Ctrl + D non chiude ghci mentre sta eseguendo il codice. Ctrl + Z, d'altra parte, invia un segnale che non può essere catturato o gestito dal processo di ricezione, quindi funzionerà sempre (per qualsiasi processo, non solo per ghci). Puoi ripulire dopo il processo residuo lasciato da Ctrl + Z con 'kill' o simile, come discusso nella mia risposta. –