Sunteți pe pagina 1din 126

2

Visual LISP/AutoLISP

2 Visual LISP/AutoLISP
2 Visual LISP/AutoLISP

Prof. dr. ing. Gheorghe OANCEA

3

CCAAPPIITTOOLLUULL 11

MEDIUL VISUAL LISP

1.1 Aspecte generale privitoare la mediul Visual LISP

AutoLISP este un dialect al limbajului LISP, conceput special pentru editorul de desenare AutoCAD. LISP este o abreviere de la LISt Processing (sau LISt Programming) şi este specializat în prelucrarea listelor. Este un limbaj de programare de nivel înalt bine cunoscut pentru aplicaţiile sale în domeniile de vârf, cum ar fi: sisteme expert, inteligenţă artificială şi baze de cunoştinţe [ 1, 3, 4, 5, 6, 7] . Prima implementare a limbajului LISP datează din anii 1950. Astăzi, pe plan mondial, există mai multe dialecte ale acestuia, cum ar fi: Common Lisp, FranzLisp, MuLisp, XLisp etc [1, 4 ,5]. Încă de la primele versiuni de AutoCAD (versiunea 2.1 1980), limbajul AutoLISP s-a constituit într-un standard de dezvoltare a aplicaţiilor ce rulează sub AutoCAD [3]. AutoLISP-ul posedă facilităţi deosebite care atrag atât programatorii profesionişti cât şi pe cei ocazionali. Principalele caracteristici ale limbajului sunt [1, 7]:

AutoLISP are o filozofie simplă şi uşor de înţeles; are o sintaxă simplă şi riguroasă; mecanismul de evaluare a liniilor de program este uşor de înţeles aşa cum este şi sintaxa pentru definirea expresiilor utilizate în acestea; limbajul de programare este de tip interpretor, rezultatele obţinute pot fi vizualizate interactiv în cadrul editorului de desenare AutoCAD; este un limbaj funcţional deoarece în cadrul programelor pot fi definite numai subprograme de tip funcţie; AutoLISP-ul este perfect compatibil cu AutoCAD-ul fără a fi necesare alte programe de interfaţare; programatorul poate să scrie uşor funcţii structurate şi le poate combina pentru a crea programe complexe; conţine un set puternic de funcţii grafice specializate; programele scrise în AutoLISP pot reprezenta noi funcţii definite de programator, sau noi comenzi AutoCAD; oferă o serie de facilităţi (funcţii) suplimentare faţă de limbajul LISP clasic, care uşurează munca programatorului; AutoLISP-ul permite iteraţii şi recursivitate; funcţiile definite de programatori pot utiliza funcţiile standard, condiţionale şi repetitive, şi pot fi definite astfel încât să se poată apela pe ele însele.

4

Visual LISP/AutoLISP

Începând cu anul 2000, pachetul AutoCAD a inclus mediul Visual LISP (VLISP) care se constituie în următoarea generaţie de LISP pentru sistemul AutoCAD[3]. VLISP este un mediu integrat de dezvoltare a aplicaţiilor (Integrated Development Environment - IDE) care are o serie de facilităţi pentru editarea, compilarea, testarea, rularea şi depanarea programelor AutoLISP şi casetelor de dialog. Pentru AutoCAD Release 14, Visual LISP este un mediu de sine stătător, dezvoltat în limbajul C, iar pentru folosirea acestuia trebuie încărcată aplicaţia aferentă în AutoCAD. Până la înglobarea VLISP-ului în AutoCAD, dezvoltarea programelor AutoLISP se realiza prin scrierea codului sursă în diverse editoare de texte externe, încărcarea lui în AutoCAD şi apoi lansarea în execuţie a aplicaţiilor. Depanarea programelor mari, cu multe subprograme, era deosebit de anevoioasă obligând programatorul să facă diverse artificii pentru corectarea erorilor. Mediul VLSIP, prin componentele ce le înglobează, elimină neajunsurile semnalate mai sus, permiţând o depanare uşoară a programelor. Principalele caracteristici ale acestuia sunt următoarele [3]:

editarea programelor se realizează prin intermediul unui editor propriu care utilizează culori diferite la scrierea categoriilor de simboluri AutoLISP sau DCL şi are facilităţi de control (căutare, împerechere) a parantezelor; rearanjarea programelor în pagină poate fi uşor realizată astfel încât acestea să devină lizibile; realizează verificarea sintaxei programelor prin recunoaşterea construcţiilor incorecte, argumentelor greşite la apelarea diverselor funcţii etc.; compilarea fişierelor conduce la mărirea vitezei de rulare a aplicaţiei şi la mărirea gradului de securitate a programelor; permite lucrul cu proiecte care de regulă conţin mai multe fişiere; la compilarea acestora, fişierele sunt înglobate într-un singur modul; depanarea aplicaţiilor permite, printre altele, rularea pas cu pas a acestora în timp ce pe ecran pot fi afişate rezultatele într-o fereastră desen AutoCAD, oprirea rulării programelor în punctele dorite şi cercetarea valorilor anumitor simboluri în cursul execuţiei; accesul la valorile simbolurilor (date AutoLISP, entităţi AutoCAD) şi expresiilor se realizează prin ferestre de tip Watch; înlocuieşte fereastra text a AutoCAD-ului cu fereastra Visual LISP Console care furnizează şi o serie de facilităţi suplimentare la tastarea expresiilor simbolice; oferă asistenţă prin sistemul de Help implementat care este de tip context sensitive.

Prof. dr. ing. Gheorghe OANCEA

5

În concluzie, Visual LISP-ul este un mediu foarte puternic, prin intermediul lui se poate îmbunătăţi modul de lucru în AutoCAD, particularizând sistemul de proiectare în funcţie de cerinţele utilizatorului.

1.2 Lansarea în execuţie a mediului Visual LISP

Visual LISP ca mediu interactiv de dezvoltare a aplicaţiilor AutoLISP, rulează separat de restul AutoCAD-ului într-o serie de ferestre proprii. Acesta are trăsăturile specifice unei aplicaţii care rulează sub sistemul de operare Windows. Pentru lansarea în execuţie a VLISP-ului, mai întâi se lansează AutoCAD-ul şi apoi se alege comanda Visual LISP Editor din submeniul AutoLISP poziţionat în submeniul Tools al AutoCAD-ului (figura 1.1a), sau se tastează în zona prompter-ului Command: comanda vlisp sau vlide (figura 1.1b). După lansarea în execuţie, pe ecran apare mediul VLISP, prezentat în figura 1.2, care are o configuraţia de ferestre în funcţie de la ultima rulare a acestuia.

de ferestre în func ţ ie de la ultima rulare a acestuia. a) Accesare din meniul

a) Accesare din meniul desfăşurător al AutoCAD-ului.

a) Accesare din meniul desf ăş ur ă tor al AutoCAD-ului. b) Accesare din zona prompter-ului

b) Accesare din zona prompter-ului Command: .

Fig. 1.1 Lansarea în execuţie a VLISP-ului.

6

Visual LISP/AutoLISP

Pictograme Meniul rdesfăşurăto Fereastr Fereastra a Visual uildB SPLI Ferestre de Fereastr Linia editare a
Pictograme
Meniul
rdesfăşurăto
Fereastr
Fereastra
a
Visual
uildB
SPLI
Ferestre de
Fereastr
Linia
editare
a
a
de
programelo
stare

Fig. 1.2 Componentele mediului VLISP.

Prof. dr. ing. Gheorghe OANCEA

7

1.3 Componentele mediului Visual LISP

La prima lansare a VLISP-ului, pe ecran pot fi identificate următoarele componente: meniul desfăşurător aflat pe a doua linie a mediului, mai multe grupuri de butoane (toolbars-uri) plasate de regulă pe următoarele linii ale mediului, o linie de stare (Status Bar), fereastra consolă (Visual LISP Console Window) şi o fereastră denumită Trace. În timpul utilizării mediului, la compilarea programelor, pe ecran apare şi fereastra Build Output. Meniul desfăşurător conţine mai multe submeniuri în care sunt plasate comenzile mediului care pot fi lansate în execuţie de către utilizator. Sunt 9 submeniuri: File, Edit, Search, View, Project, Debug, Tools, Window şi Help. Comenzile pot fi lansate în execuţie şi de pe liniile de pictograme poziţionate, de regulă, imediat sub meniul desfăşurător. Există 5 grupuri de pictograme: Standard, Search, Tools, Debug, şi View care reprezintă grupuri funcţionale de comenzi VLISP. Linia de stare este plasată pe ultima linie a mediului şi afişează informaţii despre locul în care se găseşte cursorul în mediul VLISP. Fereastra Visual LISP Console este utilizată atât pentru tastarea expresiilor simbolice AutoLISP ca şi în zona prompter-ului Command: al AutoCAD-ului, cât şi pentru afişarea mesajelor funcţiilor AutoLISP princ, print etc. Tot în această fereastră sunt afişate diverse mesaje la rularea şi depanarea programelor. Fereastra Trace, la prima lansare a mediului, este minimizată. Aici se afişează mesaje de informare a utilizatorului asupra versiunii de Visual LISP şi eventualele erori ce apar la lansarea în execuţie a VLISP-ului. În plus, această fereastră, poate să conţină o serie de informaţii referitoare la interacţiunea mediului VLISP cu AutoCAD-ul, starea subprogramelor apelate şi starea stivei. Fereastra Build Output conţine mesajele ce apar la: verificarea sintactică a programelor AutoLISP, compilarea fişierelor sursă, compilarea proiectelor şi compilarea aplicaţiilor independente.

1.3.1 Fereastra Visual LISP Console

În fereastra Visual LISP Console se pot introduce şi evalua expresii simbolice AutoLISP ca şi în zona prompter-ului Command: al AutoCAD-ului. Există însă câteva diferenţe între cele două ferestre. De exemplu, pentru a afla valoarea atribuită unui simbol, pe prompter-ul Command: se tastează semnul de exclamare (!) şi numele simbolului iar în fereastra Visual LISP Console se tastează direct numele simbolului. Prompter-ul ferestrei Visual LISP Console este _$. Principalele facilităţi oferite de fereastra Visual LISP Console sunt [3]:

8

Visual LISP/AutoLISP

evaluarea expresiilor AutoLISP şi afişarea imediat a valorilor returnate de acestea; afişarea mesajelor la rularea programelor; introducerea expresiilor AutoLISP scrise pe mai multe linii (trecerea la linia următoare se realizează prin apăsarea combinaţiei Ctrl-Enter); evaluarea mai multor expresii simbolice în acelaşi timp; copierea şi transferarea textelor între ferestrele de editare şi fereastra Visual LISP Console; repetarea comenzilor anterior introduse (se tastează Tab sau Shift Tab pentru parcurgerea într-un sens sau altul istoricul de comenzi introduse); renunţarea la textul curent introdus apăsându-se tasta ESC; apăsându-se combinaţia Shift-F10 sau butonul din dreapta mouse-ului, se afişează meniul contextual al ferestrei Visual LISP Console care conţine comenzi specifice de editare, depanare, inspectare a simbolurilor etc.; se poate memora activitatea desfăşurată în fereastră într-un fişier cu extensia LOG, ulterior acest fişier poate fi reîncărcat în mediu şi comenzile salvate sunt automat executate.

Prof. dr. ing. Gheorghe OANCEA

9

CCAAPPIITTOOLLUULL 22

LLIIMMBBAAJJUULL AAUUTTOOLLIISSPP

2.1 Aspecte generale privitoare la limbajul AutoLISP

AutoLISP-ul, ca parte integrantă a mediului AutoCAD, este un limbaj de programare de nivel înalt, conceput special pentru editorul AutoCAD-ului. Utilizând limbajul AutoLISP, se pot scrie macroprograme şi funcţii utilizate în aplicaţii grafice care rulează sub AutoCAD [1, 2, 3, 4, 5]. Până la AutoCAD R14, pentru editarea programelor AutoLISP se utilizau diverse editoare de texte, începând cu AutoCAD2000, pentru editarea, testarea şi depanarea programelor se utilizează mediul Visual LISP (prezentat în capitolul 1 al acestei lucrări). Acest capitol vă familiarizează cu cunoştinţele necesare programării în AutoLISP, explică structura şi sintaxa limbajului, prezintă funcţiile predefinite ale limbajului utilizate cu precădere în domeniul proiectării mecanice parametrizate, precum şi relaţia acestuia cu mediul AutoCAD. Exemplele prezentate în acest capitol, pot fi tastate în zona prompter-ului Command: al AutoCAD-ului sau în fereastra Visual LISP Console a mediului VLISP. Aplicaţiile mai mari se tastează în ferestrele de editare ale Visual LISP-ului, se salvează pe disc şi apoi se încarcă în AutoCAD. AutoLISP-ul este o extensie standard a AutoCAD-ului, fiind disponibil de la primele versiuni de AutoCAD. Interpretorul de AutoLISP este încărcat automat la deschiderea oricărei sesiuni de lucru cu AutoCAD-ul. Este disponibil numai în editorul de desenare al AutoCAD-ului. Interpretorul aşteaptă introducerea pe prompter-ul Command: a unei expresii simbolice care apoi este evaluată. Interpretorul AutoLISP nu face diferenţiere între expresiile scrise cu caractere mici sau mari (cu excepţia şirurilor de caractere). Sistemul de calcul utilizat trebuie să permită din punct de vedere hardware instalarea şi rularea AutoCAD-ului pentru a se putea utiliza AutoLISP-ul şi în mod implicit Visual LISP-ul.

2.2 Expresii simbolice

Expresiile simbolice sunt elementele de bază ale programelor scrise în AutoLISP, ele fiind formate din obiecte AutoLISP (simboluri, liste, atomi, funcţii etc.) separate de cel puţin un spaţiu. O expresie simbolică este precizată între paranteze rotunde (orice paranteză deschisă trebuie închisă) şi are ca prim

10

Visual LISP/AutoLISP

obiect un nume de funcţie AutoLISP. Acesta este motivul pentru care orice expresie simbolică returnează întotdeauna o valoare.

Exemplu:

(+ 4 5)9

În momentul în care AutoCAD-ul întâlneşte o expresie simbolică (o paranteză rotundă deschisă tastată pe prompter-ul Command:), predă controlul AutoLISP-ului care evaluează expresia şi îi returnează rezultatul.

Exemplu:

Command: (+ 1 2)

(+ 1

2)

AutoCAD
AutoCAD
3 AutoLISP 3
3 AutoLISP
3

Fig. 2.1 Ilustrarea mecanismului de predare a controlului din AutoCAD în AutoLISP.

Un alt caracter care predă din AutoCAD, din zona prompter-ului Command:, controlul AutoLISP-ului este caracterul semn de exclamare (!), denumit şi bang. Acesta forţează evaluarea unei expresii simbolice sau evaluarea unui simbol. A doua modalitate de predare a controlului, permite interogarea (aflarea valorii atribuite) pe prompter-ul Command: a diverselor simboluri AutoLISP.

Exemple:

1. Pe lângă alte simboluri predefinite, în AutoLISP există predefinit şi simbolul

pi în care este memorată valoarea numărului π. Dacă se tastează pe prompter-ul Command: expresia:

Command: !pi

3.14159.

atunci se obţine valoarea acestuia.

2. Dacă simbolului a i-a fost atribuită valoarea 4.5 prin expresia (setq a 4.5)

Command: (setq a 4.5) atunci avem:

Command: !a

Prof. dr. ing. Gheorghe OANCEA

11

Observaţie: În fereastra Visual LISP Console a mediului Visual LISP, valorile atribuite diverselor simboluri, se obţin prin tastarea numelui simbolului fără ca acesta să fie precedat de caracterul special semn de exclamare. Expresiile simbolice pot fi utilizate şi ca răspunsuri la cereri ale AutoCAD-ului, adică pe alte promptere decât Command: .

Exemple:

1. Dacă se doreşte trasarea unui cerc cu centrul în punctul 30,30 şi de rază 2* π

atunci se tastează:

Command: Circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:30,30 Specify radius of circle or [Diameter]: (* 2 pi)

2. Dacă simbolului p1 i se atribuie o listă cu elementele 100 şi 100 prin expresia:

Command: (setq p1 (list 100 100)) (100 100) atunci se poate scrie:

Command: Circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:!p1 Specify radius of circle or [Diameter]: D Specify diameter of circle: (/ 156.41 3.12) Pe ecran se observă că a fost trasat un cerc cu centrul în punctul p1 (de coordonate 100,100) şi de un diametru rezultat în urma evaluării expresiei

156.41/3.12.

Se observă că în acest ultim exemplu au fost utilizate cele două modalităţi de predare a controlului (din AutoCAD) AutoLISP-ului.

2.3 Tipuri de date în AutoLISP

În AutoLISP se întâlnesc două tipuri de date şi anume atomi şi liste. Atomii sunt date primare care respectă proprietatea de indivizibilitate, iar listele sunt date complexe care sunt compuse din atomi şi/sau liste. Spre deosebire de atomi, listele pot fi descompuse în elementele componente. Regula generală care caracterizează cele două tipuri de date este următoarea: tot ce este atom nu este listă şi invers, tot ce este listă nu este atom. În continuare se prezintă cele două tipuri de date:

atomii sunt reprezentaţi în sintaxele funcţiilor prin <atom>, pot fi:

numerici reprezentaţi în sintaxe prin <nr>, sunt de două feluri:

12

Visual LISP/AutoLISP

- întregi, sunt toate numerele care nu conţin punct zecimal; intervalul de

+2 147 483 647,

exemple: 12, 137, -443; - reali, sunt reprezentate în dublă precizie cu 14 cifre semnificative exemplu 23.45, 12e34 (12*10 34 ); şiruri de caractere reprezentate în sintaxe prin <şir>, sunt delimitate de ghilimele, de exemplu ”AutoCAD” ”\nIntrod. Punctul P1:”; simboluri reprezentate în sintaxe sub forma <simbol>, acestea pot fi variabile şi statice, cele variabile sunt identificatori (nume) de variabile şi funcţii, definite de programator, reprezentate prin şiruri de caractere fără ghilimele, primul caracter fiind de regulă o literă (dar nu în mod obligatoriu); cele statice desemnează funcţii AutoLISP standard (se observă că în acest limbaj de programare până şi funcţiile predefinite sunt considerate ca tip de date - atomi), de exemplu: -, +, *, /, SETQ, GETINT, ENTNEXT, etc; nume de entităţi, acestea sunt asociate entităţilor generate în AutoCAD, sunt de forma <Entity name: xxxxxxx>, iar în sintaxe se utilizează <nume_ent>; mulţimi de selecţie, au forma <Selection set: xxx> şi sunt de fapt colecţii de nume de entităţi (a nu fi confundate cu listele), în sintaxe se utilizează <m_sel>; descriptori de fişier sunt de forma <df> şi sunt utilizaţi pentru gestionarea fişierelor text din AutoLISP.

listele, reprezentate în sintaxe prin <1ista>, sunt de două feluri: liste normale şi liste speciale. Listele normale au următoarea sintaxă generală:

valori utilizat de AutoLISP este -2 147 483 648

(<elem 1 > <elem 2 >

<elem n >)

unde: <elem 1 >, <elem 2 >,

<elem n > sunt elementele ce compun o listă (pot fi

atomi şi/sau liste), ele trebuind să fie separate de cel puţin un spaţiu.

Reamintim că dacă pe prima poziţie a unei liste se găseşte o funcţie

AutoLISP (standard sau definită de programator), atunci aceasta se numeşte expresie simbolică şi este un caz particular de listă. Exemple:

(1

2 3)

(a

b c)

(1

2 3 (4 6) 56)

(+ 90 (* 56.78 (/ 89 4.1) 23) 10)

(* x y (+ z t) a b)

Există în AutoLISP şi liste speciale, denumite perechi cu punct reprezentate <pp>, au forma generală (<e1> . <e2>). Acestea, după cum se

Prof. dr. ing. Gheorghe OANCEA

13

poate observa, conţin două elemente separate de un punct, şi sunt utilizate de regulă la reprezentarea listelor asociate entităţilor AutoCAD. Numărul de elementele al listelor se determină cu ajutorul unei funcţii specializate dar şi prin numărare. Exemple:

(x y) are 2 elemente (2 atomi), (+ 10 20) are 3 elemente (3 atomi), (+ (* 45 67) (+ 34 89.0) 67) are 4 elemente (2 atomi şi 2 liste), (+ 90 (* 56.78 (/ 89 4.1) 23) 10 (- 10.23 5.67) ) are 5 elemente (3 atomi şi 2 liste).

Este predefinit şi un simbol special, denumit nil, care este atât atom cât şi listă, fiind singurul care nu se satisface regula enunţată mai sus. Reprezentarea lui nil ca listă este ( ), adică lista vidă cu zero elemente. Prin nil se înţelege în AutoLISP fals, nimic, nul.

Observaţii:

1. Numele unui identificator utilizat în AutoLISP, nu poate să conţină

următoarele caractere (, ), , , ., ; şi nu poate fi format numai din caractere de tip cifră. Caracterele utilizate la scrierea identificatorilor pot fi mari sau mici deoarece limbajul nu este de tip case sensitive.

2. Dacă un întreg depăşeşte intervalul alocat (-2147483648 atunci acesta este transformat automat în real. 3. Comentariile în AutoLISP sunt scrise după caracterul ; .

+2147483647)

2.4 Evaluarea expresiilor AutoLISP

Evaluarea este mecanismul prin care AutoLISP-ul determină valoarea unui atom sau a unei expresii simbolice.

2.4.1 Evaluarea atomilor

Atomii de tip întreg, real, şir de caractere şi nume de funcţii sunt evaluaţi prin valoarea lor. Spre exemplu, atomul întreg 10 va fi evaluat prin valoarea 10, atomul real 1.3 va fi evaluat prin valoarea 1.3 şi atomul de tip şir de caractere ”ACAD” va fi evaluat prin valoarea ”ACAD”. Pentru exemplificarea acestui lucru, se tastează în AutoCAD !10, !1.3, !”ACAD” iar în VLISP (în fereastra Visual LISP Console) direct atomii respectivi.

14

Visual LISP/AutoLISP

Simbolul se evaluează prin valoarea lui curentă (ultima valoare atribuită) sau prin nil (atomul nul) în cazul în care acesta nu are atribuită o valoare. Se pot atribui valori anumitor simboluri cu ajutorul funcţiei setq sau set. Sintaxă:

(SETQ <simbol 1 > <expresie 1 > [ <simbol 2 > <expresie 2 >

])

Această funcţie atribuie simbolurilor <simbol 1 >,<simbol 2 >,

<simbol

n >,

valorile rezultate în urma evaluării expresiilor simbolice <expresie 1 >,

<expresie 2 >

ultimei atribuiri.

<expresie n >. Pe lângă aceste acţiuni, funcţia returnează valoarea

Exemple:

1. Dacă în zona prompter-ului Command: se tastează expresia:

(setq x 3.4 z 2 text ”AutoCAD”) atunci se atribuie variabilelor x, z şi text valorile indicate. Iar dacă în continuare se tastează în AutoCAD !x !z !text iar în VLISP (în Visual LISP Console) direct numele variabilelor respective atunci se vor obţin valorile curente ale simbolurilor x, z şi text.

2. Dacă se doreşte atribuirea unor valori rezultate în urma evaluării unor expresii

simbolice atunci se poate considera următorul exemplu:

(setq

)

a (* x (+ 5 z)) b (* z pi) p1 (list a b (+ a b z))

în urma tastării expresiei de mai sus, a primeşte valoarea expresiei x*(5+z), b valoare a lui z* π iar p1 va fi o listă formată din trei elemente. Simbolurile protejate la atribuire (în principal simbolurile standard, nil, T, pause şi acele simboluri protejate de utilizator în VLISP) care apar ca argumente impare la apelarea funcţiei setq, generează mesaje de genul celor din figura 2.2.

setq , genereaz ă mesaje de genul celor din figura 2.2. Fig. 2.2 Mesajul afi ş

Fig. 2.2 Mesajul afişat la încercarea de atribuire a simbolului protejat pi.

Prof. dr. ing. Gheorghe OANCEA

15

Dacă în zona prompter-ului Command: se tastează expresia (setq pi 123) atunci pe ecran apare mesajul implicit din figura 2.2 care întreabă utilizatorul dacă se introduce o buclă de întrerupere. Dacă se răspunde cu No simbolul protejat îşi modifică valoarea, iar dacă se răspunde cu Yes atunci este generată în VLISP o buclă de întrerupere (ca şi în cazul depanării programelor în VLISP). Dacă se iese din buclă cu comenzile Reset to Top Level sau Quit to Current Level atunci simbolul nu-şi modifică valoarea, iar dacă se iese cu Continue atunci simbolul îşi modifică valoarea. Pentru a preciza ce să răspundă AutoLISP-ul (ce mesaj să afişeze) la încercarea de modificare a simbolurilor protejate, se apelează comanda Tools/ Environment Options/General Options din meniul mediului Visual LISP. De regulă utilizatorul setează afişarea unei erori. Observaţie: Pentru atribuirea valorilor se poate utiliza şi funcţia set care este prezentă la finalul prezentului subcapitol.

2.4.2 Evaluarea expresiilor simbolice (listelor)

Pentru ca o listă să poată fi evaluată, trebuie ca aceasta să fie o expresie simbolică, adică primul element să fie numele unei funcţii AutoLISP.

2.4.2.1 Funcţii aritmetice predefinite

În AutoLISP există o serie de funcţii matematice predefinite care permit efectuarea diverselor calcule matematice. Faţă de alte limbaje de programare, cel pe care îl prezentăm în lucrarea de faţă, tratează toate operaţiile aritmetice ca funcţii. Deci vom vorbi despre funcţia şi nu operaţia de: adunare, scădere, înmulţire, împărţire, etc.

Funcţia de adunare ”+Sintaxă:

(+ [ <nr 1 >

<nr n > ])

Returnează suma tuturor simbolurilor numerice indicate ca argumente.

Exemple:

(+ 2 3 4)9 (+ 2 1.0)3.0 (+ 3)3

(+)0

16

Visual LISP/AutoLISP

Se observă că dacă toate argumentele sunt întregi, atunci rezultatul este un întreg, iar dacă cel puţin un argument este un real, atunci rezultatul este un real. Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.

Funcţia de scădere ”-Sintaxă:

(- [ <nr 1 >

<nr n > ])

Returnează diferenţa iterativă a simbolurilor numerice date ca argumente, adică din primul argument se scade suma celorlalte.

Exemple:

(- 10 3 4)3 (- 2 1.0)1.0 (- 2 )-2

(-)0

Se observă că dacă toate argumentele sunt întregi, atunci rezultatul este un întreg, iar dacă cel puţin un argument este un real, atunci rezultatul este un real. Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.

Funcţia de înmulţire ”*Sintaxă:

Funcţia

argumente.

returnează

(* [ <nr 1 >

produsul

<nr n > ])

simbolurilor

de

tip

numeric

date

ca

Exemple:

(* 10 3 2)60 (* 2 4.0)8.0 (* 2)2 Se observă că dacă toate argumentele sunt întregi, atunci rezultatul este un întreg, iar dacă cel puţin un argument este un real, atunci rezultatul este un real. Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.

Funcţia de împărţire ”/Sintaxă:

(/ [ <nr 1 >

<nr n > ])

Prof. dr. ing. Gheorghe OANCEA

17

Funcţia returnează împărţirea iterativă a

simbolurilor numerice date ca

argumente, adică se împarte primul argument la produsul celorlalte.

Exemple:

(/ 1 2)0 (/ 1 2.0)0.5 (/ 2 2 4.0)0.25 (/ 4.0)4.0

Se observă că dacă toate numerele sunt întregi, atunci rezultatul este întreg (împărţire întreagă), iar dacă cel puţin un argument este un real, atunci rezultatul este real (împărţire reală). Funcţia de împărţire trebuie utilizată cu atenţie deoarece pot să apară rezultate eronate (dacă toate argumentele sunt întregi, în loc de împărţire reală se efectuează o împărţire întreagă). Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.

Funcţia 1+

Sintaxă:

(1+ <nr>)

Funcţia returnează valoarea argumentului incrementată cu o unitate. Tipul rezultatului este identic cu al argumentului (întreg sau real).

Exemple:

Funcţia 1-

Sintaxă:

(1+ 4)5 (1+ 100.0)101.0

(1- <nr>)

Funcţia 1- returnează valoarea argumentului decrementată cu o unitate. Tipul rezultatului este identic cu al argumentului (întreg sau real).

Exemple:

Funcţia ABS

Sintaxă:

(1- 4)3 (1- 100.0)99.0

(ABS <nr>)

18

Visual LISP/AutoLISP

Funcţia abs returnează valoarea absolută (modulul) a argumentului. Tipul rezultatului este identic cu cel al argumentului.

Exemple:

Funcţia EXP

Sintaxă:

(abs 100)100 (abs -78.23)78.23

Exp

(EXP <nr>)

returnează valoarea expresiei e la puterea <nr>, unde e este baza

logaritmului natural (2.71828). Tipul rezultatului este real.

Exemple:

(exp 1)2.71828 (exp -0.4)0.67032 (exp (exp 1)) 15.1543 ;returnează e e

Funcţia LOG

Sintaxă:

(LOG <nr>)

Funcţia log returnează valoarea logaritmului natural din argumentul <nr>. Rezultatul returnat este un număr real dacă argumentul este pozitiv.

Exemple:

Funcţia EXPT

Sintaxă:

(log 1.22)0.198851 (log (exp 1))1.0

(EXPT <nr 1 > <nr 2 >)

Funcţia returnează valoarea argumentului <nr 1 > la puterea <nr 2 >. Tipul rezultatului returnat este real dacă cel puţin un argument este real, sau întreg dacă ambele argumente sunt întregi. Exemple:

Prof. dr. ing. Gheorghe OANCEA

19

(expt 3 2)9 (expt 3.0 3)27.0 (expt (exp 1) pi)23.1407 ;returnează e pi

Funcţia SQRT

Sintaxă:

Sqrt

returnează

(SQRT <nr> )

valoarea

radicalului

din

argumentul

<nr>.

Tipul

rezultatului returnat este întotdeauna real. Argumentul trebuie să fie pozitiv.

Exemple:

Funcţia REM

Sintaxă:

(sqrt 9)3.0 (sqrt 2)1.41421

(REM [ <nr 1 >

<nr n > ])

Funcţia rem returnează restul împărţirii lui <nr 1 > la <nr 2 > dacă sunt indicate două argumente. Dacă sunt date mai multe argumente, atunci se efectuează împărţirea repetată fiind returnat restul ultimei împărţiri. Tipul rezultatului returnat este real dacă cel puţin un argument este real, sau întreg dacă ambele argumente sunt întregi. În situaţia în care se indică un singur argument, rem returnează valoarea acestuia, iar dacă nu sunt date argumente se returnează 0.

Exemple:

Funcţia FIX

Sintaxă:

(rem 9 4)1 (rem 20 6.0)2.0 (rem 26 7 2)1

(FIX <nr>)

Funcţia converteşte argumentul real <nr> la un întreg prin trunchiere. Dacă argumentul este întreg, funcţia returnează valoarea acestuia.

20

Visual LISP/AutoLISP

Exemple:

Funcţia FLOAT Sintaxă:

(fix 9.4)9

(fix 20.6)20

(fix 10)10

(FLOAT <nr>)

Float converteşte argumentul întreg este real, funcţia returnează valoarea acestuia.

Exemple:

(float 9)9.0 (float 20)20.0 (float 2.3)2.3

<nr> la un real. Dacă argumentul

Funcţia MAX

Sintaxă:

(MAX [ <nr 1 >

<nr n > ])

Funcţia max returnează argumentul cu valoarea cea mai mare din şirul de argumente. Dacă cel puţin un argument este real, atunci funcţia returnează o valoare de tip real, în caz contrar returnează un întreg. În situaţia în care se nu sunt indicate argumente, funcţia returnează valoarea 0.

Exemple:

 

(max -23 3 1.0 8 9)9.0 (max 20 21 0 30)30

(max)0

Funcţia MIN

Sintaxă:

(MIN [ <nr 1 >

<nr n > ])

Funcţia min returnează argumentul cu valoarea cea mai mică din şirul de argumente. Dacă cel puţin un argument este real, atunci funcţia returnează o valoare de tip real, în caz contrar returnează o valoare întreagă. În situaţia în care se nu sunt date argumente, funcţia returnează valoarea 0.

Prof. dr. ing. Gheorghe OANCEA

21

Exemple:

 

(min -23 3 1.0 8 9)-23.0 (min 20 21 0 30)0

(min)0

Funcţia GCD

Sintaxă:

(GCD <intreg 1 > <intreg 2 >)

Funcţia returnează cel mai mare divizor comun al numerelor indicate ca argumente, <intreg 1 >şi <intreg 2 >. Argumentele trebuie să fie de tip întreg, iar rezultatul este tot un întreg.

Exemple:

(gcd 81 57)3 (gcd 12 28)4

2.4.2.2 Funcţii trigonometrice predefinite

Funcţia SIN

Sintaxă:

(SIN <unghi>)

Această funcţie returnează valoarea sinusului din argumentul <unghi> ca un număr real. Se consideră că unghiul dat ca argument funcţiei sin, se indică în radiani. Exemple:

Funcţia COS

Sintaxă:

(sin (/ pi 2))1.0 (sin (/ pi 6))0.5

(COS <unghi>)

Funcţia cos returnează valoarea cosinusului de <unghi> ca un real. Se consideră că unghiul se indică în radiani.

Exemple:

22

Visual LISP/AutoLISP

Funcţia ATAN

Sintaxă:

(cos (/ pi 2))0.0 (cos (/ pi 3))0.5

(ATAN <nr 1 > [ <nr 2 > ])

Dacă <nr 2 > nu este indicat ca argument, funcţia returnează valoarea arctangentei de <nr 1 > în radiani. Argumentul <nr 1 > poate să fie negativ, iar π π ⎞

intervalul de valori al rezultatului este

2

2

,

.

Exemple:

(atan 0.5)0.463648 (atan 1.0)0.785398 (atan -1.0)-0.785398

ambele argumente există, funcţia returnează, în radiani, valoarea

expresiei matematice atan (nr 1 /nr 2 ). Dacă argumentul <nr 2 > are valoarea zero,

atunci rezultatul va fi ± π

Dacă

în funcţie de semnul lui <nr 1 >.

2

Exemple:

(atan 2.0 3.0)0.463648 (atan 2.0 -3.0)2.55359 (atan -2.0 -3.0)-2.55359 (atan -0.5 0.0)-1.5708 (atan 0.5 0.0)1.5708

2.4.2.3 Funcţii de gestionare a simbolurilor

Funcţia QUOTE Sintaxă:

(QUOTE <expr>) Funcţia returnează argumentul <expr> neevaluat, îngheţând practic mecanismul de evaluare a expresiilor simbolice conţinute de argument. Se utilizează de regulă pentru formarea listelor cu valori iniţiale cunoscute. Există o formă abreviată a funcţiei şi anume caracterului apostrof ().

Prof. dr. ing. Gheorghe OANCEA

23

Exemple:

(quote a) a (quote (sin (/ pi 3)))(sin (/ pi 3)) (quote (a b c d))(a b c d) (quote (1 2 3))(1 2 3)

expresiile de mai sus sunt echivalente cu:

’a a ’(sin (/ pi 3))(sin (/ pi 3)) ’(a b c d)(a b c d) ’ (1 2 3)(1 2 3)

Observaţie: Abrevierea funcţiei nu poate fi utilizată ca primă funcţie pe prompter-ul Command: al AutoCAD-ului deoarece aceasta nu predă controlul AutoLISP-ului, dar poate fi utilizată în VLISP (fereastra Visual LISP Console). Următorul exemplu nu este valid:

Command:’(sin (/ pi 3)) şi AutoCAD-ul va furniza un mesaj de eroare, dar este corect astfel:

Command: (setq ex ’(sin (/ pi 3)))

iar dacă se tastează:

Command:!ex (sin (/ pi 3))) se observă că simbolul ex are atribuită valoarea neevaluată a argumentului.

Observaţie: Ambele exemple de mai sus pot fi tastate în fereastra Visual LISP Console fără a fi semnalate erori.

Funcţia EVAL

Sintaxă:

(EVAL <expr>)

Returnează rezultatul evaluării expresiei simbolice <expr>.

Exemple:

Dacă se consideră următoarele atribuiri:

(setq x ”AutoLisp”) (setq y ’x) (setq b ’(sqrt 4.0))

atunci sunt valide următoarele expresii simbolice:

24

Visual LISP/AutoLISP

(eval 3.0) 3.0 (eval (sin (/ pi 6)))0.5 (eval b)2.0 (eval x) ”AutoLisp” (eval y) ”AutoLisp”

Funcţia APPLY Sintaxă:

(APPLY ’<funcţie> <listă>) Apply aplică funcţia <funcţie> pe argumentele existente în <listă> şi returnează valoarea rezultată în urma evaluării.

Exemple:

(apply ’+ ’(1 2 3))6 (apply ’strcat ’(”Exemplu ” ”apply”)) ”Exemplu apply”. Apply poate fi utilizată atât pe funcţii standard cât şi pe cele definite de programator.

Funcţia TYPE

Sintaxă:

(TYPE <articol>)

Această funcţie returnează tipul argumentului <articol>. În AutoLISP există variantele de rezultat prezentate în tabelul 2.1.

Exemple:

Considerându-se următoarele atribuiri:

(setq

i

45

r

34.3

s

”AUTOCAD”

l

’(1 2 3)

f

(open ”DATE.TXT” ”w”)

)

se obţin, aplicând TYPE pe fiecare simbol definit mai sus, următoarele rezultate:

(type ’i) SYM (type i) INT (type r) REAL (type s) STR (type l) LIST (type f) FILE (type getreal) SUBR

Prof. dr. ing. Gheorghe OANCEA

25

(type nil) nil

Tabelul 2.1

Rezultatul returnat

Explicaţie

REAL

pentru un argument numeric de tip real

INT

pentru un argument numeric de tip întreg

STR

pentru un argument de tip şir de caractere

LIST

pentru un argument de tip listă

FILE

pentru un argument de tip descriptor de fişier

SYM

pentru un simbol AutoLISP

SUBR

pentru o funcţie standard a AutoLISP-ului sau definită de programator şi încărcată din fişiere FAS sau VLX sau definită de programator direct pe prompter-ul Command:

USUBR

pentru o funcţie AutoLISP definită de programator sau încărcată din fişier sursă LISP (LSP)

PICKSET

pentru un argument de tip mulţime de selecţie

ENAME

pentru un argument de tip nume de entitate

EXRXSUBR

pentru aplicaţii externe ObjectARX

NIL

pentru un simbol evaluat prin nil (adică nu are atribuită o valoare)

Funcţia SET

Sintaxă:

(SET <simbol> <expr>)

Funcţia set atribuie simbolului notat cu <simbol> valoarea prin care este evaluată expresia <expr>. Spre deosebire de setq, funcţia set acceptă ca prim argument, chiar o expresie care returnează un simbol.

Exemple:

(set ’x (+ 5 23 (* pi 3))) 37.4248 (set (read ”y”) 10)10

Prin tastarea expresiilor de mai sus, variabilele x şi y memorează valorile 37.4248 şi respectiv 10.

Funcţia READ

Sintaxă:

26

Visual LISP/AutoLISP

(READ [ <şir> ])

Funcţia read citeşte prima dată AutoLISP (atom, listă, simbol etc) din şirul de caractere dat ca argument şi o converteşte în tipul de dată corespondent. Dacă şirul conţine spaţii atunci se preia doar prima dată (sub şirul de până la primul spaţiu) din acesta. Listele pot să conţină spaţii.

Exemple:

(read "a")A (read "b c d")B (read "78")78 (read "7.5")7.5 (read "(a b c)") (A B C) (read "Visual LISP”)VISUAL (set (read "a") 10) ;simbolul a va avea valoarea 10 (read "(+ (exp 3) (* pi 2))") (+ (exp 3) (* pi 2)) (eval (read "(+ (exp 3) (* pi 2))")) 26.3687

Funcţia ATOMS-FAMILY Sintaxă:

(ATOMS-FAMILY <format> [ <lista-simboluri> ])

Funcţia atoms-family returnează o listă cu simbolurile curent definite în AutoCAD. Argumentul <format> este un întreg şi precizează modul în care se indică lista returnată astfel: pentru valoarea 0 returnează o listă cu numele simbolurilor iar pentru valoarea 1 returnează o listă cu numele simbolurilor date ca şiruri de caractere. Argumentul opţional <lista-simboluri>, reprezintă o listă de şiruri de caractere care reprezintă simboluri ce vor fi căutate de atoms-family. Pentru simbolurile ce nu sunt găsite, în lista rezultat, va fi returnat nil.

Exemple:

1. (atoms-family 0) (VL-CONSP LISPED *MERR* VL-ACAD-DEFUN

C:MVSETUP GRCLEAR _AUTOARXLOAD GETANGLE

2. (atoms-family 1) ("VL-CONSP" "LISPED" "*MERR*" "VL-ACAD-

DEFUN" "C:MVSETUP" "GRCLEAR" "_AUTOARXLOAD"

3. (atoms-family 1 '("getint" "getdist" "getx" "gety"))("GETINT" "GETDIST"

nil nil) Ultimul exemplu verifică dacă simbolurile: getint, getdist, getx şi gety sunt definite. Se observă că simbolurile getx şi gety nu sunt definite deoarece în listă a fost returnată valoarea nil.

)

)

Prof. dr. ing. Gheorghe OANCEA

27

2.5 Reprezentarea punctelor AutoCAD în AutoLISP

Este cunoscut faptul că AutoCAD-ul foloseşte un sistem cartezian de coordonate pentru a descrie punctele 2D sau 3D în baza de date a desenului. Un punct 3D este o asociere de trei numere reale, fiecare corespunzând distanţei de la originea sistemului de coordonate de-a lungul axelor X,Y şi Z.

Coordonata X
Coordonata
X
Coordonata Y
Coordonata
Y
Coordonata Z
Coordonata
Z

Fig. 2.3

Reprezentarea unui punct AutoCAD.

Pentru definirea unui punct 3D de coordonate 1,2,3 AutoCAD-ul permite utilizatorului să îl indice prin mai multe metode: coordonate carteziene absolute, coordonate carteziene relative, coordonate polare absolute, coordonate polare relative, moduri OSNAP, filtre etc. Reprezentarea internă (în baza de date a AutoCAD-ului) a oricărui punct, indiferent de metoda prin care a fost descris, se reduce la o asociere de trei numere reale.

Coordonata X=1.0
Coordonata
X=1.0
Coordonata Y=2.0
Coordonata
Y=2.0
Coordonata Z=3.0
Coordonata
Z=3.0

Fig. 2.4 Reprezentarea punctului de coordonate 1.0, 2.0, 3.0 .

AutoLISP-ul interpretează punctele AutoCAD sub forma unor liste de două numere reale dacă punctul este 2D sau trei numere reale dacă punctul este 3D, în care primul element al listei este coordonata X, al doilea este coordonata Y, iar al treilea element, dacă există, reprezintă coordonata Z. Punctul AutoCAD de coordonate 1,2,3 este exprimat în AutoLISP sub forma listei (1.0 2.0 3.0).

28

Visual LISP/AutoLISP

(1.0 2.0 3.0) Punctul 3D 1,2,3 ca un obiect AutoLISP
(1.0 2.0 3.0)
Punctul 3D 1,2,3 ca un obiect AutoLISP

Fig. 2.5 Listă AutoLISP care reprezintă un punct AutoCAD.

Listele aferente punctelor AutoCAD pot fi generate cu ajutorul funcţiei quote (prin inhibarea mecanismului de evaluare) în cazul în care coordonatele acestora rezultă prin evaluarea unor atomi numerici, sau cu ajutorul funcţiei list în cazul în care coordonatele rezultă în urma evaluării unor expresii simbolice, variabile sau atomi numerici.

Funcţia LIST

Sintaxă:

(LIST [ <expr 1 > <expr 2 >

<expr n > ])

Funcţia list are ca argument una sau mai multe expresii simbolice şi returnează lista formată din valorile rezultate în urma evaluării expresiilor simbolice. List apelată fără argumente returnează nil. Exemple:

(setq a 1 b 2 c 3) (list a b c)(1 2 3) (list a ’(c d) b)(1 (c d) 2) ’(1 2 3)(list 1 2 3)

Exemple de generare a punctelor cu ajutorul funcţiei list:

(setq p1 (list (+ 1 a) (+ 1 b))) (2 3) (setq p2 (list (+ a b c) (* 2 b c) (- a b c))) (6 12 -4) Exemple de generare a punctelor cu ajutorul funcţiei quote:

(setq p3 ’(100 100))(100 100) (setq p4 ’(-34 10 19)) (-34 10 19) Având definite punctele de mai sus, ele pot fi utilizate la trasarea unor entităţi în AutoCAD care solicită diverse puncte.

1. Exemplu pentru trasarea unei linii între punctele P2 şi P4:

Command: Line Specify first point: !p2

(6 12 -4)

Specify next point or [Undo]: !p4

Prof. dr. ing. Gheorghe OANCEA

29

(-34 10 19) Specify next point or [Undo]:

2. Exemplu pentru trasarea unui cerc prin două puncte (P1 şi P3) pe diametru:

Command: Circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 2p Specify first end point of circle's diameter: !p1

(2 3)

Specify second end point of circle's diameter: !p3

(100 100)

3. Exemplu pentru trasarea unui arc de cerc prin trei puncte (P1, P2 şi P3):

Command: Arc ARC Specify start point of arc or [Center]: !p1

(2 3)

Specify second point of arc or [Center/End]: !p2

(6 12 -4)

Specify end point of arc: !p3

(100 100)

Funcţia APPEND Sintaxă:

(APPEND [ <1ista 1 >

<1ista n > ])

Funcţia returnează lista formată din toate elementele listelor indicate ca argumente (adaugă la elementele listei <lista 1 > elementele celorlalte liste date ca argument). Append apelată fără argumente returnează nil.

Exemple:

(setq a 10 b 20 c 30)

(setq

p1 (list a

b

c)

p2 (list 40 50 60)

)

(append p1 p2)(10 20 30 40 50 60) (append ’( (x) (y)) ’((u) (v)))((x) (y) (u) (v))

30

Visual LISP/AutoLISP

2.6 Funcţii de prelucrare a listelor

O listă AutoLISP este reprezentată în memoria calculatorului sub forma unui arbore binar. Orice zonă a arborelui binar care conectează două ramuri poartă numele de nod. Nodul este una din unităţile de bază ale memoriei gestionate de AutoLISP. Vârful unui arbore binar (primul nod al acestuia) poartă denumirea de nod rădăcină. Structura unei liste poate fi descompusă nod după nod pornind de la vârful arborelui (nodul rădăcină). Fiecare nod se descompune în două ramuri reprezentând diferite părţi ale listei: primul element al listei şi restul listei cu primul element eliminat.

Nodul rădăcină

Nodul r ă d ă cin ă primul element al listei list ă f ă r

primul element al listei

listă fără primul element

Fig. 2.6 Nodul rădăcină şi primele două ramuri ale unei liste oarecare.

(1.0 2.0 3.0)

(1.0 2.0 3.0) 1.0 (2.0 3.0)

1.0 (2.0 3.0)

Fig. 2.7 Nodul rădăcină şi primele două ramuri ale listei (1.0 2.0 3.0) .

(1.0 2.0 3.0)

(1.0 2.0 3.0) 1.0 (2.0 3.0) 2.0 (3.0) 3.0 ( )
1.0 (2.0 3.0) 2.0 (3.0)
1.0 (2.0 3.0)
2.0
(3.0)

3.0 ( )

Fig. 2.8 Arborele binar complet al listei (1.0 2.0 3.0) .

Prof. dr. ing. Gheorghe OANCEA

31

(x (y z) t)

(x (y z) t) x ((y z) t) (y z) (t) y (z t ( )
x ((y z) t) (y z) (t) y (z t ( )
x ((y z) t)
(y z)
(t)
y
(z
t
( )

z ( )

Fig. 2.9 Arborele binar al listei (x (y z) t) .

P1=(x y z)

P1=(x y z) (car P1) → x (cdr P1) → (y z) (car (cdr P1)) →

(car P1)x

(cdr P1)(y z)

P1=(x y z) (car P1) → x (cdr P1) → (y z) (car (cdr P1)) →

(car (cdr P1))y

(cdr (cdr P1))(z)

(car (cdr (cdr P1)))z

(cdr (cdr (cdr P1)))( ) lista vidă sau nil

Fig. 2.10 Reprezentarea sub forma car/cdr şi arbore binar al unei liste cu trei atomi.

Spre exemplificare, prima ramificare a listei (1.0 2.0 3.0) se prezintă în figura 2.7. Divizarea listei continuă de-a lungul ramificaţiilor acesteia până când pe ramura din dreapta se obţine lista vidă, adică nil. În AutoLISP, cele două părţi ale unei ramificaţii poartă denumiri speciale. Prima ramură, cea din stânga, este denumită car, iar cea de-a doua (ramura din dreapta) este denumită cdr. Deci primul element al unei liste este elementul car iar lista rezultată în urma îndepărtării primului element este elementul cdr.

32

Visual LISP/AutoLISP

Pe ramura car se obţine un atom sau o listă, pe ramura cdr se găseşte întotdeauna o listă. Arborele binar aferent unei liste compuse din elemente de tip atomi şi liste este reprezentat în figura 2.9. Reprezentarea car şi cdr a unei liste formată din trei elemente de tip atomi, ce a fost atribuită simbolului P1, este prezentată în figura 1.9. Există două funcţii, car şi cdr, aferente celor două ramuri ale arborelui binar, care permit extragerea elementelor ce compun o listă. Cele două funcţii sunt nedistructive, adică nu alterează elementele conţinute de lista originală.

Funcţia CAR

Sintaxă:

(CAR <listă>)

Funcţia car returnează primul element al listei argument sau nil dacă lista este vidă. Tipul rezultatului poate fi atom sau listă.

Funcţia CDR

Sintaxă:

(CDR <listă>)

Această funcţie returnează, spre deosebire de funcţia car, lista rezultată prin îndepărtarea primului element al listei indicată ca argument sau nil dacă lista este vidă. În consecinţă rezultatul returnat este întotdeauna listă. Cele două