Creé un loop de lectura-evaluación-impresión realmente simple en Haskell que atrapa Control-C (UserInterrupt). Sin embargo, cada vez que compilo y ejecuto este programa, siempre atrapa el primer Control-C y siempre aborta en el segundo Control-C con el código de salida 130. No importa cuántas líneas de entrada le dé antes y entre los dos Control-C, siempre sucede de esta manera. Sé que debo estar perdiendo algo simple ... ¡por favor ayuda, gracias!Captura de la excepción Control-C en GHC (Haskell)
Nota: esto es con excepciones de base 4, por lo que Control.Exception y no Control.OldException.
import Control.Exception as E
import System.IO
main :: IO()
main = do hSetBuffering stdout NoBuffering
hSetBuffering stdin NoBuffering
repLoop
repLoop :: IO()
repLoop
= do putStr "> "
line <- interruptible "<interrupted>" getLine
if line == "exit"
then putStrLn "goodbye"
else do putStrLn $ "input was: " ++ line
repLoop
interruptible :: a -> IO a -> IO a
interruptible a m
= E.handleJust f return m
where
f UserInterrupt
= Just a
f _
= Nothing
Este código ni siquiera se compilará con GHC 6.8, importando 'Control.Exception' y' IO'. –
@Norman, GHC 6.12 * está * fuera. No está incluido en la plataforma Haskell, pero ya está disponible para Arch y Debian Unstable. –
¿Por qué no instalar su propio manejador de señal? http://therning.org/magnus/archives/285 –