Riporta il personaggio a stdin in Ocaml
-
06-07-2019 - |
Domanda
esiste un equivalente al metodo C ++ istream :: putback (char)
per OCaml?
Come potrei aggiungere un personaggio all'inizio di stdin ?
Soluzione
Non puoi farlo con un in_channel
o con Stream.t
. Ecco alcuni suggerimenti:
-
Se stai rimettendo in piedi un personaggio che hai letto, potresti voler usare
peek
per esaminare il flusso invece di rimuovere l'elemento. -
Potresti avere fortuna a scrivere direttamente un'interfaccia C per quella funzione. Vedo che questa è una pessima idea.
-
Hai preso in considerazione l'utilizzo di un accumulatore?
-
Scrivi un modulo attorno alle funzioni correnti con un tipo che sia una cerniera o una pila o qualche altra struttura che permetta di respingere i caratteri.
Altri suggerimenti
Batterie OCaml incluse presenta un'interfaccia molto più completa e di livello superiore per gli stream. Puoi dare un'occhiata a questo. Inoltre, generalmente va bene.
Fondamentalmente: non puoi. Le batterie (e Extlib) forniscono un wrapper I / O avanzato, ma nessuna delle due supporta questa funzione.
Tuttavia, puoi emularlo con Batterie o Extlib se sei disposto a fare solo letture a livello di carattere, avvolgendo il flusso I / O in un Enum ( BatEnum con batterie). Enum fornisce un'enumerazione generale con un "ottenere il prossimo valore" tipo di interfaccia e consente di rimandare i valori nella parte anteriore dell'enum. Quindi puoi avvolgere stdin in un enum di tipo char Enum.t
che restituisce caratteri con la sua funzione Enum.next
, quindi usa Enum.push
per reinserire i personaggi indesiderati in primo piano.
Potrebbe quindi essere possibile ricoprire un tale enum con IO ( BatIO ) per un'interfaccia più flessibile, se hai verificato per la prima volta che quei moduli non eseguono il buffering interno che rovinerebbe la semantica dei caratteri push.