Question

existe-t-il un équivalent de la méthode C ++ istream :: putback (char) pour OCaml?

Comment puis-je ajouter un caractère au début de stdin ?

Était-ce utile?

La solution

Vous ne pouvez pas le faire avec un in_channel ou avec Stream.t . Voici quelques suggestions:

  1. Si vous restaurez un caractère que vous aviez lu, vous pouvez utiliser peek pour examiner le flux au lieu de supprimer l'élément.

  2. Vous pourriez avoir de la chance en écrivant directement une interface C pour cette fonction. Je peux voir que c'est une très mauvaise idée.

  3. Avez-vous envisagé d'utiliser un accumulateur à la place?

  4. Ecrivez un module autour des fonctions actuelles avec un type qui est une fermeture à glissière ou une pile ou une autre structure permettant de repousser des caractères.

Autres conseils

Les Batteries OCaml incluses offrent une interface beaucoup plus complète et de niveau supérieur pour les flux. Vous pouvez jeter un oeil à ceci. De plus, en général, c’est bon.

En gros: vous ne pouvez pas. Les batteries (et Extlib) fournissent un wrapper d’E / S amélioré, mais aucune d’elles ne prend en charge cette fonction.

Vous pouvez toutefois l'imiter avec Batteries ou Extlib si vous souhaitez effectuer uniquement des lectures au niveau des caractères, en enveloppant le flux d'E / S dans un Énumération ( BatEnum avec batteries). Enum fournit une énumération générale avec un " get next value " type d’interface et vous permet de repousser les valeurs au début de l’énumération. Vous pouvez donc insérer stdin dans une énumération de type char Enum.t qui renvoie les caractères avec sa fonction Enum.next , puis utiliser Enum.push pour repousser les caractères indésirables au début.

Il est alors possible de reformuler une telle énumération avec IO ( BatIO ) pour une interface plus souple, si vous avez d’abord vérifié que ces modules n’effectuent pas la mise en mémoire tampon interne, cela saperait la sémantique des caractères incitatifs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top