Buffer io padrão do Haskell
Ontem escrevi um pequeno exercício para meus alunos: fazer um programa de eco reverso.
Para aprender algo novo, tentei implementar uma solução Haskell. O trivialmain = forever $ interact reverse
não funciona. Eu atravesseiessa questão e fez uma versão corrigida:
import Control.Monad
import System.IO
main = forever $ interact revLines
revLines = unlines . map (reverse) . lines
Mas esta versão corrigida também não funciona. Eu li odocumentação de buffer e jogou com as várias configurações. Se eu definirNoBuffering
ouLineBuffering
meu programa funciona corretamente. Finalmente eu imprimi os modos de buffer padrão para stdin e stdout
import System.IO
main = do
hGetBuffering stdin >>= print
hGetBuffering stdout >>= print
eu tenhoBlockBuffering Nothing
se eu rodar meu programa do xinetd (echo "test" | nc localhost 7
mas do cli eu tenhoLineBuffering
Editar: Obrigado a todos pelas respostas úteis.
Eu aceito a resposta que foi dada pela chama, ele me dá uma dica com isatty (3). Passei novamente pela documentação do System.IO e encontrei ohIsTerminalDevice função, com a qual posso verificar a conexão do cabo.
Para o registro, aqui está o meu programa final:
{-# OPTIONS_GHC -W #-}
import System.IO
main = do
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering
interact revLines
revLines = unlines . map (reverse) . lines