Return Charakter stdin in Ocaml
-
06-07-2019 - |
Frage
ist es ein Äquivalent zu dem C ++ Methode istream::putback(char)
für OCaml?
Wie kann ich einen Charakter zu Anfang hinzufügen stdin
Lösung
Sie können es nicht mit einem in_channel
oder mit Stream.t
. Hier sind einige Vorschläge:
-
Wenn Sie ein Zeichen setzen zurück Sie gelesen hatte, möchten Sie vielleicht den Einsatz
peek
zu untersuchen, den Strom anstelle des Entfernens des Elements. verwenden
-
Sie könnten etwas Glück haben eine C-Schnittstelle zu dieser Funktion direkt zu schreiben. Ich sehe dies eine wirklich schlechte Idee zu sein.
-
Haben Sie einen Speicher anstelle betrachtet mit?
-
Schreiben Sie ein Modul um die aktuellen Funktionen mit einem Typ, der ein Reißverschluss oder stapeln oder eine andere Struktur, die zurück Zeichen drängen ermöglicht.
Andere Tipps
OCaml Batterien im Lieferumfang enthalten eine viel umfassenderen Funktionen und viel höherer Ebene Schnittstelle für Streams. Sie könnten einen Blick auf diese. Plus, in der Regel, es ist gut.
Grundsätzlich gilt: Sie können es nicht. Batterien (und extlib) bieten einen verbesserten I / O-Wrapper, aber keiner von ihnen diese Funktion unterstützen.
Sie können jedoch emulieren es entweder mit Batterien oder extlib, wenn Sie bereit sind, nur auf Zeichenebene zu tun, liest, bu den I / O-Stream in einer Verpackung Enum ( BatEnum mit Batterien). Enum stellt eine allgemeine Aufzählung mit einer Art der Schnittstelle „nächsten Wert erhalten“, und ermöglicht es Ihnen, Werte drücken wieder auf die Vorderseite des ENUM. So können Sie stdin in einer Enum-Typ char Enum.t
wickeln, die Zeichen mit seiner Enum.next
Funktion gibt, und dann Enum.push
verwenden, um die unerwünschten Zeichen wieder auf den vor ihm zu drücken.
Es kann möglich sein, dann wieder zu wickeln, eine solche Enum mit IO ( BaTiO ) für eine flexible Schnittstelle, wenn Sie überprüft zuerst, dass diese Module führen keine interne Pufferung das würde vermasseln die Semantik von Zeichen drücken.