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 ?

¿Fue útil?

Solución

No puede hacerlo con un in_channel o con Stream.t . Aquí hay algunas sugerencias:

  1. 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.

  2. Es posible que tengas suerte escribiendo una interfaz C para esa función directamente. Puedo ver que esta es una muy mala idea.

  3. ¿Ha considerado usar un acumulador en su lugar?

  4. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top