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 = ()