caractere de retorno para stdin em Ocaml
-
06-07-2019 - |
Pergunta
existe um equivalente para o C ++ istream::putback(char)
método para OCaml?
Como eu poderia adicionar um personagem para o início da stdin ?
Solução
Você não pode fazer isso com um in_channel
ou com Stream.t
. Aqui estão algumas sugestões:
-
Se você está colocando de volta um personagem que tinha lido, você pode querer usar uso
peek
para examinar o fluxo em vez de remover o elemento. -
Você pode ter um pouco de sorte escrevendo um C-interface para essa função diretamente. Eu posso ver este ser uma péssima idéia.
-
Você já pensou em usar um acumulador vez?
-
Escrever um módulo em torno das funções atuais com um tipo que é um zíper ou pilha ou alguma outra estrutura que permite empurrar personagens de volta.
Outras dicas
OCaml baterias incluídas apresenta uma interface muito mais abrangente e muito mais elevado nível de riachos. Você poderia dar uma olhada nisso. Além disso, em geral, é bom.
Basicamente: você não pode. Baterias (e Extlib) fornecer uma melhorada I / O invólucro, mas nenhum deles suportam esta função.
Você pode, no entanto, imitá-lo com baterias ou Extlib se você estiver disposto a fazer único personagem de nível lê, bu envolvendo o fluxo de I / O em uma Enum ( BatEnum com baterias). Enum fornece uma enumeração geral com um tipo de "ficar próximo valor" da interface, e permite que você empurrar valores de volta para a frente do enum. Então você pode quebrar stdin em uma enumeração de char Enum.t
tipo que retorna personagens com a sua função Enum.next
, e depois usar Enum.push
para empurrar os caracteres indesejados de volta para a frente.
Pode ser possível, então, re-embrulhar tal enum com IO ( BaTiO ) para uma interface mais flexível, se você procurar verificar que esses módulos não executar o buffer interno que iria atrapalhar a semântica de empurrar caracteres.