Buscar..


Leer desde Entrada estándar e Imprimir en Salida estándar

Preparamos un archivo llamado reverser.ml con los siguientes contenidos:

let acc = ref [] in
    try
        while true do
            acc := read_line () :: !acc;
        done
    with
        End_of_file -> print_string (String.concat "\n" !acc)

Luego compilamos nuestro programa usando el siguiente comando:

$ ocamlc -o reverser.byte reverser.ml

Lo probamos canalizando los datos a nuestro nuevo ejecutable:

$ cat data.txt
one
two
three
$ ./reverser.byte < data.txt
three
two
one

El programa reserver.ml está escrito en un estilo imperativo. Si bien el estilo imperativo está bien, es interesante comparar esto con la traducción funcional:

let maybe_read_line () =
  try Some(read_line())
  with End_of_file -> None

let rec loop acc =
  match maybe_read_line () with
  | Some(line) -> loop (line :: acc)
  | None -> List.iter print_endline acc

let () = loop []

Gracias a la introducción de la función maybe_read_line el flujo de control es mucho más simple en esta segunda versión que en la primera.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow