Sunteți pe pagina 1din 7

LISP Curs 2 Operatori numerici n Lisp Sintaxa general este: (operator argumente) Aceast structur poart numele de expresie

e Lisp sau form Lisp, fiind folosite i denumirile de expresie simbolic sau s-expresie (sau sexp). n Lisp se pot utili a urmtorii operatori numerici: Operator ! "! # "& Descriere adunare adun unu $nmul%ire diferen% scade unu $mpr%ire

'umrul de argumente este specific fiecrui operator. Astfel, de exemplu, operatorul "!, care adun " la argumentul su, are un singur argument: ("! () pe c)nd, operatorul !, de exemplu, are un numr nelimitat de argumente: (! " * + , ( - . / 0) Exerciiu 1ndica%i expresia care se dorete a fi calculat, dac $n Lisp s-a utili at urmtoarea s-expresie: (! (# ("! ") +) ("! (# * *))) Liste S-a definit o list simpl ca fiind o sec2en% de atomi $ntre parante e. 3ai departe i acestea pot fi combinate i $ncadrate $ntre alte perec4i de parante e form)nd liste de ni2el superior. 5oarte multe structuri de date concrete pot fi repre entate $n L1S6 cu a7utorul listelor. Astfel, mul%imile cu un numr finit de elemente pot fi repre entate ca liste. 8e exemplu, mul%imea ec4ipelor de fotbal dintr-o di2i ie ar putea fi repre entat astfel: (S9:A;A 81'A3< =A618) iar mul%imea materiilor din anul 1>, semestrul 1 ar putea fi repre entate astfel: (S1S9:3: <6:=A=:) (1'9:L1?:'9A A=9151@1ALA) ;n ca aparte $l constituie mul%imea 2ida, pentru care L1S6-ul utili ea lista 2id, notat printr-o perec4e de parante e rotunde A()A. 6entru lista 2id $n L1S6 mai exista repre entarea de tip atom special, '1L. 8ar, simbolul '1L poate a2ea $n L1S6 unul din urmtoarele $n%elesuri: - 2aloarea de ade2r BfalsB (cu obser2a%ia c orice este diferit de '1L este considerat Bade2ratB) - atomul simbolic - lista 2ida

1n nota%ia de list poate fi transpus i un arbore. Astfel, de exemplu, urmtorul arbore: :xpresie

Atom

List

'umr

Simbol

ntreg

=eal

s-ar putea repre enta $n Lisp sub urmtoarea form: ((:xpresie) (Atom ('umr (ntreg) (=eal) ) (Simbol) ) (Lista) ) 8e remarcat faptul c limba7ul L1S6 are un format liber i se recomand folosirea spa%iilor sau liniilor noi pentru a oferi programelor un aspect c)t mai li ibil. 8e asemenea, atunci c)nd este necesar, este recomandabil utili area comentariilor. ;n alt aspect abordat $n continuare este cel impus de o regula sintactica a acestui limba7, i anume obligati2itatea $nc4iderii tuturor parante elor desc4ise. =espectarea acestei reguli este uneori destul de dificil (mai ales $n ca ul utili rii unor liste puternic imbricate). 8e aceea se folosete urmtoarea prescurtare, care, nu este o construc%ie sintactic: la sf)ritul unei liste se 2a folosi parante a ptrat CDE ca prescurtare a tuturor parante elor rotunde C)E care mai trebuie $nc4ise (regul 2alabil doar pentru anumite 2ersiuni de Lisp, printre care i Allegro). Astfel, (A (F (@ (8 (: (5D este ec4i2alent cu (A (F (@ (8 (: (5)))))) n plus, se admite i con2en%ia parante ei ptrate desc4ise CGEH care ec4i2alea cu una rotund desc4isa, E(E, semnal)nd $ns punctul p)n la care corespondenta sa EDE poate $nc4ide toate parante ele rotunde E)E rmase desc4ise. Astfel, (A G@ (: (5D ?D este ec4i2alent cu (A (@ (: (5))) ?) Reprezentarea listelor 5iecare list are o repre entare: - extern - cea introdus de la tastatur - intern - $n memoria calculatorului. 1ntern, listele se repre int ca un ir de celule @<'S simboli ate astfel:

@A= @8= 5iecare obiect, fie el numr sau simbol este memorat $ntr-o anumit loca%ie. Aceast loca%ie poate fi identificat printr-un numr, care repre int, de fapt, adresa loca%iei respecti2e. Astfel, $n celula @<'S se pstrea adresele loca%iilor pentru diferitele obiecte din memorie (aceste adrese poart numele de pointeri). 8eci, celula @<'S con%ine * pointeri. Se folosete o nota%ie simbolica $n care pointerii se repre int sub form de sge%i spre obiectele ale cror adrese le repre int. Astfel, se 2a putea 2i uali a $ntr-un mod simplu repre entarea interna a obiectelor $n L1S6, fr a fi necesar cunoaterea efecti2 a adreselor pe care le folosete intern calculatorul. 6ointerul @A= al fiecrei celule @<'S 2a adresa un element al listei, iar pointerul @8= 2a adresa urmtoarea celula @<'S din list, deci 2a adresa restul listei. :xemplu: Lista (A F @) se repre int astfel: '1L A F @

6ointerul @8= al ultimei celule din list adresea simbolul '1L. Se consider repre entarea pentru lista (A " A @): '1L A " @

1n L1S6 un obiect se pstrea $ntr-o loca%ie unic i de aceea prima i a treia celula @<'S adresea $n acelai loc. Lista (A (F @ ) 8) 2a fi repre entat astfel: '1L A 8 '1L

F iar lista (((A F))) 2a fi repre entat sub forma:

'1L '1L '1L A Funciile CAR i CDR 5unc%iile @A= i @8= se $ncadrea $n categoria func%iilor de prelucrare a listelor, permi%)nd ob%inerea unor por%iuni din list (fr a distruge lista ini%ial). Astfel: (@A= lista) - re ultatul nedistructi2 al aplicrii func%iei @A= este primul element al listei. (@8= lista) - $ntoarce ca re ultat lista ob%inut dup $nlturarea primului element. :xemple: I (car J(alfa beta gamma)) alfa I (cdr J(a b c (d e))) (b c (d e)) 8efini%ie: < list care are pe prima po i%ie repre entarea unei func%ii i pe celelalte po i%ii repre entri ale argumentelor sale i care se dorete a fi e2aluat de interpretorul L1S6 pentru ob%inerea unui re ultat, se numete form (deci, o forma este o lista obinuit implicat $ntr-un proces de execu%ie). :xemple de forme (folosirea apostrofului indic faptul c ceea ce urmea este o constant): (@A= J(A F @)) (@8= J (A F @)) (@A= J((A F) (@))) (@8= J ((A F) (@))) (@A= J(A)) (@8= J'1L) (@A= (@8= J(A F @ 8))) 6entru compuneri de func%ii @A= i @8= se poate utili a i nota%ia prescurtat. Astfel, ultimul exemplu se poate scrie prescurtat sub forma: (@A8= J(A F @ 8)) n L1S6 exist o familie de func%ii (@.= lista) $n care punctul se poat $nlocui prin orice combina%ie de dou, trei sau patru litere A, 8, re ult)nd astfel o familie de func%ii, care repre int forme prescurtate ale compunerilor corespun toare de func%ii @A= i @8=. n e2aluarea acestor func%ii compuse, literele A, 8 2or fi considerate de la dreapta spre st)nga. Astfel, (@AA= KexprI) L (@A= (@A= KexprI)) (@A8= KexprI) L (@A= (@8= KexprI)) F

(@8A= KexprI) L (@8= (@A= KexprI)) (@88= KexprI) L (@8= (@8= KexprI)) :xerci%ii : ". S se repre inte $n L1S6 informa%iile descrise prin urmtorul arbore : A F 5 8 @ :

*. n urmtoarea list s se $nlocuiasc parante ele ptrate cu parante e rotunde: (A G( @ ( 8 ) : ) 5 G ? ( M ( A D F D @ ( 8 : D +. @are este rspunsul furni at de interpretorul L1S6 dac se introduc formele : a) (@A= (@8= (@A= J( A (F @) 8D b) (@8= (@8= (@8= J(A F ( @ ( 8 D c) (@A88= J(A)D d) (@A888= J(x N u 2 O)) e) (@8AA= J((A F @) 8D f) (@A8A8= J((A F @) (8 : 5) (?)) ,. S se scrie combina%iile de func%ii @A= i @8= care s permit ob%inerea celui de al doilea element din al doilea element al listei: ((A F @) (8 : 5) (?)) Funcia CO!S 5unc%iile @A= i @8= reali ea fragmentarea unei liste. <pera%ia in2ers lor, care unete dou s-expresii pentru a forma o list, se reali ea prin intermediul func%iei @<'S. (@<'S Karg"I Karg*I) permite crearea unei liste sau a unei perec4i cu punct, $n func%ie de natura argumentelor. 8iferen%a dintre o list i o perec4e cu punct este urmtoarea: - $n ca ul unei liste, @8= este pointer ctre o celula @<'S sau ctre nil. - $n ca ul unei perec4i cu punct, @8= este pointer ctre un atom. 8eci, de fapt, @<'S construiete o noua list prin inserarea argumentului arg" ca prim element $n list. 8eci, intern, func%ia @<'S aloc o noua celula @<'S i fixea pointerii astfel : - pointerul @A= la 2aloarea lui arg" - pointerul @8= la 2aloarea lui arg*. :xemple de utili are @<'S: I(@<'S JA J(F @)) (A F @) I (@<'S " '1L) (") I (@<'S " (@<'S *+ '1L)) (" *+)

I (@<'S A '1L) 2a determina afiarea unui mesa7 de eroare, deoarece e2aluatorul consider orice simbol ($n afara de 9 i '1L) drept atom simbolic (adic 2ariabil), iar 2ariabilele ce nu au asociate 2alori sunt considerate nelegate (unbound). ncercarea de e2aluare a unei 2ariabile nelegate este semnalata ca eroare. 8eci, sunt situa%ii $n care apare necesara in4ibarea e2alurii. Acest lucru $l reali ea func%ia P;<9:, a2)nd sintaxa (P;<9: KargI) care $ntoarce ca re ultat s-expresia indicat ca arg, nee2aluat. n practic, o prescurtare comoda (oferit de ma7oritatea implementrilor de L1S6) a func%iei P;<9: o repre int apostroful (C - la care s-a fcut de7a referire). 8eci, rolul apostrofului este de indica interpretorului de L1S6 s nu e2alue e s-expresia care urmea , deci s o trate e drept constant i nu ca form (tendin%a e2aluatorului este de a trata orice sexpresie ca pe o form). 8e exemplu, urmtoarele expresii sunt ec4i2alente: (@<'S (P;<9: A) '1L) (@<'S JA '1L) 8eci, re2enind la func%ia @<'S, aceasta poate produce o list doar dac al doilea argument al su este o list. n ca ul $n care al doilea argument al func%iei @<'S este atom, re ultatul este structura ce poart numele de Bperec4e cu punctB. Astfel : I(@<'S JA JF) (A . F) 6erec4ea cu punct (A . F):

A F 8eci, intern, perec4ea cu punct se repre int tot ca o celula @<'S, a2)nd @A=-ul la 2aloarea primului argument, iar @8=-ul la 2aloarea celui de al doilea argument. (@8= J(A . F)) 2a produce ca re ultat F. (@A= J(A . F)) returnea A. 6erec4ea cu punct (A . F) este diferit de lista (A F). <rice list poate fi ec4i2alat printr-o perec4e cu punct, dar in2ers nu este posibil. Astfel, urmtoarele ec4i2alen%e sunt ade2rate: (A F) L (A . (F))

A '1L F

(A F) L (A . (F . '1L)) 8eoarece o celul @<'S corespun toare unei perec4i cu punct nu poate referi o alt celul @<'S, $nseamn c atunci c)nd $ntr-o list apare perec4ea cu punct, aceasta 2a fi $ntotdeauna elementul terminal al respecti2ei liste. Astfel : (@A= J(A F . @ 8)) 2a a2ea ca re ultat afiarea unui mesa7 de eroare, pe c)nd (@A= J(A F . @)) 2a afia corect A. 9rebuie men%ionat faptul c o perec4e cu punct ocup mai pu%in spa%iu de memorie dec)t lista corespun toare. n general, func%iile care se aplic pe liste se pot aplica i pe perec4i cu punct. Funcia LE!"#$ Aceast func%ie returnea lungimea unei s-expresii. Sintaxa general este: (L:'?9M KlistaI) i are ca efect returnarea numrului de elemente de pe primul ni2el din list. Astfel : (L:'?9M J(A (F (@)) (:))) 2a a2ea ca re ultat *. :xerci%ii : ". @are 2a fi re ultatul $n ca ul e2alurii urmtoarelor forme: a) (L:'?9M J(A . F @)) b) (@8= (A F)) c) (! " J(- . *)) d) (@<'S JA J(F @)) e) (@<'S JA J'1L) f) (@<'S JA (@<'S JF J(@ 8D g) (@A= (@<'S JA J(F @D 4) (@8= (@<'S JA J(F @D i) (@<'S (@A= J(A F @)) (@8= J(A F @))) *. ;tili )nd parante ele drepte, rescrie%i exerci%iul "&i. +. 6rin compuneri de @<'S-uri, pornind de la elementele ;';, 8<1, 9=:1 construi%i : a) lista (;'; 8<1 9=:1) b) lista cu elementele ;';, (8<1) i ((9=:1)): (;'; (8<1) ((9=:1)))

S-ar putea să vă placă și