OCaml/Rekordy i zmienne
Z Wikibooks, biblioteki wolnych podręczników.
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 = ()