Sunteți pe pagina 1din 8

Dumitru Dragomir

TCCN Sem. 1 C1

Curs Nr.1 Cap.1. Limbajul AutoLISP pentru AutoCAD


1.1. Generaliti Limbajul AutoLISP este un dialect de limbaj LISP destinat dezvoltrii aplicaiilor sub AutoCAD. Limbajul LISP este un limbaj care are ca unic structur lista. Denumirea limbajului deriv din LISt Processor (procesor de list) definind sintetic filozofia acestui limbaj. n LISP lista poate fi att stoc de date ct i funcie. Datorit acestei dualiti, limbajul posed nsuirea unic de a se putea automodifica n timpul execuiei. Limbajul AutoLISP este destinat scrierii de programe executabile n regim de interpretor. Din acest motiv el nu este la fel de rapid ca programele scrise n limbaje compilabile i, ca urmare, este mai raional s fie folosit pentru a transmite comenzi interpretorului de comenzi al AutoCAD-ului, astfel nct, pe ct mai mult posibil, acesta s lucreze cu facilitile sale proprii care sunt de fapt module de program compilate i, implicit, mult mai rapide. 1.2. Lista ca structur de baz n AutoLISP. Funcii Att funciile ct i datele manipulate sub AutoLISP au structur de list. 1.2.1. Lista O list este un ir de aa-numite entiti (atomi, date, liste, funcii sau expresii) desemnate prin simboluri incluse ntre paranteze, dup cum urmeaz: (e1 e2 en) Fiecare dintre aceste entiti poate fi, la rndul ei, o list, ceea ce conduce la o structur arborescent, ca n figura 1.
(e1 e2 en) (e11 e12 e1k) (e21 e22 e2j)

(en1 en2 enm)

(e211 e212 e21q)

Fig.1. Este important de reinut c aceste liste pot fi eterogene (constituite din entiti de tipuri diferite). De exemplu, fie lista TRIUNGHI coninnd datele care definesc cele trei vrfuri ale unui triunghi:
TRIUNGHI (V1 V2 V3)

V1, V2 i V3 sunt la rndul lor liste care conin caracterul de notare al vrfului i lista coordonatelor sale x, y i z:
V1 (A CV1) V2 (B CV2) V3 (C CV3) CV1 (0 0 0) CV2 (100 0 0) CV3 (0 100 0)

1.2.2. Funcia Spre deosebire de lista de date, funcia este constituit dintr-un ir de entiti dintre care primul este numele funciei iar restul sunt argumentele ei. De exemplu:
(command LINE (0 0 0) (100 0 0) (0 100 0) C)

Dumitru Dragomir

TCCN Sem. 1 C1

constituie o funcie care transmite interpretorului de comenzi din AutoCAD comanda de trasare a segmentelor componente ale unui triunghi cu vrfurile n punctele definite de sublistele argumente. Ultimul argument, adic irul de caractere C este directiva de nchidere a triunghiului. Funciile din AutoLISP sunt de trei tipuri principale: a. Funcii standard (cum este funcia command din exemplul de mai sus) coninute de AutoLISP la iniializare; b. Funcii definite de utilizator care pot fi create n scopul realizrii de faciliti noi. n acest scop se folosete funcia definitoare de funcii DEFUN; c. Funcii de comand AutoCAD definite de utilizator. Acestea sunt tot funcii definite de utilizator dar care sunt recunoscute i de ctre interpretorul de comenzi AutoCAD. Acemenea funcii se creaz prin prefixarea numelui funciei cu caracterele C:. Pe aceast cale, repertoriul de comenzi din AutoCAD poate fi mbogit cu noi comenzi. Tipuri de argumente ale unei funcii AutoLISP Argumentele unei funcii AutoLISP sunt de dou tipuri: - argumente de intrare (sau formale); - argumente interne (sau variabile locale). Cnd se definete o funcie prin intermediul funciei DEFUN, argumentele se include n interiorul unei liste de argumente. Pentru nelegere, vom lua exemplul unei funcii simple care calculeaz media a dou valori. Definirea funciei se face astfel:
(defun MID (a b / c) (setq c (/ (+ a b) 2) d (+ c 2)) c )

Numele funciei este MID. Lista de argumente (a b / c) conine dou cmpuri: - cmpul argumentelor formale a i b. Simbolurile a i b au valabilitate numai n interiorul funciei i reprezint valorile argumentelor transmise la apelul funciei sub forma (MID u v), unde u i v sunt argumentele de apel; - cmpul argumentelor locale conine aici numai simbolul c. Argumentele menionate n acest cmp sunt folosite numai n interiorul funciei i nu sunt vizibile n exteriorul acesteia (alocarea de memorie pentru aceste argumente este tears la terminarea execuiei funciei). Dac n interiorul funciei apar simboluri neincluse n nici unul dintre cmpurile listei de argumente, aceste simboluri reprezint variabile globale, vizibile att din interiorul ct i din exteriorul funciei, aa cum este variabila cu simbolul d. Caracterul / joac rolul de separator de cmpuri de argumente. n corpul funciei este folosit funcia de atribuire cu nghearea evalurii setq. Forma acestei funcii este:
(setq acceptor1 donator1 acceptor2 donator2 acceptorn donatorn)

Aici exist o dou perechi acceptor-donator, astfel: Acceptor1 este variabila local c iar donator1 este lista funcie (/ (+ a b) 2); Acceptor2 este variabila global d iar donator2 este lista lista funcie (+ c 2). Noiunea de ngheare se refer la blocarea evalurii simbolului acceptorului, astfel nct, orice valoare ar fi avut anterior, el primete o nou valoare provenit din evaluarea donatorului. Au fost folosite funciile: (/ demprit mpritor) i (+ numr1 numr2). Conform conveniei LISP, numele funciilor de mai sus sunt operatorii / i + , celelalte simboluri din list fiind operanzii.

Dumitru Dragomir

TCCN Sem. 1 C1

Modul de utilizare a funciei MID definit mai sus rezult din urmtorul exemplu, extras dintrun program: (setq u 1 v 2 d 0) atribuie simbolurilor u, v i d valorile 1, 2 i 0 (setq f (mid u v)) atribuie lui f valoarea medie a lui u i v Dup execuia ultimei funcii setq vom constata c f primete valoarea (1 + 2)/2 =1.5, iar d nu mai are valoarea 0 ci valoarea (1.5 + 2) = 3.5. Acest lucru se ntmpl deoarece d este variabil global. Dac n loc de (setq f (mid u v)) am fi scris numai (mid u v), rezultatul 1.5 ar fi fost pierdut nefiind preluat de nici un alt simbol, singurul rezultat conservat fiind valoarea 3.5 atribuit lui d. Ca i n limbajul C acest efect poart denumirea de efect lateral i, dac nu este urmrit n mod special, este recomandabil s fie evitat prin controlul strict al vizibilitii variabilelor (programatorul trebuie s tie exact care sunt variabilele locale i care cele globale). Rmne o ntrebare: de ce, n funcia de definire a funciei MID a fost scris ca ultim argument simbolul c? Pentru a nelege, trebuie expus ciclul funcional de baz al limbajului LISP. 1.3. REP ciclul de funcional baz n AutoLISP REP este prescurtarea de la Read - Eval Print, adic succesiunea etapelor de lucru n AutoLISP: R citete simbolul E evalueaz simbolul prin valoarea atribuit lui P tiprete (returneaz) rezultatul ultimei evaluri. Conform acestei succesiuni, o funcie va returna ntotdeauna numai rezultatul ultimei evaluri, indiferent cte alte evaluri ar mai fi avut loc anterior n interiorul ei. Din acest motiv, pentru ca funcia s returneze media argumentelor a i b, adic c, acesta a trebuit s fie scris ca ultim argument al funciei (defun MID ). Altfel, ultima evaluare ar fi fost aceea dat de lista (+ c 2), adic cu totul altceva dect ceea ce se urmrea. Eliminnd efectul lateral cauzat de invocarea simbolului d n corpul funciei defun i folosind judicios ciclul REP, se poate scrie o variant mai simpl i mai robust a funciei de mai sus, astfel:
(defun MID (a b /) (/ (+ a b) 2) )

n general, cu riscul risipei de spaiu, preferm scrierea pe linii separate, dei am fi putut scrie totul pe un singur rnd:
(defun MID (a b /) (/ (+ a b) 2))

Prima modalitate este preferabil, permind scrierea conform cu regulile de structurare i uurnd efortul de a controla corectitudinea nchiderii parantezelor, esenial pentru LISP. 1.4. Evaluarea simbolurilor Pentru a aprecia corect efectele obinute cu un program AutoLISP trebuie cunoscute regulile dup care are loc aciunea de evaluare a simbolurilor folosite n program. Acestea sunt urmtoarele: - Evaluarea unei date de tip valoare numeric sau ir de caractere se face prin ea nsi; - Un simbol se evalueaz prin ultima valoare care i-a fost atribuit; - O list se evalueaz n concordan cu primul ei argument care reprezint un nume de funcie. Dac acest argument nu a fost definit ca nume de funcie, AutoLISP semnaleaz eroare i oprete execuia. De exemplu, dac nu a fost folosit funcia DEFUN pentru definirea funciei mid din exemplul anterior, la apelul:
(mid 2 5)

n loc de rezultatul 3.5 ateptat, AutoLISP va emite mesajul:


error: null function

Dumitru Dragomir

TCCN Sem. 1 C1

1.5. Convenii sintactice n AutoLISP La scrierea unui program AutoLISP trebuie s se in seama de urmtoarele reguli sintactice: - Numele unui simbol se poate scrie folosind orice caractere, cu excepia urmtoarelor: ( ) . ; i caracterul spaiu - Numele simbolurilor trebuie s fie separate prin cel puin un spaiu. - O expresie, funcie sau list poate fi scris pe oricte linii, dac este necesar. Totui, nu se trece la o alt linie n cuprinsul unui ir de caractere ncadrat ntre ghilimele. n acest caz caracterul ENTER nu este filtrat (ignorat). Dac o astfel de trecere la linie nou are loc n cuprinsul unui ir de caractere de afiat ca mesaj, respectivul mesaj va apare fragmentat pe linii succesive exact n locul unde, n program a avut loc trecerea la o nou linie. Dac irul de caractere reprezint o comand transmis interpretorului de comenzi AutoCAD, prezena caracterului ENTER va perturba succesiunea normal aparametrilor comenzii i rezultatul va fi o execuie defectuoas sau imprevizibil. - Valorile ntregi sunt cuprinse n intervalul 32768+32767; - Valorile reale se exprim n forma parte_ntreag.parte_zecimal sau n format E; - Un ir de caractere este incadrat de o pereche de ghilimele, de exemplu SIR DE CARACTERE; - n interiorul unui ir de caractere caracterul \ se folosete pentru desemnarea de caractere de control, astfel: \e pentru caracterul ESCAPE \n pentru salt la linie nou \r pentru caracterul ENTER \t pentru caracterul TAB De asemenea, se folosesc combinaiile: \\ pentru caracterul spaiu \ pentru caracterul - Caracterul apostrof se folosete ca abreviaie a funciei QUOTE (nghearea evalurii). - O linie care ncepe cu caracterul ; este complet ignorat fiind considerat comentariu. 1.6. Funcii primitive n AutoLISP Funciile primite constituie un set de funcii standard care pot fi utilizate ca set minimal de funcii. Acestea sunt: 1.6.1. (CONS nou_element_prim list) Aceast funcie adaug un nou element la nceputul unei liste. De exemplu, fie lista l(b c d). Atunci, funcia:
(cons a l)

produce lista l(a b c d). Dac, n loc de o list, al doilea argument al funciei CONS este un atom, funcia returneaz o pereche cu punct, astfel:
(setq a 1 b 2) (cons a b) produce lista (1 . 2)

1.6.2. (CAR list) Aceast funcie extrage primul element al listei.


(car l)

De exemplu, fie lista l(b c d). Atunci, funcia:

produce ca rezultat b. 1.6.3. (CDR list) Aceast funcie returneaz o list creia i lipsete primul argument. De exemplu, fie lista l(b c d). Atunci, funcia:
(cdr l)

returneaz ca rezultat lista (c d).

Dumitru Dragomir

TCCN Sem. 1 C1

1.6.4. (QUOTE expresie) Aceast funcie blocheaz (nghea) evaluarea simbolului expresie i l returneaz neevaluat. Sintaxa prescurtat a acestei funcii este expresie. De exemplu: (quote a) sau echivalent a returneaz simbolul a (quote a b) sau echivalent (a b) returneaz lista (a b). 1.6.5. (SET simbol expresie) Aceast funcie evalueaz expresie, evalueaz simbol, i apoi atribuie valoarea de evaluare a expresiei valorii evaluate a lui simbol. De exemplu, s presupunem c am atribuit simbolului b valoarea simbol a, folosind funcia:
(setq b a)

Atunci:
(set b 10)

l evalueaz pe 10 prin el nsui, produce a prin evaluarea lui b i atribuie lui a valoarea 10. Dac acum scriem funcia:
(eval a)

obinem ca rezultat 10. n schimb, dac am fi scris:


(setq b 2)

i apoi:
(setq b 10)

am fi obinut mesajul de eroare:


error: bad argument type

deoarece s-ar fi ncercat atribuirea valorii constante 10 nu unui simbol care reprezint o locaie de memorie care poate stoca o valoare ci unei alte valori constante, i anume 2. 1.6.6. (SETQ simbol expresie) echivalent cu
(set (quote simbol) expresie)

Aceast funcie evalueaz expresie, blocheaz evaluarea lui simbol i atribuie simbolului neevaluat valoarea rezultat din evaluarea expresiei. De exemplu:
(setq a 9)

atribuie valoarea 9 simbolului a. Dac s-ar scrie:


(setq a 1) (setq (eval a) 9)

ar rezulta o eroare la fel ca mai sus, deoarece s-ar ncerca atribuirea valorii 9 valorii 1. n schimb, scriind:
(setq a b) (setq (eval a) 9)

lucrurile vor decurge normal producnd atribuirea valorii 9 simbolului b. 1.6.7. (LIST e1 e2 en) Aceast funcie produce o list compus din valorile de evaluare ale elementelor e1, e2, en). De exemplu:
(setq a 1 b doi c d) (list a b c)

produce lista
(1 doi d)

Dumitru Dragomir unde simbolul d este neevaluat.

TCCN Sem. 1 C1

1.6.8. (APPEND lista1 lista2 listan) Aceast funcie alipete elementele neevaluate ale listelor lista1, lista2, listan, producnd o nou list. De exemplu, fie secvena de program:
(setq a 1 b W c 2.3 d SIR) (setq l1 (list a b) l2 (list c d) l3 (list a l2))

va avea ca efect producerea listelor:


l1(1 W) l2(2.3 SIR) l3(1 (2.3 SIR))

Atunci:
(setq lap (append l1 l2 l3))

va produce lista:
lap(1 W 2.3 SIR (2.3 SIR))

1.7. Predicate de baz n AutoLISP Un predicat este o funcie care realizeaz un test i produce un rezultat logic (T pentru TRUE i NIL ca echivalent al lui FALSE din alte limbaje). AutoLISP lucreaz cu urmtoarele predicate: 1.7.1. (ATOM simbol) Un atom este o entitate AutoLISP care nu mai refer alte componente (nu este o list, sau, conform terminologiei grafurilor arborescente este frunz de arbore i nu nod). Funcia ATOM produce rezultat T dac simbol este un atom AutoLISP i NIL n caz contrar. De exemplu: (atom 1) produce rezultatul T pentru c 1 este o entitate constant; (atom lap) produce rezultatul nil pentru c lap este list (a se vedea exemplul de mai sus); (atom nil) produce rezultatul T pentru c nil este o constant logic. 1.7.2. (EQUAL e1 e2) Aceast funcie testeaz dac dou expresii sunt identice. De exemplu, scriind:
(setq e1 (1 2 3) e2 (1 2 3) e3 (1 5 2)) (equal e1 e2) produce rezultat T, iar (equal e1 e3) produce rezultat nil.

1.7.3. (NULL simbol) Funcia testeaz lipsa referinei unui coninut de ctre simbol, caz n care produce T, altfel produce NIL. De exemplu:
(setq a SIR b 1.2 c nil) (null a) produce nil (null b) produce nil (null c) produce T.

1.7.4. (MEMBER simbol list) Aceast funcie testeaz dac valoarea evaluat a simbolului se regsete printre membrii listei. Rezultatul returnat este o sublist care ncepe de la prima apariie a valorii de evaluare a lui simbol i continu pn la capt, sau NIL n caz contrar. De exemplu, considernd lista lap din exemplul de la funcia APPEND, se poate scrie: (member 2.3 lap) produce ca rezultat sublista (2.3 SIR (2.3 SIR)) (member X lap) produce nil.

Dumitru Dragomir

TCCN Sem. 1 C1

1.7.5. (NUMBERP simbol) Aceast funcie testeaz dac rezultatul evalurii lui simbol este un numr i, n acest caz, returneaz T, altfel returneaz NIL. De exemplu, considernd lista:
lap(1 W 2.3 SIR (2.3 SIR))

i scriind:
(numberp (car lap))

se returneaz T deoarece primul element al listei lap este atomul va returna NIL deoarece (cdr lap) este sublista (W 2.3 SIR (2.3

numeric 1, pe cnd:
(numberp (cdr lap)) SIR)) i nu un numr.

1.7.6. (ZEROP simbol) Aceast funcie returneaz T dac rezultatul evalurii lui simbol este o valoare numeric nul, sau NIL n caz contrar. De exemplu:
(setq a 1) (zerop a) (zerop (- a 1))

returneaz NIL returneaz T

1.7.7. (MINUSP simbol) Aceast funcie returneaz T dac rezultatul evalurii lui simbol este un numr negativ, sau NIL n caz contrar. De exemplu:
(setq a 1) (minusp a) (minusp (- a 2))

returneaz NIL returneaz T.

1.7.8. (LISTP simbol) Aceast funcie returneaz T dac rezultatul evalurii lui simbol este o list, sau NIL n caz contrar. De exemplu, considernd lista lap de mai sus: (listp lap) returneaz T (list (car lap)) returneaz NIL. 1.8. Funcii de test logic n AutoLISP AutoLISP folosete urmtoarele funcii de test logic: 1.8.1. (NOT simbol) Aceast funcie returneaz T dac simbol se evalueaz prin NIL, sau NIL n caz contrar. De exemplu, scriind:
(setq a 1 b nil) (not a) (not b)

returneaz NIL returneaz T.

1.8.2. (AND e1 e2 en) Aceast funcie returneaz NIL dac n cursul evalurii de la stnga la dreapta a expresiilor e1, e2, , en, a fost ntlnit o expresie care, prin evaluare, produce un rezultat NIL. Evaluarea se oprete imediat ce a fost ntlnit prima expresie evaluat prin NIL, fr a le mai evalua i pe celelalte. Dac toate expresiile sunt diferite de NIL este returnat rezultatul T. De exemplu, considernd atribuirile de mai sus pentru a i b: (and a b) returneaz NIL (and a (not b)) returneaz T. 1.8.3. (OR e1 e2 en) Aceast funcie returneaz T dac n cursul evalurii de la stnga la dreapta a expresiilor e1, e2, , en, a fost ntlnit o expresie care este evaluat prin T. Evaluarea se oprete imediat ce a

Dumitru Dragomir

TCCN Sem. 1 C1

fost ntlnit o asemenea expresie, fr a le mai evalua i pe celelalte. Dac, prin evaluare, nici o expresie nu produce T, este returnat rezultatul NIL. De exemplu, considernd atribuirile de mai sus pentru a i b: (or a b) returneaz T (or (not a) b) returneaz NIL. 1.9. Funciile READ i EVAL AutoLISP are posibilitatea de a transforma iruri de caractere n simboluri i de a le evalua. Acest lucru se realizeaz prin intermediul a dou funcii: 1.9.1. (READ expresie) Aceast funcie citete irul de caractere expresie i returneaz simbolul expresie neevaluat. De exemplu: (read (+ 2 1)) returneaz (+ 2 1). 1.9.2. (EVAL expresie) Aceast funcie returneaz valoarea evaluat a expresiei. De exemplu: (eval (+ 2 1)) returneaz 3