Documente Academic
Documente Profesional
Documente Cultură
by Mihai Maruseac
Des, i lista este structura de date ı̂ntâlnită ı̂n Scheme, putem defini s, i altele ba-
zându-ne pe anumite extensii s, i funct, ii ale limbajului. Vom vedea ı̂ntr-un laborator
ulterior că vom putea defini inclusiv date infinite dar cu o reprezentare finită.
(require srfi/1)
Această declarat, ie poate fi dată oriunde ı̂n fis, ierul sursă cu except, ia spat, iului
ocupat de alte definit, ii s, i ne va permite să folosim următoarele funct, ii:
I funct, ia map ce va realiza transformarea tuturor elementelor dintr-o listă pe
baza unei funct, ii - argument
I funct, ia filter ce va obt, ine o nouă listă din lista dată ca argument pe baza
unui predicat - argument, elementele rămase fiind cele ce respectă predicatul.
I funct, iile take s, i drop ce vor păstra doar o port, iune a listei (fie primele
elemente, fie toate elementele cu except, ia primelor).
I funct, ia fold construies, te o singură valoare pe baza elementelor din listă s, i
a unei funct, ii de combinare, pornind de la un element init, ial. De exemplu,
funct, ia fold din exemplul de mai jos va returna suma elementelor listei - re-
alizată prin combinarea elementelor listei utilizând funct, ia anonimă ce reali-
zează suma a două numere, ı̂ntreaga operat, ie pornind de la valoarea init, ială
0.
Astfel, următoarele exemple vor returna #t.
S-a observat că peste 90% din buclele for sunt folosite pentru a filtra anumite
valori (filter) sau pentru a calcula ceva pe baza acestor valori: o listă cu aceeas, i
structură dar alte elemente (map) sau o altă valoare (fold). Restul cazurilor pot
fi restructurate pentru a se folosi de aceste abstractizări.
Structuri de liste
Utilizând funct, iile anterioare, putem defini aproximativ orice tip de date utilizând
doar liste.
De exemplu, o matrice ar putea fi privită ca o listă de liste. Exemplul următor
realizează suma elementelor unei matrici.
2
(require srfi/1)
(define sum-matrix
(lambda (m) (sum-line (map sum-line m))))
(define sum-line
(lambda (l) (fold (lambda (x y) (+ x y)) 0 l)))
(define matrix
’((1 2 3 4)
(2 3 4 1)
(3 4 1 2)
(4 1 2 3)))
Identic, putem defini un arbore multi-căi prin legături de tip fiu stâng - frate
drept. Astfel, pentru un nod vom ret, ine valoarea lui, primul fiu s, i fratele lui drept.
De exemplu, următoarea listă cu liste imbricate va cont, ine reprezentarea arborelui
următor:
Pentru arbore s-au figurat legăturile ı̂ntre frat, i s, i ı̂ntre părint, i s, i fiul stâng.
1
|
2---6
|
3---4---5
Utilizând funct, iile descrise anterior se pot realiza operat, ii pe acest arbore.
De regulă, cel care-s, i defines, te structurile de date este programatorul. De foarte
multe ori, o regândire a problemei poate duce la simplificarea structurii de date.
De exemplu, dacă avem o tablă de s, ah s, i trebuie să punem câte o singură piesă pe
fiecare coloană nu are rost să ret, inem ı̂ntreaga matrice a tablei ca listă de liste.
3
Putem folosi operatorii binari ı̂ntre argumentele lor utilizând o notat, ie cu două
puncte. Expresia (1 . < . 2) (atent, ie la spat, ii!) se va evalua la #t. Des, i dificil
de tastat, această notat, ie poate duce uneori la o lizibilitate mai mare a codului.
(define and
(lambda (x)
(lambda (y) ((x y) false))))
(define or
(lambda (x)
(lambda (y) ((x true) y))))
(no true)
(no false)
(no (and false))
(no ((and false) true))
((or ((and false) true)) true)
4
Exercit, ii
1. Având o listă, accesat, i elementul de pe pozit, ia 8 utilizând cât mai put, ine
paranteze.