Domanda

esiste un equivalente al metodo C ++ istream :: putback (char) per OCaml?

Come potrei aggiungere un personaggio all'inizio di stdin ?

È stato utile?

Soluzione

Non puoi farlo con un in_channel o con Stream.t . Ecco alcuni suggerimenti:

  1. Se stai rimettendo in piedi un personaggio che hai letto, potresti voler usare peek per esaminare il flusso invece di rimuovere l'elemento.

  2. Potresti avere fortuna a scrivere direttamente un'interfaccia C per quella funzione. Vedo che questa è una pessima idea.

  3. Hai preso in considerazione l'utilizzo di un accumulatore?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top