Sunteți pe pagina 1din 6

1.

Funcii predefinite n LISP i AutoLISP


1.1 Generaliti
AutoLISP, ca parte integrant a sistemului AutoCAD1, reprezint implementarea limbajului LISP2
(un subset Common LISP, dar extins cu funcii specifice AutoCAD) pentru realizarea de aplicaii
bazate pe AutoCAD. Codul AutoLISP poate fi introdus din linia de comand sau poate fi stocat n
fiiere text - cu extensia LSP- ncrcabile folosind dialogul Tools/Load Application (comanda
_appload) sau din programe AutoLISP folosind funcia (load). Sistemul AutoCAD citete codul
AutoLISP direct i l interpreteaz.
1.2 Liste
Structura de date fundamental a limbajului LISP (deci i AutoLISP) este lista. Att datele ct i
programele sunt reprezentate printr-o list. O list3 este fie vid, fie este constituit dintr-un element
(numit i primul element al listei) dup care urmeaz o succesiune cu zero, unu sau mai multe
elemente. Lista este o construcie de forma (e1 e2 ... en), unde elementele sunt delimitate prin cel
puin un spaiu, iar ntreaga secven este semnalat prin prezena parantezelor4.
Elementele unei liste pot fi atomi, simboluri sau tot liste. Un tip special de list este
perechea asociativ sau perechea cu punct de forma (p1 . p2) unde p1, p2 sunt fie atomi, fie perechi
cu punct. Perechile cu punct pot fi identificate cu arborii binari. Atomii, simbolurile, listele i
perechile asociative sunt denumite expresii simbolice sau S-expresii.
Atomul este frunza din arborele binar asociat listei; este acea informaie care nu mai conine
o referin ctre alt informaie. Atomi pot fi de tip numeric (ntreg, respectiv real), ir de caractere
sau constanta IL.
Tipul ntreg desemneaz valorile cu semn i fr virgul reprezentate pe 32 de bii i
cuprinde toate numerele dintre -2 147 483 647 i 2 147 483 648.
Tipul real desemneaz valorile cu virgul (notate cu punct pentru a evidenia partea
zecimal) care pot fi exprimate att n notaia clasic ct i n notaia exponenial. Valorile reale
sunt stocate n dubl precizie (conform standardului IEEE 754 - double) cu asigurarea a cel puin 14
cifre semnificative exacte.
Un ir de caractere (string) este o secven de caractere5 cuprinse ntre ghilimele. Secvena
de caractere poate conine att caractere afiabile ct i caractere de control (care ncep cu backslash
(\) i sunt numite secvene escape). Un ir poate avea maxim 132 de caractere.
n AutoLISP se mai utilizeaz:
a) PI 3.1415926; IL fals, list vid; T non-NIL, PAUSE un ir fomat cu un
singur caracter backslash.
b) mulimi de selecie;
c) entiti AutoCAD;
d) descriptori de fiiere.
Mulimile de selecie sunt grupuri de unul sau mai multe obiecte. Aceste grupuri pot fi
manipulate interactiv prin funcii ss* (ssadd, ssdel, ssget, ssgetfirst, sslength, ssmemb, ssname,
ssnamex, sssetfirst).

Numele unei entiti este o etichet numeric asociat obiectelor din desen i reprezint un
pointer ntr-un fiier gestionat de AutoCAD - baza de date curent. Entitile pot fi manipulate prin
funcii ent* (entdel, entget, entlast, entmake, entmakex, entmod, entnext, entsel, entupd).
Descriptorii de fiiere sunt etichete alfanumerice asociate fiierelor deschise n AutoLISP.
Fiierele sunt manipulate cu ajutorul funciilor: open, close, findfile, getfiled, read, read-char, readline, write-char, write-line
Toate expresiile AutoLISP au forma: (funcie argumente), semnificnd aplicarea funciei
asupra argumentelor. Argumentele pot avea tipuri precum: ntreg, real, ir de caractere, list,
mulime de selecie, nume de entitate, descriptor de fiier, identificatori, variabile, subrutine interne
i subrutine externe.
Subrutinele interne (built-in) sunt funciile standard AutoCAD. O parte a funciilor standard
este prezentat n seciunea 1.3. Comenzile definite prin ARX (arx, arxload, arxunload,
autoarxload) sau aplicaii AutoLISP se numesc subrutine externe.
Dac dorim ca evaluarea s fie blocat, adic lista nu este o funcie, atunci se utilizeaz
funcia QUOTE. Astfel (quote (a b c)), scriere echivalent i cu '(a b c), furnizeaz lista (a, b, c),
fr a se ncerca vreo evaluare. Astfel, (quote ((+ 3 5) (* 4 5) (sqrt 16))) returnez construcia: ((+ 3
5) (* 4 5) (SQRT 16)), i nu lista (8 20 4). Observm c funcia QUOTE are rolul identitii.
Atunci cnd dorim formarea unei liste din componente care mai nti se evalueaz folosim
funcia list. Prin urmare (list (+ 3 5) (* 4 5) (sqrt 16)) va produce (8 20 4.0).
1.3 Antrenamente AutoLISP - 1
1.3.1. Operatori AutoLISP
Presupunem c sistemul AutoCAD a fost activat. Redimensionm fereastra text (unde apare
promptul Command: Ne vom familiariza, mai nti, cu operatorii AutoLISP. Acetia sunt: +
(adunare), - (scdere), * (nmulire), / (mprire dependent de natura operanzilor), = (egal cu), /=
(diferit de), < (mai mic dect), <= (mai mic dect sau egal cu), > (mai mare dect), >= (mai mare
dect sau egal cu), ~ (negare bit cu bit complementul fa de 1), 1+ (incrementare cu 1), 1(decrementare cu 1).
n linia de comand, scriei expresia AutoLISP, apoi apsai tasta ENTER () i privii
rezultatul afiat. Iniial urmrii secvena de dialog urmtoare:
Command: (+)
0
Command: (+ PI)
3.14159
Command: (+ 1 2)
3
Command: (+ 1 2 3 4)
10

Observai c dac lista nu conine argumente, atunci rezultatul obinut este zero. Dac exist un
singur argument rezultatul final se obine prin adunarea elementului neutru zero. Dac lista
conine dou sau mai multe argumente, atunci funcia returneaz suma tuturor argumentelor. n cele
ce urmeaz o astfel de situaie va fi exemplificat astfel:
(+) -> 0
(+ PI) -> 3.14159
(+ 1 2) -> 3
(+ 1 2 3 4) -> 10

Acum exersai celelate operaii dup modelele:


(-) -> 0
(- 2) -> -2
(- 4 1) -> 3
(- 9 6 2) -> 1
(*) -> 0
(* PI) -> 3.14159

(* PI 2) -> 6.28319 ; 2
(* 1 2 3 4 5) -> 120 ; 5! (factorial)
(/) -> 0
(/ 4) -> 4
(/ 1.0 4) -> 0.25
(/ 24 3 2) -> 4

(=) ->
error: too few arguments
(=)
*Cancel*
(= 4 4) -> T
(= 4 4.0) -> T
(/= 4) -> T
(/= 4 4) -> nil
(/= nil NIL) -> nil
(/= 4 4.0) ->nil
(/=) ->
error: too few arguments
(/=)
(<) ->
error: too few arguments
(<)
(< 1) -> T
(< 1 2) -> T
(< 2 1) -> nil
(< 1 2 3 4 5) -> T
(< "AutoCAD" "AutoLISP") ->T
(<=) ->
error: too few arguments
(<=)
(<= 2) -> T
(<= 2 3) -> T
(<= 2 2 4 6 6 8 9) -> T

(<= 4 3) -> nil


(<= "luni" "marti" "miercuri") -> T
(>=) ->
error: too few arguments
(>=)
(>= 7 5 5 2 1)-> T
(>= "MARE" "mare") -> nil
(1+ 3 4) ->
error: too many arguments
(1+ 3 4)
(1+ 3) -> 4
(1+ PI) -> 4.14159 ; +1
(1+) ->
error: too few arguments
(1+)
(1- (* 2 PI)) -> 5.28319 ; 2-1
(~ 1) -> -2
(~ -2) -> 1
(~ 32767) -> -32768
(~ 1234) -> -1235
(~) ->
error: too few arguments
(~)
(~ 1 2) ->
error: too many arguments
(~ 1 2)

1.3.2. Funcii aritmetice i trigonometrice


Continum investigarea funciilor matematice. Maximul, respectiv minimul unui ir de numere x1,
x2, ..., xn se determin folosind expresia (max x1 x2 ... xn), respectiv (min x1 x2 ... xn). Valoarea
absolut a numrului x se obine prin expresia (abs x), logaritmul natural al numrului x este dat de
expresia (log x), funcia exponenial (ex) se evalueaz prin (exp x), rdcina ptrat a numrului
nenegativ x este dat de expresia (sqrt x), iar funcia putere (ax) este evaluat prin expresia (expt a
x). Funciile trigonometrice se aplic pentru unghiuri exprimate n radiani. Sinusul, respectiv
cosinusul unui a se obine prin evaluarea expresiei (sin a), respectiv (cos a). Arctangenta unui
numr real a reprezint unghiul, n radiani, a crui tangent este a. Acesta se obine prin evaluarea
expresie (atan a). Funcia atan se poate aplica i asupra a dou argumente; n acest caz (atan a b)
este (atan (/ a b)) dac b este nenul, iar dac b = 0 atunci returneaz /2, n funcie de semnul
numrului a.
Exersai funciile amintite, dup modelele:
(max 10 7 45 34 21) -> 45
(max) -> 0
(max "A" "B" "ALFA") ->
error: bad argument type
(MAX "A" "B" "ALFA")
(min) -> 0
(min 23 67 54 34 2 -23 76) -> -23
(abs (- PI)) -> 3.14159
(abs -45) -> 45
(log 1.0) -> 0.0
(log -2) ->
error: function undefined for argument
(LOG -2)
(log 2.71828) -> 0.999999
(exp 1.0) -> 2.71828
(exp 0.5) -> 1.64872
(exp -1) -> 0.367879
(exp -0.5) -> 0.606531

(sqrt -4) ->


error: function undefined for argument
(SQRT -4)
(sqrt 16.0) -> 4.0
(expt PI 2) -> 9.8696
(sin (/ PI 2)) -> 1.0
(sin (/ PI 4)) -> 0.707107
(cos (/ PI 2)) -> 6.12303e-017
(cos (/ pi 2)) -> 6.12303e-017
(cos (/ PI 3)) -> 0.5
(atan (sqrt 3)) -> 1.0472
(sin 1.0472) -> 0.866027
(cos 1.0472) -> 0.499998
(atan 1 1) -> 0.785398
(atan 1 -1) -> 2.35619
(atan -1 1) -> -0.785398
(atan -1 -1) -> -2.35619
(atan 1 0) -> 1.5708
(atan -1 0) -> -1.5708

1.3.3. Operaii logice i la nivel de bit n AutoLISP


Funciile logice AutoLISP sunt: not, and, or. Pentru realizarea operaiilor logice la nivel de bit se
utilizeaz funcia boole.
Operaia logic and ntre expresiile prezente este realizat folosind funcia and. La prima
valoare NIL ntlnit, evaluarea expresiei este oprit, iar rezultatul final este nil. Operaia logic or
este realizat folosind funcia or. La prima apariie a unei valori non-IL returnez T, altfel
returneaz nil. Funcia logic not returneaz T dac argumentul este asociat cu nil i returneaz nil,
n caz contrar.
Exersai dup modelele care urmeaz.
(and 1961 25 1) -> T
(and 1961 nil 25 1) -> nil
(and "a" "b" "c") -> T
(and "" "a") -> T
(or "a" nil) -> T
(or nil nil) -> nil
(or 1961 25 1) -> T
(or) -> nil
(or "a" nil) -> T

(or nil nil) -> nil


(or 1961 25 1) -> T
(not "a") -> nil
(not nil) -> T
(not (= 4 (sqrt 16))) -> nil
(not T) -> nil
(not) ->
error: too few arguments
(NOT)

Operaiile la nivel de bit se realizeaz cu ajutorul funciei Boole prin specificarea codului operaiei
dorite (1 pentru AD, 6 pentru XOR6, 7 pentru OR i 8 pentru OR7) i a operanzilor de tip ntreg,
conform sintaxei:
(Boole cod_funcie arg1 arg2 ...)
Exersai dup modelul urmtor. Pentru a nelege rezultatul obinut trebuie s considerai irurile
binare asociate argumentelor.
(Boole 1 1961 25) -> 9
(Boole 6 1961 25) -> 1968
(Boole 7 1961 25) -> 1977
(Boole 8 1961 25) -> -1978

(Boole 8 0 0) -> -1
(Boole 8 1 1) -> -2
(Boole 8 32767 0) -> -32768
(Boole 8 0 -32768) -> 32767

1.3.4. Predicate de baz n LISP i AutoLISP


Un predicat LISP, deci i AutoLISP, este o funcie care realizeaz un test i returneaz T (cu
valoare de adevrat) sau nil (cu valoare de fals). Orice obiect care nu este nil este "considerat"
adevrat.
Unele predicate au litera p ca sufix al identificatorului: numberp, zerop, minusp i listp. Alte
predicate sunt: atom, equal, eq, null i member. n mod evident, testele de egalitate (=), inegalitate
(/=), cretere (<=), cretere strict (<), descretere (>=) i descretere strict (>) produc tot un
rezultat cu valoare logic.
Expresia (numberp argument) returneaz T dac argument este evaluat la un numr i nil,
n caz contrar. Expresia (zerop argument) returneaz T dac argument este evaluat la valoarea zero
i nil, n caz contrar. Testarea negativitii unei valori este realizat de predicatul minusp. Astfel,
expresia (minusp argument) returneaz T dac argument este evaluat la o valoare negativ i nil,
altfel. Similar, expresia (listp argument) returneaz T dac argument este evaluat la o list i nil, n
caz contrar.
Exersai dup modelele urmtoare:
(numberp 8.9) -> T
(numberp nil) -> nil
(numberp "a") -> nil
(zerop 0.0) -> T
(zerop 0) -> T
(zerop (- (* 3 3) (sqrt 81))) ->T
(zerop nil) ->
error: bad argument type
(ZEROP nil)

(minusp -5.0) -> T


(minusp 7) -> nil
(listp '(1 2 3)) -> T
(listp (quote ((+ 3 5) (* 4 5) (sqrt 16)))) -> T
(listp (list 1 2 3)) -> T
(listp nil) -> T
(listp ()) -> T
(listp 1) -> nil
(listp 1 2 3) -> nil

Funcia atom, utilizat n expresia (atom argument), testeaz dac valoarea evaluat a argumentului
este un atom. Funcia equal, utilizat n expresia (equal argument1 argument2), returneaz T dac
evalurile celor dou argumente coincid. Altfel se obine valoarea nil. Funcia eq din expresia (eq
argument1 argument2) returneaz T dac cele dou argumente se refer la acelai obiect. Dac
evaluarea unui argument conduce la valoarea nil, atunci funcia null, n expresia (null argument),
returneaz valoarea T. Funcia member este prezent n expresii cu structura (member argument1
argument2) i returneaz nil dac valoarea evaluat a primului argument nu se afl printre
componentele celui de-al doilea argument, care trebuie s fie o list. n caz contrar se obine sublista
care conine pe argument1 ca prim element i pe toate celelalte elemente care i urmau n argument2.
Exersai dup modelele de mai jos:
(atom "a") -> T
(atom 1 2 3) -> T
(atom '(1 2 3)) -> nil
(atom (list 1 2 3)) -> nil
(equal (list 1 2 3) '(1 2 3)) -> T
(equal 16 (sqrt 256)) -> T
(eq (list 1 2 3) '(1 2 3)) -> nil
(eq 16 (sqrt 256)) -> T
(eq nil (and nil T)) -> T
(null T) -> nil

(null nil) -> T


(null (and "AutoCAD" T nil)) -> T
(null 'nil) -> T
(null '5) -> nil
(member (sqrt 16) (list 1 2 3 4 5)) -> (4 5)
(member (expt 2 3) '(5 8 11 14 17)) ->
(8 11 14 17)
(member 4 '(1 2 3)) -> nil
(member 1 ()) -> nil
(member nil ()) -> nil

1.3.5. Funcii de baz pentru lucrul cu liste


Crearea unei noi liste prin adugarea la o list a unui nou element ca prim element n lista nou se
realizeaz folosind funcia cons printr-o expresie de forma (cons element lista). Funcia cons
ntoarce noua list. Dac al doilea element este un atom atunci funcia cons returneaz o pereche cu
punct: (cons a b) -> (a . b).
Pentru o list dat, primul element al listei se obine prin funcia car, precum n expresia
(car lista). Elementul este returnat neevaluat. Lista elementelor unei liste date, n afara primului
element, se obine cu ajutorul funciei cdr, precum n expresia (cdr lista).
AutoLISP permite mixarea ("cuibrirea") funciilor car i cdr pn la patru niveluri. Astfel
urmtoarele combinaii sunt corecte:
caaaar
cadaar
cdaaar
cddaar
caaadr
cadadr
cdaadr
cddadr
caaar
cadar
cdaar
cddar
caadar
caddar
cdadar
cdddar
caaddr
cadddr
cdaddr
cddddr
caadr
caddr
cdadr
cdddr
caar
cadr
cdar
cddr
Astfel apelul (caddar x) este echivalent cu (car (cdr (car (cdr (x)))).
Funcia append, ntr-o expresie de forma (append lista1 lista2 ... listan), formeaz o nou
list prin concatenarea (alipirea) listelor furnizate ca argumente.
O nou list n care elementele unei liste apar n ordine invers se obine folosind funcia
reverse, ntr-o expresie de forma (reverse lista). Lungimea unei liste se obine prin utilizarea
funciei length ntr-o expresie de forma (length lista). Elementele unei liste pot fi obinute i prin
specificarea poziiei acestora ntr-o expresie de forma (nth expresie_numerica lista). Poziia
primului element al unei liste este 0. Ultimul element al unei liste se obine prin funcia last precum
n expresia (last lista).
Pentru o list de perechi cu punct are sens utilizarea funciei assoc, ntr-o expresie de forma
(assoc parte_stnga lista_perechi_cu_punct). Se va returna prima pereche cu punct, de la stnga la
dreapta, care se potrivete relativ la poziia din stnga.
Pentru modificarea listelor este util funcia subst care, pentru o expresie de forma (subst
nou vechi lista), returneaz lista nou n care prima apariie (de la stnga la dreapta) a argumentului
vechi, din lista, este nlocuit cu elementul nou. Dac nou nu exist returneaz lista elementelor din
lista dat.

Exersai dup modelele de mai jos:


(cons 1 2) -> (1 . 2)
(cons 3 (list 1 2)) -> (3 1 2)
(cons 4 '(3 2 1)) -> (4 3 2 1)
(cons (sqrt 9) '(10 20 30)) -> (3.0 10 20 30)
(cons '(1 2) '(10 20 30)) -> ((1 2) 10 20 30)
(car '("Programare" "in" "AutoLISP")) -> "Programare"
(cdr '("Programare" "in" "AutoLISP")) -> ("in" "AutoLISP")
(cadr '("Programare" "in" "AutoLISP")) -> "in"
(append '(1 3 5) '(2 4 6)) -> (1 3 5 2 4 6)
(reverse '(1 2 3 4 5)) -> (5 4 3 2 1)
(length '(1 2 3 4 5)) -> 5
(nth 4 '(1 2 3 4 5)) -> 5
(subst 5 pi '(1 2 3 4 5 6 7 8)) -> (1 2 3 4 5 6 7 8)
(subst pi 5 '(1 2 3 4 5 6 7 8)) -> (1 2 3 4 3.14159 6 7 8)
(assoc 'a '( (x . 1) (a . 2) (y . 3))) -> (A . 2)

1.4 Exerciii propuse


1. Scriei listele asociate expresiilor:
a) (3+5)*6-(7+8*6) b) (3 + 5 +8) / (2 * 3 *6)
c) (35 + 23) * (210 + 1)
2. Care este rezultatul evalurii listei (+ (* 2 2) (* 4 4) (* 6 6))? Dar al expresiei '(+ 1 2 3).
3. Dai exemplu de atomi numerici. Construii atomi simbolici coreci.
4. Scriei sub form de arbori binari urmtoarele perechi cu punct:
a) (x . nil) . (y z))
b) ((x . y) . ((u . v) . w))
c) (u . ( v . nil))
5. Reluai antrenamentul de mai sus pentru alte construcii.
1.5 Bibliografie
1. G. Albeanu, Programarea i utilizarea calculatoarelor, Editura Universitii din Oradea, 2003.
2. Dumitru Dragomir, Proiectare asistat de calculator pentru inginerie mecanic, Teora, 1996.
3. Mihaela Malia, Antrenamente LISP, Editura Universitii din Bucureti, 1998.

1.6. ote finale


1

Exemplele prezentate n aceast parte a lucrrii au fost testate folosind sistemul AutoCAD R14.
Prima form a limbajului LISP (LISt Processing) a fost elaborat de John McCarthy n 1958 pentru manipularea
cunotinelor n cadrul inteligenei artificiale.

A se vedea i capitolul 5, seciunile 5.1 i 5.2 din lucrarea [1]. LISP utilizeaz scrierea n preordine a expresiilor.
Astfel, n loc s scriem 3 + 5, vom scrie (+ 3 5).
4

Programatorul trebuie s nchid corect parantezele. Dac testai n mod comand anumite expresii, iar numrul
parantezelor dreapta este mai mic dect numrul parantezelor stnga, AutoCAD afieaz un prompt care indic numrul
parantezelor care lipsesc.
Dac introducem (* 3 atunci se afieaz
1>
n aplicaii AutoLISP o astfel de situaie este semnalat ca o eroare.
5

Secvenele escape uzuale sunt: \\ (pentru \), \e (pentru ESC), \n (pentru LF), \r (pentru CR), \t (pentru TAB). De
asemenea, utilizatorul trebuie s cunoasc semnificaia special a unor caractere: parantezele rotunde (specificarea
listelor), spaiul delimitator, ; - arat iniierea unui comentariu de tip linie, punctul specificarea perechilor asociative,
ghilimelele delimitarea irurilor de caractere.
6

Este vorba de operaia SAU Exclusiv care conduce la valoarea 1 numai pentru combinaiile (1, 0) i (0, 1). Altfel se
obine valoarea 0.
7

Conduce la valoarea 1 cnd ambele intrri sunt 0, altfel rezult valoarea 0.

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