Devuelve el personaje a stdin en Ocaml
-
06-07-2019 - |
Pregunta
¿hay un equivalente al método C ++ istream :: putback (char)
para OCaml?
¿Cómo podría agregar un carácter al comienzo de stdin ?
Solución
No puede hacerlo con un in_channel
o con Stream.t
. Aquí hay algunas sugerencias:
-
Si está volviendo a colocar un personaje que había leído, puede usar
peek
para examinar la secuencia en lugar de eliminar el elemento. -
Es posible que tengas suerte escribiendo una interfaz C para esa función directamente. Puedo ver que esta es una muy mala idea.
-
¿Ha considerado usar un acumulador en su lugar?
-
Escriba un módulo alrededor de las funciones actuales con un tipo que sea una cremallera o pila o alguna otra estructura que permita empujar los caracteres hacia atrás.
Otros consejos
Baterías OCaml incluidas presenta una interfaz mucho más completa y de alto nivel para transmisiones. Podrías echar un vistazo a esto. Además, en general, es bueno.
Básicamente: no puedes. Las baterías (y Extlib) proporcionan una envoltura de E / S mejorada, pero ninguna de ellas admite esta función.
Sin embargo, puede emularlo con Batteries o Extlib si está dispuesto a hacer solo lecturas a nivel de caracteres, pero envolviendo la secuencia de E / S en un Enum ( BatEnum con baterías). Enum proporciona una enumeración general con un "obtener el siguiente valor" tipo de interfaz, y le permite empujar valores al frente de la enumeración. Por lo tanto, puede ajustar stdin en una enumeración de tipo char Enum.t
que devuelve caracteres con su función Enum.next
, y luego usar Enum.push
para empujar los caracteres no deseados de nuevo al frente de ella.
Puede ser posible volver a envolver dicha enumeración con IO ( BatIO ) para una interfaz más flexible, si verificó por primera vez que esos módulos no realizan almacenamiento en búfer interno, eso dañaría la semántica de empujar caracteres.