Documente Academic
Documente Profesional
Documente Cultură
1.1 Introducere
• simboluri;
• expresii;
• variabile;
Un număr poate fi memorat ca float sau ca integer. Orice număr format din semn şi cifre
este memorat ca integer, iar dacă are şi punct atunci este memorat ca float.
3) Simbol – este alcătuit dintr-o secvenŃă de caractere care începe cu un caracter ASCII
printabil şi este urmat de zero sau mai multe caractere ASCII printabile. Simbolul se
termină la întâlnirea oricărui caracter printabil (spaŃiu, tab, return, line feed, ghilimele,
paranteze (), &, |, <, ~, ;). Pentru a afişa un simbol acesta trebuie scris între ‘ şi ‘.
Chez Scheme nu este „case sensitive” (nu face distincŃie între literele mici si literele
mari).
Exemplu:
buna Hello 653-03-439 %@=+- 3stari
1
4) String – este un set de caractere care începe cu ghilimele ” şi este urmat de
zero sau mai multe caractere printabile şi se termină cu „.
1.2.2 Expresii
1.2.3 Variabile
Pentru a afişa numele unei variabile şi nu valoarea acesteia, se foloseşte funcŃia quote cu
sintaxa:
2
(quote <nume-variabila>)
Exemple:
>(quote a)
a
>(quote s)
s
Acelaşi rezultat se obŃine dacă se tastează numele variabilei precedat de ‘.
Exemple:
>’a
a
>’s
s
• load
(load „nume-fişier.ss”)
Încarcă constructori din fişierul specificat ca argument (împreună cu calea de
directoare).
• current-directory
(current-directory „cale-directoare”)
Setează directorul curent, care trebuie să fie precizat complet, iar între subdirectoare se
trece \\. Dacă calea de directoare nu este precizată afişează directorul curent.
• exit
(exit)
Opreşte şi închide aplicaŃia Scheme.
FuncŃiile numerice sunt scrise în format prefixat, cu paranteze. Expresiile numerice pot
fi şi identificatori ai unor variabile care au valori numerice.
3
• +
(+ <expresie-numerică> <expresie-numerică>+)
Întoarce suma primului argument cu următoarele argumente.
• -
(- <expresie-numerică> <expresie-numerică>+)
Întoarce primul argument minus argumentele următoare.
• *
(* <expresie-numerică> <expresie-numerică>+)
Întoarce produsul argumentelor.
• /
(/ <expresie-numerică> <expresie-numerică>+)
Întoarce primul argument împărŃit la argumentele următoare.
• <, >
(< <expresie-numerică> <expresie-numerică>+)
Întoarce #t dacă fiecare argument este mai mic (mai mare) în valoare decât argumentul
următor. Altfel, întoarce #f.
• <=, =>
(<= <expresie-numerică> <expresie-numerică>+)
Întoarce #t dacă valoarea fiecărui argument este mai mică (mai mare) sau egală cu
valoarea argumentului următor. Altfel, întoarce #f.
• =
(= <expresie-numerică> <expresie-numerică>+)
Întoarce #t dacă valoarea primului argument este egală cu valorile argumentelor
următoare. Altfel întoarce #f. Se aplică numai pentru compararea expresiilor numerice.
• abs
(abs <expresie-numerică>)
Întoarce valoarea absolută a argumentului său.
• exp
(exp <expresie-numerică>)
Ridică numărul e la puterea indicată de argument.
• number?
(number? <expresie>)
Verifică dacă argumentul este număr.
• symbol?
(symbol? <expresie>)
Verifică dacă argumentul este simbol.
• boolean?
(boolean? <expresie>)
Verifică dacă argumentul are valorile de adevăr #t sau #f.
• procedure?
(procedure? <expresie >)
Verifică dacă argumentul este identificatorul unei proceduri.
4
• log
(log <expresie-numerică>)
Întoarce logaritmul natural al argumentului.
• max
(max <expresie-numerică>+)
Întoarce valoarea celui mai mare argument numeric.
• min
(min <expresie-numerică>+)
Întoarce valoarea celui mai mic argument numeric.
• random
(random <expresie-numerică>)
Întoarce aleator un întreg cu o valoare în intervalul 0 şi argumen.
• round
(round <expresie-numerică>)
Rotunjeşte argumentul către cel mai apropiat întreg, iar rezultatul este un număr real.
• sqrt
(sqrt <expresie-numerică>)
Întoarce rădăcina pătrată a argumentului.
• eq
(eq? <expresie> <expresie>+)
Întoarce #t dacă primul argument este egal ca valoare cu toate celelalte argumente şi
toate argumentele sunt simboluri.
• eqv
(eqv? <expresie> <expresie>+)
Întoarce #t dacă primul argument este echivalent cu toate celelalte argumente.
• equal
(equal? <expresie> <expresie>+)
Întoarce #t dacă primul argument este echivalent ca tip şi ca valoare cu toate celelalte
argumente.
Exemple:
(- 25 5)
(/ 13 3)
(/ 13.0 -2)
(/ 13 2.0)
(truncate (/ 34 3))
(modulo 20 6)
(sqrt 16)
(cos 0.5)
(sqrt -4)
(+ (* 6 2) (/ 99 33))
(number? 2.4)
(symbol? 'bq)
(boolean? #t)
5
(eq? 'adf 'afghg)
(equal? 2 2.0)
6
1.4 Liste
Listele sunt definite între ( şi ). Dacă lista nu are nici un element atunci este o listă vidă.
Elementele unei liste pot avea acelaşi tip de date sau tipuri diferite de date. De
asemenea, o listă poate conŃine alte subliste.
Reprezentarea internă a listelor în ChezScheme este realizată prin perechi ordonate, care
conŃin câmpurile car (cap) şi cdr (coadă). Perechile sunt legate una de cealaltă prin
câmpul cdr. Perechile sunt utilizate pentru construirea arborilor binari abstracŃi.
Elementele listei ocupă câmpurile car ale fiecărei pereche. Câmpul cdr al ultimei
perechi ale unei liste construită corect din punct de vedere sintactic şi semantic este lista
vidă ( ). O listă incorectă are orice altceva pe câmpul cdr al ultimei perechi în afară de
lista vidă.
Predicate de lucrul cu listele sunt:
• list
(list <element1> <element2>...)
Alcătuieşte o listă din elementele specificate ca argumente.
• list?
(list? <lista>)
Întoarce #t dacă lista primită ca argument este corectă.
• car
(car <lista>)
Întoarce primul element al unei liste, iar lista primită ca argument nu trebuie să fie
vidă.
• cdr
(cdr <lista>)
Întoarce coada listei, dar lista primită ca argument nu trebuie să fie vidă.
• cxxxxr
(cxxxr <lista> )
xxx pot fi a sau r şi se obŃine o combinaŃie a predicatelor car şi cdr. De exemplu
cadr înseamnă (car (cdr ...)), sau caadr este echivalent cu (car (car (cdr ...))).
• null?
(null? <lista>)
Verifică dacă o listă este vidă.
• cons
(cons <lista1> <lista2>)
Construieşte o listă prin concatenarea argumentelor.
• set-car!
(set-car! <lista> <obiect>)
Înlocuieşte capul listei cu obiectul specificat ca argument.
• set-cdr!
(set-car! <lista> <obiect>)
Înlocuieşte coada listei cu obiectul specificat ca argument.
7
• length
(length <lista> )
Întoarce lungimea listei.
• list-ref
(list-ref <lista> <pozitie>)
Întoarce elementul de pe poziŃia specificată ca argument. Numerotarea
elementelor unei liste începe cu poziŃia 0.
• list-tail
(list-tail <lista> <pozitie>)
Întoarce o sublistă începând cu elementul specificat ca poziŃie şi până la sfârşitul
listei specificată ca argument.
• append
(append <lista> …)
Adaugă elemente la coada listei specificate.
• reverse
(reverse <lista>)
Creează o listă ale cărei elemente sunt elementele listei iniŃiale în ordine inversată.
• member
(member <obiect> <lista>)
Întoarce o sublistă al cărei cap este obiectul specificat ca argument şi a cărei coadă
este dată de celelalte elemente până la sfârşitul listei iniŃiale sau #f în alte cazuri.
• last-pair
(last-pair <lista>)
Întoarce ultimul element al unei liste.
• list-copy
(list-copy <lista>)
Întoarce o copie a listei primite ca argument.
• make-list
(make-list <numar-elemente> [<obiect>])
Creează o listă cu numărul de elemente specificat. Dacă este specificat şi obiectul
acesta va constitui elementele listei.
• sort
(sort <predicat> <lista>)
Creează o listă ale cărei elemente sunt sortate corespunzător cu predicatul
specificat. Predicatul trebuie să poată fi aplicat tipului de elemente ale listei.
• remove
(remove <obiect> <lista>)
Şterge din listă obiectul specificat ca argument.
• subst
(subst <element-nou> <element-vechi> <lista>)
Înlocuieşte în listă elementul vechi cu unul nou.
8
Pentru definirea unei liste de literali, elementele listei sunt scrise între paranteze ( şi ) şi
sunt precedate de apostrof ’ sau se foloseşte funcŃia quote în loc de apostrof. Atunci
când o expresie este precedată de apostrof sau de quote, expresia se numeşte expresie
„quote”. O astfel de expresie nu este considerată de către Scheme ca o procedură şi nu
sunt evaluate argumentele.
Exemplu:
>(define l1 ’(a b c d e))
>(define l2 ‘())
>(null? 11)
#f
>(null? l2)
#t
>(car l1)
a
>(crd l1)
(b c d e)
>(cons l2 ‘(w x z))
(() w x z)
>(cons ‘a ‘(x y))
(a x y)
>(let ((x ’(a b 3)))
(set-car! x 1))
>(let ((x ’(a b 3)))
(set-car! x 1) x)
(1 b 3)
>(list ‘x ‘y ‘z)
(x y z)
>(list ‘0234 l1)
(234 ( a b c d e))
>(list ‘aa ‘bb l1)
(aa bb ( a b c d e))
>(define x ‘(a b c d e))
>(set-car! x ‘aa)
>x
(aa b c d e)
>(set-cdr! x ‘(w ww www))
>x
(aa w ww www)
>(sort < ‘(2 6 4 0))
(0 2 4 6)
Teme:
1. Să se realizeze intersecŃia, reuniunea a două liste.
2. Să se întoarcă primele n elemente ale unei liste.
3. Să se verifice dacă o listă e inclusă în altă listă.
4. Să se elimine elementele care se repetă într-o listă.
5. Să se introducă o sublistă într-o listă de la o poziŃie n specificată.
6. Ordonarea unei liste.
9
1.5 FuncŃii definite de utilizator
(define f2
(lambda (x y)
(+ x y))
)
(define f3
(lambda ()
(+ 4 3))
)
(define f4
(lambda x
x))
(define f5
(lambda (w . z)
(list w z))
)
10
Exemplu de calculare a elementelor unei liste cu formula x+10. Într-un fişier se scrie:
(define f (lambda (x) (+ x 10)))
; se defineste f(x)=x+10
(define conc-list (lambda (x y) (cons x y)))
;se defineste conc-list = concatenarea lui x si y
(define l1 (list (f (* 2 3))
(f (- 27 7))
(f (/ 27 3))))
;se defineste l1 o lista ale carei elemente
;sunt evaluari ale functiei f
(define l2 (list (f (- 12 2))
(conc-list '(a b) '(c d))
(f 0)
))
;l2 este o lista cu elemente de diferite tipuri
După ce se încarcă fişierul se tastează l1 şi se obŃine (16 30 19), iar apoi l2 şi se obŃine
(20 ((a b) c d) 10).
• if
(if <test-conditie> <expresie1> <expresie2>)
Testează condiŃia. Dacă este adevărată execută expresie1, altfel execută expresie2.
• cond
(cond (<test> <expresie>) ... [else <expresie>])
Această structură este similară cu structura „if”, cu deosebirea că poate testa mai
multe condiŃii. Clauza else poate să lipsească.
• when
(when <test-conditie> <expresie1> <expresie2>…)
Testează condiŃia. Dacă este adevărată atunci sunt evaluate expresie1, expresie2.
Dacă evaluarea condiŃiei are rezultat fals, nici una din expresii nu mai este evaluată.
• unless
(unless <test-conditie> <expresie1> <expresie2>…)
Testează condiŃia. Dacă este adevărată atunci nu este evaluată nici una din expresii.
Dacă evaluarea condiŃiei are rezultat adevărat, atunci sunt evaluate expresiile.
• record-case
(record-case <expresie> <clauza1> <clauza2>...)
<clauza> ::= ((<cheie> ...) <variabile-formale> <exp1 ><exp2 >...)
Ultima clauză poate avea şi forma:
<clauza> ::= (else <exp1 ><exp2 >...)
11
Este o formă redusă a structurii switch-case din limbajele de programare. Se
evaluează <expresie> utilizând predicatul eqv? şi se compară cu <cheie> din
fiecare clauză. Dacă se găseşte o cheie care este echivalentă cu expresia, atunci
variabilele formale primesc valorile specificate ca argumente în apelul funcŃiei, iar
<exp1 ><exp2 > sunt evaluate.
Exemple:
• exemplu de utilizare a structurii condiŃionale if. Se defineşte o funcŃie „abs” care
calculează modulul unui număr introdus ca argument. CondiŃia de verificat
pentru structura if este (< n 0), expresia 1 care se execută dacă evaluarea
condiŃiei este adevărată este (- 0 n), iar expresia 2 care se execută când
condiŃia este falsă este n. Apelul funcŃiei se realizează astfel (abs 30).
(define abs
(lambda (n)
(if (< n 0)
(- 0 n)
n)))
12
m c m x c x v
1000 100- 1000 10- 100 10 5
1000+ 900+ 90+ 10+ 5
=2005
(define verific1
(lambda (x)
(when (member 'a x)
(printf "'a se afla in lista ~s ~%" x))
))
(define verific2
(lambda (x)
(unless (member 'a x)
(error 'verific2 "a NU se afla in lista ~s" x))
))
13
;calculeaza factorialul recursiv n!=n*(n-1)!
(define factorial2
(lambda (n)
;initializeaza fact(i) unde i=n
(let fact ((i n))
(printf "fact(i)=(~s)~%"i)
;daca i=0 atunci afiseaza 1
;altfel afiseaza i*fact(i-1)
(if (= i 0)
1
(* i (fact (- i 1)))
)
)
)
)
Teme:
1. să se calculeze recursiv şi iterativ Cn,m.
2. să se realizeze o funcŃie care să scrie un număr cu cifre romane.
3. să se afişeze şirul lui Fibonacci.
4. să se scrie funcŃiile lui Hofstadter pentru 0<=n=<12 unde f(n)=n-g(f(n-1)) şi
g(n)=n-f(g(n-1))
14