Sunteți pe pagina 1din 7

Dumitru Dragomir TCCN Sem.

1 C2 1
Curs Nr. 2

1.10. Funcii alternativ
AutoLISP folosete urmtoarele funcii alternativ:

1.10.1. (IF expresie_de_test expresie_da [expresie_nu])
Aceast funcie evalueaz expresie_de_test. Dac rezultatul acestei evaluri este diferit de nil
atunci se evalueaz expresie_da. Dac expresie_de_test este nil este evaluat expresie_nu dac
aceasta este prezent, iar dac nu, funcia if se ncheie fr efect.

1.10.2. (COND (expresie_de_test_1 expresie_1)
(expresie_de_test_2 expresie_2)

(expresie_de_test_n expresie_n)
)
Aceast funcie evalueaz pe rnd expresiile expresie_de_test_j pn cnd o ntlnete pe
prima care este diferit de nil i evalueaz expresia expresie_j corespunztoare.
Se poate construi o alternativ default (ca n limbajul C la instruciunea switch), astfel:
(COND

(T expresie_prestabilit)
)
Exemplu de folosire a funciilor alternativ:
(setq a 1)
(if (< a 0) t) va returna nil (efect identic cu minusp)
(cond ((< a 0) negativ)
((= a 0) zero)
((> a 0) pozitiv)
) va returna irul de caractere pozitiv

1.11. Expresii ciclice.
1.11.1. (WHILE expresie_de_test expresie_1 expresie_2 expresie_n)
Aceast funcie evalueaz expresiile expresie_1 expresie_n att timp ct expresie_de_test
este diferit de nil. De exemplu:
(setq i 1 f 1)
(while (< i 6) (setq f (* f i) i (1+ i))) are ca rezultat f=5!

1.11.2. (REPEAT numr expresie_1 expresie_2 expresie_n)
Aceast funcie repet evaluarea expresiilor expresie_1 expresie_n de numr ori. De ex.:
(setq prod 1 baza 2)
(repeat 5 (setq prod (* prod baza))) are ca rezultat prod=2
5


1.12. Funcia program
(PROGN expresie_1 expresie_2 expresie_n)
Aceast funcie este folosit n acele funcii care accept un singur argument specific, ca de
exemplu IF i COND, atunci cnd este nevoie, totui, s se efectueze o succesiune de evaluri.
Funcia returneaz ca rezultat ultima evaluare efectuat (pe aceea a lui expresie_n).
n cazul funciei IF, folosirea funciei progn conduce la o structur de forma:
(if test (progn () () ) (progn () ()))

1.13. Funcii de test numeric
1.13.1. (= en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1, en2, , enn, n ordine de la stnga la dreapta.
Imediat ce este obinut o evaluare care produce un rezultat cu valoare diferit de en1, evaluarea este
Dumitru Dragomir TCCN Sem. 1 C2 2
oprit (celelalte expresii nu mai sunt evaluate) i este returnat rezultatul nil. Dac toate expresiile
numerice au fost evaluate i au fost egale cu en1 este returnat ca rezultat T.

1.13.2. (/= en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1 enn, n ordine de la stnga la dreapta
i returneaz nil la ntlnirea primei evaluri care produce un rezultat de egalitate cu oricare
dintre expresiile evaluate anterior, oprind evaluarea celorlalte expresii. Dac evaluarea tuturor
expresiilor a produs rezultate diferite, este returnat T.

1.13.3. (< en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1 enn, n ordine de la stnga la dreapta i
returneaz nil la ntlnirea primei evaluri care produce un rezultat mai mic sau egal cu evaluarea
anterioar, oprind evaluarea celorlalte expresii. Dac toate evalurile au produs rezultate care sunt
strict cresctoare, este returnat T.

1.13.4. (<= en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1 enn, n ordine de la stnga la dreapta i
returneaz nil la ntlnirea primei evaluri care produce un rezultat mai mic dect evaluarea
anterioar, oprind evaluarea celorlalte expresii. Dac toate evalurile au produs rezultate care sunt
cresctoare, este returnat T.

1.13.5. (> en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1 enn, n ordine de la stnga la dreapta i
returneaz nil la ntlnirea primei evaluri care produce un rezultat mai mare sau egal cu
evaluarea anterioar, oprind evaluarea celorlalte expresii. Dac toate evalurile au produs
rezultate care sunt strict descresctoare, este returnat T.

1.13.6. (>= en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1 enn, n ordine de la stnga la dreapta i
returneaz nil la ntlnirea primei evaluri care produce un rezultat mai mare dect evaluarea
anterioar, oprind evaluarea celorlalte expresii. Dac toate evalurile au produs rezultate care sunt
descresctoare, este returnat T.

1.14. Funcii de prelucrare a listelor
Fiind un limbaj de prelucrare de liste, AutoLISP folosete o serie de funcii destinate acestui
scop, dup cum urmeaz:

1.14.1. (CXXXXR list)
n funcia de mai sus avem de a face cu o notaie generic, X putnd fi A sau D, rezultnd
combinaii de funcii CAR i CDR pn la nivelul 4. De exemplu:
(CADR (list a b c d)) produce acelai rezultat ca i (CAR (CDR (list a b c d))) adic evaluarea
simbolului b.

1.14.2. (REVERSE list)
Aceast funcie returneaz o list inversat. De exemplu:
(reverse (list (list a b) c (list d e f) g h)) returneaz lista (h g (d e f) c (a b))
Se observ din exemplul de mai sus c sublistele interne sunt tratate ca simple argumente
nefiind afectate de inversare.

1.14.3. (ASSOC articol list_asociativ)
Pentru a nelege modul de lucru al acestei funcii reamintim efectul funciei CONS: cnd
ambele argumente sunt atomi funcia returneaz o pereche cu punct.
O list asociativ este o list avnd ca elemente subliste formate din perechi cu punct de tipul
(a . b), sau asociaii.
Dac articol exist n interiorul unei subliste a listei asociative, atunci funcia ASSOC
returneaz prima pereche cu punct ntlnit, care conine argumentul articol, ignornd celelalte
subliste care urmeaz acesteia (chiar dac printre ele se mai gsesc i altele care conin articolul).
Dumitru Dragomir TCCN Sem. 1 C2 3
De exemplu:
(setq l (list (cons c 1) (cons a 2) (cons a 3) (cons b 2)))
(assoc a l) returneaz sublista (a . 2), aceasta fiind prima ntlnit care conine atomul a.

1.14.4. (NTH expresie_numeric list)
Aceast funcie extrage din list elementul cu indicele de ordine egal cu expresie_numeric,
indicierea fiind considerat ncepnd de la 0. De exemplu:
(setq l1 (a b c d) l2 ((a b c) d))
(nth 1 l1) returneaz b
(nth 0 l2) returneaz (a b c).

1.14.5. (LAST list)
Aceast funcie returneaz ultimul element al listei. De exemplu:
(setq l1 (a b c d))
(last l1) returneaz d.

1.14.6. (LENGTH list)
Aceast funcie returneaz o valoare numeric egal cu lungimea listei (numrul de argumente
ale listei). De exemplu:
(setq l1 (a b c d) l2 ((a b c) d))
(length l1) returneaz 4
(length l2) returneaz 2.

1.14.7. (SUBST articol_nou articol_vechi list)
Aceast funcie substituie toate apariiile n list a lui articol_vechi cu articol_nou. De
exemplu:
(setq l (list 2 1 1 5))
(setq l (subst 3 1 l)) modific lista l la forma (2 3 3 5).

1.15. Funcii numerice
n scopul facilitrii calculelor necesare ntr-un algoritm, AutoLISP pune la dispoziia
programatorului urmtoarele funcii de calcul numeric:

1.15.1. (+ en1 en2 enn)
Aceast funcie evalueaz expresiile numerice en1, , enn i returneaz suma lor. De exemplu:
(+ 1 7 3) returneaz 11.

1.15.2. (- en1 en2 enn)
Aceast funcie scade din en1 valorile lui en2, , enn. De exemplu:
(- 7 3 1) returneaz 3.

1.15.3. (* en1 en2 enn)
Aceast funcie returneaz produsul valorilor expresiilor en1, , enn. De exemplu:
(* 2 3 4) returneaz 24.

1.15.4. (/ en1 en2 enn)
Aceast funcie mparte valoarea expresiei en1, pe rnd, la en2, , enn. De exemplu:
(/ 24 4 3) returneaz 2.

1.15.5. (1+ en)
Aceast funcie realizeaz incrementarea valorii expresiei numerice en. De exemplu:
(setq a 5)
(1+ a) returneaz 6.

1.15.6. (1- en)
Aceast funcie realizeaz decrementarea valorii expresiei numerice en. De exemplu:
(setq a 5 b (1- a)) returneaz 4 ca valoare atribuit lui b.

Dumitru Dragomir TCCN Sem. 1 C2 4
1.15.7. (ABS en)
Aceast funcie returneaz valoarea absolut a valorii de evaluare a expresiei en. De exemplu:
(abs 3) returneaz 3.

1.15.8. (EXPT baz exponent)
Aceast funcie returneaz valoarea bazei ridicat la puterea exponent. De exemplu:
(expt 2 3) returneaz 8

1.15.9. (EXP en)
Aceast funcie returneaz valoarea numrului natural e ridicat la puterea dat de evaluarea
expresiei numerice en.

1.15.10. (SQRT en)
Aceast funcie returneaz rdcina ptrat a valorii expresiei numerice en.

1.15.11. (SIN en)
Aceast funcie returneaz sinusul valorii expresiei numerice en considerat n radiani. De
exemplu:
(sin (/ pi 6.0)) returneaz valoarea 0.5.
Observaie: simbolul pi este recunoscut de AutoLISP ca valoare a numrului .

1.15.12. (COS en)
Aceast funcie returneaz cosinusul valorii expresiei numerice en considerat n radiani. De
exemplu:
(cos (/ pi 3.0)) returneaz valoarea 0.5.

1.15.13. (ATAN en1 [en2])
Aceast funcie returneaz arcul tangentei valorii en1, sau, dac argumentul en2 este prezent,
arcul tangentei valorii en1/en2, n intervalul - + .

1.15.14. (LOG en)
Aceast funcie returneaz logaritmul natural al valorii expresiei en.

1.15.15. (FIX en)
Aceast funcie truncheaz valoarea expresiei numerice en la ntregul cel mai apropiat. De
exemplu:
(fix 2.6) returneaz 2.

1.15.16. (FLOAT en)
Aceast funcie convertete valoarea expresiei numerice en de la numr ntreg la numr real.
De exemplu:
(float 2) returneaz 2.0

1.16. Comenzi definite de utilizator
Utilizatorul i poate defini comenzile proprii folosind funcia DEFUN, astfel:
(defun C:comand_nou (/ argloc1 argloc2 arglocn)

)
Aadar, o funcie definit de utilizator cu scopul de a fi recunoscut ca o comand nou de ctre
interpretorul de comenzi din AutoCAD, trebuie s aib numele prefixat de caracterele C:.
Se observ o caracteristic ntlnit i n alte limbaje, ca de exemplu n Visual Basic la crearea
de macrocomenzi, i anume, funcia nou creat cu rolul de a servi drept comand nu are parametri
de intrare (cmpul argumentelor formale al listei de argumente este vid). Motivul acestei
caracteristici este evident: pentru uurina manipulrii, o comand este invocat ca un simplu
nume, neexistnd posibilitatea de a se transmite i parametri.
Dumitru Dragomir TCCN Sem. 1 C2 5
De exemplu:
(defun c:tri ()
(command line (0 0) (2 0) (1 2) C)
)
Aceast funcie definete o comand nou cu numele TRI. Scriind acest nume ca linie de
comand AutoCAD, programul va desena un triunghi isoscel cu vrfurile n punctele de
coordonate 0,0, 2,0 i 1,2.

1.17. Comunicarea prin AutoLISP
AutoLISP permite comunicarea cu mediul de aplicaie AutoCAD (n principal cu interpretorul de
comenzi al acestuia, dar i cu alte faciliti), folosind urmtoarele categorii de funcii:

1.17.1. Funcii de conversie valoric
1.17.1.1. (ANGTOS unghi [mod [precizie]])
Aceast funcie convertete valoarea argumentului unghi exprimat n radiani ntr-un ir de
caractere.
Argumentul mod ndeplinete rolul variabilei de sistem AUNITS din AutoCAD, care
stabilete unitile de exprimare a unghiurilor.
Argumentul precizie ndeplinete rolul variabilei de sistem AUPREC din AutoCAD, care
stabilete precizia de exprimare a unghiurilor.
Dac mod i precizie sunt omise, conversia este fcut conform strii variabilelor de sistem
menionate. Dac argumentele sunt menionate, sunt folosite urmtoarele valori i semnificaii:
Pentru argumentul mod
0 grade sexagesimale exprimate cu punct zecimal
1 grade minute secunde
2 grade centesimale
3 radiani
4 uniti de navigaie
De exemplu:
(setq p1 (5.0 1.33) p2 (2.4 1.33) a (angle p1 p2))
(angtos a 0 0) returneaz 180
(angtos a 0 4) returneaz 180.0000
(angtos a 1 4) returneaz 180d00
(angtos a 4 2) returneaz W.

1.17.1.2. (ANGTOF ir [mod])
Aceast funcie convertete argumentul de tip ir de caractere ir reprezentnd un unghi ntr-o
valoare real exprimat n radiani. Modul n care este interpretat irul de caractere depinde de
argumentul mod care, ca i la funcia ANGTOS, are aceeai semnificaie. De exemplu:
(angtof 180d00\ 1) returneaz valoarea 3.14159.

1.17.1.3. (ATOI ir)
Aceast funcie convertete un ir de caractere ASCII n numr ntreg. De exemplu:
(atoi 2) returneaz 2
(atoi 2.3) returneaz 2.

1.17.1.4. (ATOF ir)
Aceast funcie convertete un ir de caractere ASCII n numr real. De exemplu:
(atof 2) returneaz 2.0
(atof 2.3) returneaz 2.3.

1.17.1.5. (ITOA eni)
Aceast funcie convertete expresia numeric ntreag eni n ir de caractere ASCII. De
exemplu:
Dumitru Dragomir TCCN Sem. 1 C2 6
(itoa 2) returneaz 2
(itoa 2.3) produce mesajul error: bad argument type.

1.17.1.6. (RTOS enr)
Aceast funcie convertete expresia numeric real enr n ir de caractere. De exemplu:
(rtos 2) returneaz 2.0000
(rtos 2.3) returneaz 2.3000.

1.17.2. Funcii de operare asupra irurilor de caractere
1.17.2.1. (STRCAT ir1 ir2 irn)
Aceast funcie leag (concateneaz) ntr-un singur ir de caractere irurile ir1, ir2, irn.
De exemplu:
(setq disp C: dir1 Alfa dir2 Beta sep \\)
(setq cale (strcat disp sep dir1 sep dir2)) atribuie simbolului cale valoarea ir de caractere
C:\\Alfa\\Beta.

1.17.2.2. (STRLEN ir)
Aceast funcie returneaz o valoare numeric ntreag reprezentnd numrul de caractere din
ir. De exemplu:
(strlen Abcd) returneaz 4.

1.17.2.3. (STRCASE ir [mod])
Aceast funcie convertete argumentul ir de caractere ntr-o alt form determinat de
valoarea argumentului mod.
Dac mod este prezent i este diferit de nil, caracterele sunt convertite n litere mici, altfel sunt
convertite n litere mari.
(strcase Abcd) sau (strcase Abcd nil) returneaz ABCD
(strcase Abcd t) returneaz abcd.

1.17.2.4. (SUBSTR ir nceput [lungime])
Aceast funcie extrage din argumentul ir un subir ncepnd de la caracterul de indice egal
cu valoarea argumentului numeric ntreg nceput i attea caractere cte indic argumentul
numeric ntreg lungime. Dac lungime este omis, sau dac este mai mare dect restul de caractere
rmase, subirul este extras pn la capt. De exemplu:
(substr ABCD 2 2) returneaz BC
(substr ABCD 2) returneaz BCD
(substr ABCD 2 5) returneaz BCD.

1.18. Funcii de intrare/ieire
1.18.1. (OPEN nume_fiier mod)
Aceast funcie deschide un fiier identificat prin argumentul nume_fiier conform modului de
deschidere specificat prin argumentul mod. Funcia returneaz un descriptor de fiier care trebuie
atribuit unui simbol, altfel rezultatul se pierde i nu se poate face operaia de nchidere a fiierului.
Numele de fiier trebuie s descrie calea complet ctre fiier conform regulilor sistemului de
operare DOS. Separatorul de cale este perechea de caractere \\ n loc de obinuitul caracter \,
aceasta datorit semnificaiei de prefix pentru caractere speciale acordat caracterului backslash
(a se vedea exemplul de la funcia STRCAT).
Argumentul mod poate avea valorile:
r deschidere pentru citire. Dac fiierul nu exist se returneaz nil.
w deschidere pentru scriere. Dac fiierul nu exist este creat unul nou.
a deschidere pentru adugare. Dac fiierul nu exist este deschis unul nou. Dac
fiierul exist este deschis, iar pointerul de eviden este poziionat la sfritul fiierului, astfel
nct noile date sunt scrise n continuarea celor existente.
Dumitru Dragomir TCCN Sem. 1 C2 7
Descriptorul de fiier returnat va fi folosit ulterior pentru:
- citire de date cu funcia read-char sau read-line la fiierele deschise pentru citire;
- scriere de date cu funcia write-char sau write-line la fiierele deschise pentru scriere
(modurile w i a);
- nchiderea fiierului cu funcia close.
De exemplu:
(setq df (open C:\\ALFA\\BETA\\NUME.DTA)) returneaz descriptorul de fiier df.

1.18.2. (CLOSE descriptor_de_fiier)
Aceast funcie nchide fiierul specificat de argumentul descriptor_de_fiier obinut anterior
folosind funcia open.

1.18.3. (READ-CHAR [descriptor_de_fiier])
Aceast funcie citete un caracter din fiierul specificat prin argumentul descriptor_de_fiier.
Dac acest argument lipsete citirea se face din bufferul de caractere al tastaturii. Funcia returneaz o
valoare ntreag reprezentnd codul ASCII al caracterului citit. De exemplu:
(read-char) returneaz 97 dac se apas tasta a sau 65 dac se apas tasta A
Dac se dorete obinerea caracterului citit se va folosi funcia:
(CHR cod)
Aceast funcie returneaz caracterul ASCII al crui cod este furnizat ca argument. De
exemplu:
(chr 97) returneaz a.

1.18.4. (WRITE-CHAR cod [descriptor_de_fiier])
Aceast funcie scrie n fiierul deschis specificat prin argumentul descriptor_de_fiier
caracterul al crui cod este furnizat ca argument. Dac descriptor_de_fiier lipsete scrierea se
face pe ecran n poziia curent a cursorului.
Pentru a se obine codul caracterului de scris se folosete funcia:
(ASCII ir)
Aceast funcie returneaz codul primului caracter din ir. De exemplu:
(ascii abc) returneaz 97
(write-char (ascii abc)) scrie pe ecran caracterul a deoarece descriptorul de fiier lipsete.

1.18.5. (READ-LINE [descriptor_de_fiier])
Aceast funcie citete o linie (un ir de caractere terminat cu caracterul ENTER) din fiierul
deschis specificat de argumentul descriptor_de_fiier sau, dac acesta lipsete, de la tastatur.

1.18.6. (WRITE-LINE ir [descriptor_de_fiier])
Aceast funcie scrie n fiierul deschis specificat de argumentul descriptor_de_fiier irul de
caractere ir ca pe o linie terminat prin caracterul ENTER. Dac descriptor_de_fiier lipsete
scrierea se face pe ecran n poziia curent a cursorului.

1.18.7. (PROMPT mesaj)
Aceast funcie scrie pe ecran irul de caractere constituit de argumentul mesaj.

1.18.8. (TERPRI)
Aceast funcie scrie pe ecran o linie de text goal. Funcia este folosit prin includerea ei pe
ultima linie a unui program AutoLISP ca ieire tcut, pentru a evita afiarea ultimei evaluri a
unei funcii.

1.18.9. (LOAD fiier_lisp)
Aceast funcie servete la ncrcarea unui fiier surs AutoLISP specificat ca argument.
Identificatorul fiierului trebuie s conin dispozitivul i calea ctre fiier, conform conveniei
DOS, ca la funcia OPEN. Numele unui fiier AutoLISP are extensia de tip .LSP, dar aceasta nu
este necesar s fie specificat.