Si tiene instalada la biblioteca OCaml Core, entonces es tan simple como:
open Core.Std
let r file = In_channel.read_lines file
Si tiene corebuild
instalado, a continuación, puedes compilar el código con él:
corebuild filename.byte
si su código reside en un archivo llamado filename.ml
.
Si no tiene OCaml Core, o no desea instalarlo, o alguna otra implementación de biblioteca estándar, entonces, por supuesto, puede implementarlo utilizando una biblioteca estándar de OCaml. Hay una función input_line
, definida en el módulo Pervasives
, que se abre automáticamente en todos los programas OCaml (es decir, todas sus definiciones son accesibles sin más aclaraciones con un nombre de módulo). Esta función acepta un valor de tipo in_channel
y devuelve una línea, que se leyó desde el canal. Con esta función se puede implementar la función requerida:
let read_lines name : string list =
let ic = open_in name in
let try_read() =
try Some (input_line ic) with End_of_file -> None in
let rec loop acc = match try_read() with
| Some s -> loop (s :: acc)
| None -> close_in ic; List.rev acc in
loop []
Esta aplicación utiliza la recursividad, y es mucho más natural para la programación OCaml.
¡Muchas gracias! – Travis
fd fuga detectada en la variante extlib: el canal de entrada no está cerrado – ygrek
¿Puede explicar por qué está encadenando el ciclo while con una lista vacía? Creo que nunca se llega. – Rizo