OCaml/Rekordy i zmienne
O rekordach można myśleć jak o krotkach ze zdefiniowanymi nazwami pól. Żeby z nich skorzystać najpierw musimy zdefiniować typ rekordowy, następnie gdziekolwiek w programie użyjemy nazw pasujących do tej definicji zostanie użyty ten typ:
# type record = { name : string; age : int };;
type record = { name : string; age : int; }
# let osoba = { name="Tomasz"; age=20 };;
val osoba : record = {name = "Tomasz"; age = 20}
# osoba.name;;
- : string = "Tomasz"
# osoba.name <- "Jurek";;
The record field label name is not mutable
Jak widać żeby pola rekordów były modyfikowalne musimy użyć odpowiedniego słowa kluczowego:
# type record2 = { mutable name : string };;
type record2 = { mutable name : string }
# let osoba = { name="Tomasz" };;
val osoba : record2 = {name = "Tomasz" }
# osoba.name <- "Jurek";;
- : unit = ()
# osoba;;
- : record2 = {name = "Jurek" }
Za pewne ograniczenie może zostać uznany fakt, że nie można używać w jednym programie (w jednej przestrzeni nazw) dwóch rekordów o tych samych nazwach pól, ale z różnymi typami. Ostatnio zdefiniowany rekord zasłoni wszystkie poprzednie definicje.
Skoro doszliśmy tak daleko to pewnie warto dodać słów kilka o zmiennych. Caml zmiennych jako tako wbudowanych nie posiada -- implementuje zmienne jako rekordy z jednym modyfikowalnym polem "content":
# let variable = ref 0;;
val variable : int ref = {contents = 0}
# variable := 5;;
- : unit = ()
# !variable;;
- : int = 5
Tak zdefiniowana została zmienna o nazwie "variable". Robi się to za pomocą słowa "ref" po którym następuje początkowa wartość zmiennej, której nie można pominąć. Ażeby przypisać takiej zmiennej nową wartość używa się operatora ":=", aby zaś odczytać wartość zmiennej wstawiamy przed jej nazwę wykrzyknik. Proste!
Skoro już znamy zmienne możemy pokusić się o przykład na pętlę while:
# let i = ref 0;;
val i : int ref = {contents = 0}
# while (!i < 5) do
printf "Looping, i=%d\n" !i;
i := !i + 1;
done;;
Looping, i=1
Looping, i=2
Looping, i=3
Looping, i=4
- : unit = ()