2012-09-22 10 views
12

Ho una funzione di tipo in_channel -> out_channel -> unit che restituirà qualcosa ad un out_channel. Ora mi piacerebbe ottenere il suo output come una stringa. Creare file temporanei per scrivere e leggerli sembra brutto, quindi come posso farlo? Esistono altri metodi per creare out_channel oltre alla famiglia Pervasives.open_out?In OCaml, come posso creare un out_channel che scrive su una stringa/buffer invece di un file sul disco

In realtà, questa funzione ha implementato un repl. Quello di cui ho veramente bisogno è di testarlo a livello di codice, quindi mi piacerebbe prima avvolgerlo in una funzione di tipo string -> string. Per creare in_channel, sembra che io possa utilizzare Scanf.Scanning.from_string, ma non so come creare il parametro out_channel.

+1

Non penso che ci sia un modo per farlo. Sarebbe complicato, perché le stringhe hanno una lunghezza fissa in OCaml. Non sono davvero adatti come luogo espandibile per memorizzare i personaggi. È possibile utilizzare Printf.sprintf per creare una stringa con gli stessi contenuti che Printf.fprintf avrebbe scritto su un canale di output. Ma a parte questo, potresti dover costruire il tuo meccanismo. –

risposta

6

OCaml batterie incluse ha output_string e output_buffer funzioni nel suo modulo BatIO che sembrano fare quello che vuoi: http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatIO.html

potrebbe richiedere all'utente di utilizzare i tipi di input/output.

+0

per i lettori di futur, ora si trova nella libreria BatBuffer: http://ocaml-batteries-team.github.io/batteries-included/hdoc2/BatBuffer.html – yago

3

Se non ti dispiace i test basandosi sul modulo Unix, quindi è possibile utilizzare Unix.pipe per creare una coppia descrittore di file, creare un in_channel dal lato leggibile, un out_channel dal lato scrivibile, e poi scrivere la stringa al lato scrivibile e passare il codice in_channel al codice in prova.

val pipe : unit -> file_descr * file_descr 

Creare un tubo. Il primo componente del risultato è aperto per la lettura di , che è l'uscita della pipe. Il secondo componente è aperto per la scrittura, ovvero l'ingresso della pipa.

val in_channel_of_descr : file_descr -> Pervasives.in_channel 

Creare una lettura del canale di input dal descrittore indicato. Il canale è inizialmente in modalità binaria; utilizzare set_binary_mode_in ic false se si desidera la modalità testo.

val out_channel_of_descr : file_descr -> Pervasives.out_channel 

Creare un canale di uscita scrivendo sul descrittore indicato. Il canale è inizialmente in modalità binaria; utilizzare set_binary_mode_out oc false se si desidera la modalità testo.

I tubi Unix sono un po 'pesanti per qualsiasi cosa con un elevato rendimento, ma dovrebbero essere adatti per un cablaggio di prova.

Problemi correlati