Suche…


Lesen von Standardeingabe und Drucken zur Standardausgabe

Wir bereiten eine Datei namens reverser.ml mit folgendem Inhalt vor:

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

Wir kompilieren dann unser Programm mit dem folgenden Befehl:

$ ocamlc -o reverser.byte reverser.ml

Wir testen es, indem wir Daten an unsere neue ausführbare Datei übergeben:

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

Das Programm reserver.ml ist in einem imperativen Stil geschrieben. Zwar ist der imperative Stil in Ordnung, aber es ist interessant, dies mit der funktionalen Übersetzung zu vergleichen:

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 []

Dank der Einführung der Funktion maybe_read_line der Steuerungsfluss in dieser zweiten Version wesentlich einfacher als in der ersten.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow