में नियंत्रण-सी अपवाद को पकड़ना मैंने हास्केल में एक बहुत ही सरल रीड-इवल-प्रिंट-लूप बनाया जो नियंत्रण-सी (UserInterrupt) को पकड़ता है। हालांकि, जब भी मैं इस प्रोग्राम को संकलित और चलाता हूं, यह हमेशा पहले कंट्रोल-सी को पकड़ता है और हमेशा दूसरे नियंत्रण-सी पर बाहर निकलने वाला कोड 130 के साथ बंद हो जाता है। इससे कोई फर्क नहीं पड़ता कि मैं इनपुट के कितने लाइनों को पहले और बीच में देता हूं नियंत्रण-सीएस, यह हमेशा इस तरह होता है। मुझे पता है कि मुझे कुछ आसान याद आना चाहिए ... कृपया मदद करें, धन्यवाद!जीएचसी (हास्केल)
नोट: यह बेस -4 अपवादों के साथ है, इसलिए नियंत्रण। अपवाद और नियंत्रण नहीं। 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
यह कोड 'नियंत्रण। अपवाद' और 'आईओ' आयात करने, जीएचसी 6.8 के साथ भी संकलित नहीं होगा। –
@ नॉर्मन, जीएचसी 6.12 * बाहर * है। यह हास्केल प्लेटफ़ॉर्म में शामिल नहीं है, लेकिन यह पहले से ही आर्क और डेबियन अस्थिर के लिए उपलब्ध है। –
क्यों अपना खुद का सिग्नल हैंडलर स्थापित नहीं करें? http://therning.org/magnus/archives/285 –