OCaml
Pipes, Dateien und Streams
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