2012-09-22 36 views
12

Tengo una función de tipo in_channel -> out_channel -> unit que dará como resultado un out_channel. Ahora me gustaría obtener su salida como una cadena. Crear archivos temporales para escribir y leer parece feo, entonces ¿cómo puedo hacer eso? ¿Hay algún otro método para crear out_channel además de la familia Pervasives.open_out?En OCaml, ¿cómo puedo crear un out_channel que escribe en una cadena/búfer en lugar de un archivo en el disco

En realidad, esta función implementó una réplica. Lo que realmente necesito es probarlo programáticamente, por lo que me gustaría primero ajustarlo a una función del tipo string -> string. Para crear el in_channel, parece que puedo usar Scanf.Scanning.from_string, pero no sé cómo crear el parámetro out_channel.

+1

No creo que haya una manera de hacer esto. Sería complicado, porque las cadenas tienen una longitud fija en OCaml. No son realmente adecuados como un lugar expandible para almacenar personajes. Puede usar Printf.sprintf para crear una cadena con los mismos contenidos que Printf.fprintf escribiría en un canal de salida. Pero aparte de eso, es posible que tengas que construir tu propio mecanismo. –

Respuesta

6

Baterías OCaml incluido Tiene output_string y output_buffer funciones en su módulo BatIO que parecen hacer lo que quiera: http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatIO.html

Es posible que tenga que utilizar sus tipos de entrada/salida.

+0

para lectores futur, ahora se encuentra en la biblioteca BatBuffer: http://ocaml-batteries-team.github.io/batteries-included/hdoc2/BatBuffer.html – yago

3

Si no le importa las pruebas que confían en el módulo Unix, entonces se puede utilizar Unix.pipe para crear un par de descriptor de archivo, crear una in_channel desde el lado legible, una out_channel desde el lado grabable, y luego escribir la cadena al lado de escritura y pase el in_channel al código bajo prueba.

val pipe : unit -> file_descr * file_descr 

Crear una tubería. El primer componente del resultado se abre para la lectura , esa es la salida de la tubería. El segundo componente es abierto para escribir, esa es la entrada a la tubería.

val in_channel_of_descr : file_descr -> Pervasives.in_channel 

Crea una lectura del canal de entrada desde el descriptor dado. El canal está inicialmente en modo binario; use set_binary_mode_in ic falso si se desea el modo de texto.

val out_channel_of_descr : file_descr -> Pervasives.out_channel 

Cree un canal de salida escribiendo en el descriptor dado. El canal está inicialmente en modo binario; use set_binary_mode_out oc falso si se desea el modo de texto.

Las tuberías Unix son un poco pesadas para cualquier cosa con alto rendimiento, pero deberían estar bien para un arnés de prueba.

Cuestiones relacionadas