Sunteți pe pagina 1din 26

1.

PROGRAMARE LISP
AutoCAD ofer mai multe tipuri de interfee de programare a aplicaiilor: AutoLISP,
VBA (Visual Basic for Applications) i ARX (programare n C++). n acest capitol vor fi
prezentate noiuni de baz pentru realizarea aplicaiilor personale n LISP.

1.1 Introducere
Limbajul LISP (LISt Processing) a fost creat n anii 50, fiind destinat domeniului
inteligenei artificiale. Modelul su logico-matematic se bazeaz pe calculul LAMBDA
(elaborat n 1941, ca instrument n studiul teoretic al calculabilitii). Un program LISP
prelucreaz expresii simbolice. Acestea sunt prelucrate cu ajutorul unui program numit
interpretor LISP.
n LISP datele sunt reprezentate prin liste. De exemplu, coordonatele unui punct sunt
coninute ntr-o list. LISP-ul poate manipula structuri orict de complexe de date, structuri ce
se construiesc dinamic, pe parcursul execuiei programului. Lista este o secven oarecare de
elemente, care la rndul lor pot fi liste sau atomi. Atomii sunt obiectele primare cu care
lucreaz LISP-ul; pot fi simboluri, numere sau iruri de caractere. Grupurile de atomi
formeaz liste, care la rndul lor pot fi grupate n alte liste. Acest mod de organizare a
informaiei ofer o mare flexibilitate programului.
n general, o list are forma:
(a1 a2 ..... an) unde a1...an sunt atomi sau alte elemente LISP.
Se poate considera c aceast list este format din dou elemente:
a1 i (a2 a3 ..... an)
Primul element se noteaz CAR, iar al doilea CDR. Presupunnd c avem cele dou
elemente separate i vrem s le adunm ntr-o list, primul element (CAR) se va numi
constructor al listei respective. Vom putea astfel s ne reprezentm orice expresie LISP sub
form de succesiuni de grupuri de cte dou elemente: un operator i un operand.
Cnd constructorul unei liste este un operator LISP (putem s-i spunem i funcie LISP
primitiv), avem de-a face cu o expresie, pe care o va evalua interpretorul. Cnd constructorul
este un element oarecare, evaluarea listei se va face printr-un program. Astfel, baza de date a
AutoCAD-ului este o succesiune de liste, corespunztoare cte unei entiti din desen.
O entitate AutoCAD poate avea mai multe proprieti (culoare, tip de linie, layer, etc.).
Fiecrei proprieti i corespunde o sublist inclus n lista entitii respective. Iat, de
exemplu, lista unei linii:
((-1 . <Entity name: dcb9dd0>) (0 . "LINE") (330 . <Entity name:
de91840>) (5 . "190") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (6 . "ByLayer") (347 . <Entity name: 0>) (48 . 1.00000) (370 . -1)
(284 . 0) (100 . "AcDbLine") (39 . 0.000000) (10 21.5807 33.4081 0.000000)
(11 51.2520 20.5803 0.000000) (210 0.000000 0.000000 1.00000))

(-1 . <Entity name: ...>) este lista care ne ajut s identificm entitatea n baza de date a
AutoCAD-ului. Primul element (-1) este codul de identificare a listei respective n lista
complet a entitii. Fiecrei liste asociate unei proprieti i corespunde un cod. Codurile de
identificare a listelor sunt aceleai cu codurile folosite n fiierele DXF. <Entity name: ...>

este numele entitii. Fiecare entitate primete automat un nume n momentul crerii sale;
acest nume nu poate fi schimbat de ctre utilizator.
O succesiune de expresii LISP formeaz un program LISP. O list al crei constructor
nu este un operator nu reprezint o expresie, deci nu poate face parte dintr-un program; este o
list de date i va fi prelucrat cu ajutorul unui program. Iat regulile de formare i evaluare a
expresiilor simbolice (sintaxa i semantica limbajului):
- un ir de cifre (un numr), eventual precedat de "+" sau "-" i coninnd cel mult un
caracter "." este un atom numeric;
- un ir de caractere cuprins ntre ghilimele este un atom ir;
- un ir de caractere (cu excepia delimitatorilor \, spaiu, ") este un simbol;
- un atom este fie un simbol, fie un atom numeric, fie un atom ir;
- o list este o construcie de forma () sau (e) sau (e1 e2 ... en) cu n>=1, unde e1 ... en
sunt expresii simbolice;
- o pereche cu punct este o construcie de forma (e1 . e2) unde e1 i e2 sunt expresii
simbolice; e1 va fi identificatorul unei proprieti asociate unei entiti, iar e2 o list
de date asociat proprietii respective;
- atomii i listele sunt expresii simbolice;
- un program LISP este o succesiune de expresii simbolice.
Acestea sunt regulile sintactice. Iat acum regulile de evaluare (semantice):
- un atom numeric se evalueaz prin numrul respectiv;
- un ir de caractere se evalueaz prin chiar textul su (inclusiv ghilimelele);
- o list este evaluabil (adic reprezint o expresie) doar dac primul ei element este
numele unei funcii (un operator).
Un program LISP poate fi scris n orice editor de text. AutoCAD pune la dispoziia
utilizatorilor un editor propriu de cod LISP (Visual LISP Editor), ce poate fi lansat din grupul
Applications al paginii Manage din meniul tip ribbon.

1.2 Tipuri de date utilizate n LISP


n cele mai multe limbaje de programare, programatorul trebuie s declare tipul de dat
al fiecrei variabile, nainte de a putea utiliza variabilele. n LISP declararea variabilelor nu
este necesar. O variabil poate avea orice tip. Tipul este stabilit automat la prima atribuire a
variabilei.
Tipurile de date utilizate n LISP pentru AutoCAD sunt enumerate n continuare.
Simboluri
(symbols)

Sunt utilizate pentru memorarea unor valori. De exemplu, (setq s 1) atribuie


simbolului (variabilei) s valoarea 1.

Liste
(lists)

O list este o colecie de simboluri, numere sau iruri. Coordonatele unui


punct sunt stocate ntr-o list de forma
(x y z).
De exemplu, (1.0 2.0 3.0) este lista corespunztoare punctului cu coordonatele
(1,2,3).

iruri
(strings)

irul este o colecie de caractere alfanumerice. Lungimea maxim a unei


constante de tip string este de 132 caractere. O variabil string de orice
lungime poate fi creat folosind funcia strcat (concatenarea irurilor).

Numere ntregi
(integers)

Un numr ntreg este un numr fr punct zecimal. Un ntreg LISP este un


numr cu semn, stocat pe 32 de bii.

Numere reale
(reals)

Sunt numere care conin punctul zecimal.


(setq a 1) - a este ntreg
(setq a 1.0) - a este real

Descriptori de
fiiere
(file descriptors)

Descriptorul de fiier este eticheta asignat unui pointer la fiierul respectiv.


Ex: (setq f (open "fis.ext" "r")) - f este descriptor de fiier

Nume de entiti
(entity names)

Entitile AutoCAD pot fi referite prin LISP, folosind eticheta numeric a


acestora.
Ex: (setq e (entlast))
<Entity name: d8af290>

Mulimi de selecie
(selection sets)

O mulime de selecie este un grup de una sau mai multe entiti. Poate fi
creat cu funcia LISP ssget.
(setq m (ssget)) va determina apariia prompt-ului:
Select objects:
La ncheierea selectrii va returna, de exemplu: <Selection set: 226265424>

Funcii

Funciile sunt folosite n LISP pentru evaluarea listelor. Numele funciei este
totdeauna primul element al listei (este constructorul listei). Funcii noi pot fi
definite folosind funcia defun.

n implementarea LISP pentru AutoCAD exist patru tipuri de variabile: numere ntregi
(cu semn), numere reale, puncte i iruri.
Exemple:
ntreg

real

1.0

punct 2D

(1.1 10.5

punct 3D

(1.1 10.5 3.4)

ir

"SIR"

Pi este un nume de variabil predefinit, dar utilizatorul poate s-l redefineasc.


Tipul unei variabile se definete implicit prin setarea variabilei respective.
Exemplu:
(setq a 1)

a este ntreg

(setq a 1.0)

a este real

1.3 Definirea funciilor


Ca i n alte limbaje de programare, i n LISP exist posibilitatea definirii unor funcii,
care grupeaz mai multe prelucrri ce vor fi apelate cu un singur nume (numele funciei).
Introducerea unei funcii se va face tot cu ajutorul unei funcii: defun.
Aplicarea unei funcii asupra argumentelor este exprimat prin forme de tipul:
(funcie a1 a2 ... an)

unde a1, a2, ..., an sunt argumente care sunt eventual prelucrate n raport cu tipul funciei,
nainte de aplicarea efectiv, iar funcie este numele funciei.
Dac numele funciei definite este de forma C:xxx (xxx este numele propriu-zis al
funciei), atunci funcia respectiv poate fi apelat ca o comand AutoCAD.
Exemplu:
(defun c:mesaj()
(prompt "Nu avem mesaje")
)

Dup ncrcarea acestor linii de program vom putea folosi comanda mesaj la apariia
prompt-ului Command:
Command: mesaj
Nu avem mesaje
Command:

Programele LISP pot fi ncrcate automat, la lansarea n execuie a AutoCAD-ului, prin


includerea lor n fiierul icad.lsp (aflat n directorul n care este instalat AutoCAD). Un alt tip
de fiier ncrcat automat este .mnl. Aceste fiiere conin rutine LISP necesare n operaiile
din fiierul .mnu cu acelai nume. La ncrcarea unui nou fiier .mnu, AutoCAD-ul caut
i un fiier .mnl corespunztor i dac l gsete l ncarc automat. Dac exist i icad.lsp
i fiierul .mnl asociat meniului curent, primul este ncrcat icad.lsp, apoi i cellalt.
O funcie LISP poate fi executat automat la nceperea sesiunii de lucru, dac este
apelat n funcia s::startup, care va fi inclus n fiierul icad.lsp . Astfel, se pot redefini unele
comenzi AutoCAD.
Exemplu:
; coninutul fiierului icad.lsp
(defun C:QUIT()
... noua definiie ...
)
(defun C:END()
... noua definiie ...
)
(defun S::STARTUP()
(command "undefine" "quit")
(command "undefine" "end")
)

1.4 Utilizarea LISP-ului n AutoCAD


Exist mai multe niveluri la care poate fi utilizat LISP-ul n AutoCAD:
- utilizarea unor programe LISP existente;
- evaluarea de expresii LISP n timpul unei sesiuni obinuite de desenare;
- scrierea programelor LISP proprii.
Interpretorul LISP preia controlul n momentul deschiderii unei paranteze, i l cedeaz
la nchiderea parantezei.

Evaluarea expresiilor LISP


Inima interpretorului LISP este evaluatorul. Acesta preia fiecare linie de la dispozitivul
de intrare (tastatur sau fiier) i returneaz rezultatul evalurii ei, astfel:
- constantele, irurile, descriptorii de fiiere i funciile returneaz propria lor valoare;
- simbolurile (variabilele) returneaz valoarea lor curent;
- listele sunt evaluate n funcie de primul element.
Utilizarea programelor LISP
Codul programelor LISP este stocat n fiiere cu extensia .lsp, ce se pot ncrca n cursul
unei sesiuni de desenare folosind funcia load, astfel:
Command: (load "xplode")
C:XPLODE

De acum Xplode este o comand AutoCAD.


ncrcarea automat a programelor LISP se poate face prin includerea fiierelor sau a
comenzilor de ncrcare a acestora n fiierul icad.lsp, ce este ncrcat automat la pornirea
AutoCAD-ului.
De exemplu, coninutul fiierului icad.lsp poate fi:
(load "xplode")
(load "elist")
(load "3D")
(princ)

Se pot folosi programe LISP n felul acesta, fr s fie necesar cunoaterea coninutului
lor.
Introducerea programelor de la tastatur
LISP-ul este implementat printr-un interpretor, ceea ce permite introducerea
programelor de la tastatur, linie cu linie. Fiecare linie reprezint o list, care va fi evaluat
imediat dup nchiderea ei, adic dup nchiderea tuturor parantezelor deschise n lista
respectiv. LISP semnalizeaz dac o parantez a rmas deschis prin
1>
sau pentru dou paranteze deschise
2>
i aa mai departe.
Setarea unei variabile se face astfel:
Command: (setq a 1) - atribuie variabilei a valoarea ntreag 1.
Command: (setq a 1.0) - atribuie variabilei a valoarea real 1.0.

Se poate citi valoarea unei variabile prin apelarea numelui acesteia precedat de semnul
"!":
Command: !a
1.0

Putem folosi acest mod de apelare al variabilelor i n cadrul unei comenzi:


Command: (setq p1 '(0.0 0.0))
(0.0 0.0)

Command: (setq p2 '(10.0 10.0))


(10.0 10.0)

- pn aici am definit dou puncte 2D


- acum desenm o linie ntre ele:
Command: LINE
ENTER to use last point[Follow]<Start of line>: !p1
[Angle/Length]<End point>: !p2
[Angle/Length/Follow/Undo]<End point>: Enter

Pentru a folosi rezultatul evalurii unei variabile LISP ntr-un text, variabila texteval
trebui s aib valoarea 1, altfel "!" sau "(" vor fi tratate ca orice alt caracter. Nu se poate folosi
un nume de variabil pentru a nlocui o comand AutoCAD.
Evaluarea unei expresii se face astfel:
Command: (+ 1.0 1.0)
2.0

Scrierea programelor LISP


Un program LISP se scrie de obicei ntr-un fiier, folosind un editor de texte care
produce fiiere ASCII.
Programul urmtor definete o funcie LISP care dup ncrcarea fiierului cu load va
putea fi utilizat ca o comand AutoCAD cu numele elist. Rezultatul execuiei sale va fi lista
corespunztoare entitii selectate.
;comanda de listare a coninutului listei
;asociate unei entiti selectate
(defun c:elist()
(setq e (entsel))
(setq e (car e))
(setq l (entget e))
(setq nume (cdr (assoc '0 l)))
(if (= nume "POLYLINE") (progn
(setq n (getint "\nNumarul vertexului : "))
(repeat n
(setq e (entnext e))
)
))
(setq l (entget e))
)

1.5 Crearea entitilor AutoCAD


n continuare ne vom referi la crearea entitilor folosind funcia command.
Iat cum se poate desena o linie:
(command "LINE" p1 p2 "")

p1 i p2 sunt puncte definite anterior; de exemplu:


(setq p1 '(0.0 0.0 0.0))
(setq p2 '(10.0 0.0 0.0))

Efectul introducerii acestor linii de program va fi desenarea pe ecran a unei linii, iar n
baza de date a AutoCAD-ului apariia unei noi entiti, astfel:
((-1 . <Entity name: d8af290>) (0 . "LINE") (330 . <Entity name:
dae5628>) (5 . "190") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (6 . "ByLayer") (347 . <Entity name: 0>) (48 . 1.0) (370 . -1) (284 .
0) (100 . "AcDbLine") (39 . 0.0) (10 0.0 0.0 0.0) (11 10.0 0.0 0.0) (210
0.0 0.0 1.0))

Pentru vizualizarea acestei liste, se poate folosi funcia elist definit n subcapitolul
anterior.
Se observ c au aprut i liste independente de datele introduse (am definit doar listele
0, 10 i 11); dintre acestea unele sunt definite automat, altele corespund setrilor curente
(strat, culoare). Aceste liste pot fi controlate prin introducerea altor comenzi:
(command "LAYER" "s" "1" "")
(command "COLOR" 1)
(command "LINE" p1 p2 "")

Ca efect, se va observa modificarea stratului curent (presupunem c stratul cu numele


"1" a fost creat anterior), a culorii curente i, bineneles, apariia unei linii cu aceast culoare.
n baza de date apare entitatea cu lista asociat:
((-1 . <Entity name: ...>) (0 . "LINE") (8 . "1") (62 . 1) (10 0.0
0.0 0.0)
(11 10.0 0.0 0.0) (210 0.0 0.0 1.0))

Dac dorim s introducem unul din punctele p1 sau p2 prin punctare pe ecran, folosim
simbolul predefinit pause, astfel:
(command "CIRCLE" p1 pause)

Pause n acest exemplu determin ateptarea razei cercului; aceasta poate fi introdus
prin unul din modurile acceptate de AutoCAD.
Accesul la entiti
Pentru a folosi datele cuprinse n lista asociat unei entiti, este necesar ca aceasta s
fie n prealabil selectat. Selectarea entitilor se poate face individual sau n grup.
Selectarea unei singure entiti se face prin funcia entsel, care ntoarce numele entitii
selectate i punctul prin care s-a fcut selectarea.
Command: (entsel)
Select object: 1,0,0
(<Entity name: d8af290> (1.0 0.0 0.0))

Pentru a ajunge la lista entitii, va trebui s separm numele acesteia de punctul prin
care am selectat-o:
(setq l (entget (car (entsel))))

Rezultatul va fi lista binecunoscut (numele ei va fi l):


((-1 . <Entity name: d8af290>) (0 . "LINE") (8 . "0") (10 0.0 0.0 0.0)
(11 10.0 0.0 0.0) (210 0.0 0.0 1.0))

n aceast list (simplificat), (8 . "0") este sublista corespunztoare stratului n care a


fost desenat linia. Iat cum poate fi citit:
(setq lay (cdr (assoc '8 l)))

Variabila lay va lua valoarea "0". Am vzut deja ntr-un exemplu de mai sus cum pot fi
selectate entitile cu aceeai culoare. Exemplul poate fi urmat i pentru alte caracteristici.
Astfel, pentru selectarea entitilor din stratul "0" se poate scrie:
(setq e (entnext)) ; prima entitate din desen
(setq m (ssadd)) ; iniializarea mulimii de selecie
(while (not (equal e nil))
; ciclu n care se parcurge tot desenul
(setq l (entget e)) ;lista asociat entitii e
(setq lay (cdr (assoc '8 l))) ;stratul asociat entitii
(if (= lay "0") ; dac stratul este "0"
(setq m (ssadd e m))
; adaug entitatea e la mulimea de selecie m
)
(setq e (entnext e)) ; trece la entitatea urmtoare
) ; nchiderea ciclului

tergerea unei entiti se poate face cu funcia entdel. Uneori, este mai bine s fie
folosit comanda Erase. Dac dorim s tergem toate entitile din stratul "0", selectate n
exemplul de mai sus, scriem:
(command "erase" m "")

Iat cum puteau fi terse pe rnd entitile din mulimea m:


(setq i 0) ; iniializarea unui contor
(setq e (ssname m i))
; selectarea primei entiti din mulime
(while (not (equal e nil))
; ciclul n care se parcurge mulimea de selecie
(entdel e) ; tergerea entitii
(setq i (1+ i)) ; incrementarea contorului
(setq e (ssname m i))
)

Toate funciile care se refer la entiti sunt cuprinse n lista de mai jos.

entdel

terge o entitate

entget

ntoarce lista asociat unei entiti

entlast

ntoarce numele ultimei entiti din baza de date (entitate principal,


deci nu atribut sau vertex)

entmake

creeaz o entitate pe baza unei liste specificate

entmod

modific o entitate deja aflat n baza de date

entnext

urmtoarea entitate

entsel

selecteaz o entitate mpreun cu punctul prin care se face


selectarea

entupd

actualizeaz entitatea principal cnd s-au modificat (cu entmod)


entiti secundare

nentsel

permit accesul la entitile secundare

nentselp
handent

ntoarce numele entitii cu identificatorul (handle) specificat

1.6 Funcii pentru introducerea datelor


(initget [bits] [ir])
Aceast funcie stabilete opiunile de utilizare a funciilor entsel, nentsel, nentselp sau
getxxx (exceptnd getstring, getenv i getvar). Initget ntoarce ntotdeauna nil.
Argumentul [bits] poate lua valorile:
- 1 dezactiveaz intrare nul
- 2 dezactiveaz valori zero
- 4 dezactiveaz valori negative
- 8 nu verific limitele (indiferent de variabila LIMCHECK)
- 16 ntoarce puncte 3D n loc de puncte 2D
- 32 folosete linie ntrerupt pentru linia temporar.
Se poate folosi pentru initget o sum a biilor de mai sus (adic mai muli bii setai n
acelai timp). Dac utilizatorul nu respect una sau mai multe opiuni specificate prin initget,
AutoCAD va cere repetarea introducerii. Astfel, pentru a nu permite introducerea valorilor
negative sau zero se poate folosi (initget 6) sau (initget (+ 2 4)).
Dac la urmtoarea funcie getxxx se va introduce o valoare nul sau negativ, se va
cere repetarea introducerii pn cnd se introduce o valoare valid.
Argumentul [ir] este o list de cuvinte cheie ce vor fi verificate de funcia getxxx
urmtoare dac nu se introduce tipul ateptat pentru intrare (de exemplu pentru getpoint nu se
introduce un punct, ci un caracter); efectul este asemntor cu cel de la comenzile AutoCAD
cu mai multe opiuni.
(getangle [pct] [prompt])
Aceast funcie ateapt introducerea de ctre utilizator a unui unghi (n grade sau prin
punctare) i ntoarce valoarea acestuia n radiani. Unghiul se msoar n sens trigonometric,
de la valoarea stabilit prin setarea variabilei ANGBASE. Valoarea returnat (n radiani) este
relativ la UCS-ul curent, n planul XY al acestuia.
Argumentul [prompt] este un ir de caractere afiat n ateptarea introducerii unghiului.
(getangle '(1.0 3.5) "Introducei unghiul: ")

sau
(getangle "Introducei unghiul: ")

Unghiul introdus depinde de setarea variabilelor ANGDIR i ANGBASE. Unghiul


obinut (ntors de getangle) depinde numai de sistemul de coordonate.
(getorient [pct] [prompt])
Aceast funcie este similar funciei getangle, dar valoarea ntoars la apelarea ei nu
este afectat de starea variabilelor ANGDIR i ANGBASE. Unghiul este msurat ntotdeauna
ncepnd de la 0 radiani (axa X), n sens trigonometric. Argumentele [pct] i [prompt] au
aceeai semnificaie ca la funcia getangle.
9

(getpoint [pct] [prompt])


Funcia getpoint se folosete pentru introducerea punctelor. Acestea pot fi introduse
prin specificarea coordonatelor (x, y n cazul punctelor 2D i x, y, z n cazul punctelor 3D) sau
prin punctare cu mouse-ul. Dac exist argumentul [pct], acesta este considerat punct de baz.
(setq p (getpoint))
(setq p (getpoint "Introducei un punct: "))
(setq p (getpoint '(1.0 1.0) "Al doilea punct: "))

(getcorner pct [prompt])


Funcia getcorner ntoarce un punct n sistemul curent de coordonate, ca i funcia
getpoint, dar accept ca argument un punct, care va fi punctul de baz (colul din stnga-jos)
al unui dreptunghi, cellalt col fiind punctul ntors de getcorner. Dac punctul de baz este
un punct 3D, coordonata Z este ignorat. Coordonata Z a punctului obinut este elevaia
curent.
(getdist [pct] [prompt])
Funcia getdist determin citirea unei distane, care poate fi introdus ca numr real,
prin tastarea acestuia, sau prin specificarea a dou puncte, funcia ntorcnd distana dintre
acestea. Dac punctele sunt 3D, distana ntoars de getdist este distana n spaiu dintre ele.
Dac este setat bitul 16 de la funcia initget, se ignor coordonata Z.
(setq
(setq
(setq
(setq

dist
dist
dist
dist

(getdist))
(getdist '(0.0 10.0)))
(getdist "Introduceti distanta: "))
(getdist '(0.0 10.0) "Introduceti distanta: "))

(getint [prompt])
Funcia getint se folosete pentru citirea unui numr ntreg (de la tastatur).
(setq n (getint))
(setq n (getint "\nIntroduceti numarul: "))

(getreal [prompt])
Funcia getreal se folosete pentru citirea unui numr ntreg (de la tastatur).
(setq r (getreal))
(setq r (getreal "\nIntroduceti numarul: "))

(getstring [cr] [prompt])


Aceast funcie se folosete pentru citirea de la tastatur a unui ir de caractere. Dac
irul introdus are mai mult de 132 de caractere, funcia getstring ntoarce un subir format din
primele 132 de caractere. Dac irul conine caracterul "\" (backslash), acesta este transformat
n "\\" (dou caractere).
Dac argumentul [cr] este prezent i nu este nil, irul introdus poate s conin blancuri
(spaii), i trebuie s se ncheie cu Enter. Altfel, irul se poate ncheia cu Enter sau blanc.
(setq sir (getstring "Cum te cheama? "))

- rspuns: Ion Ion


- funcia ntoarce: "Ion"
10

(setq sir (getstring T "Cum te cheama? "))

- rspuns: Ion Ion


- funcia ntoarce: "Ion Ion"
(setq numefis (getstring "Nume fisier: "))

- rspuns: \acad\fisi
- funcia ntoarce: "\\acad\\fisi"
(getkword [prompt])
Funcia getkword permite introducerea unui cuvnt cheie de ctre utilizator. Lista
cuvintelor cheie admise este stabilit anterior, prin funcia initget. Cuvntul cheie este returnat
de funcie ca un ir de caractere. Dac rspunsul nu este valid, AutoCAD rencearc citirea,
ntorcnd mesajul "Try again:". Dac rspunsul este nul (Enter), funcia ntoarce nil. De
asemenea, dac nu este precedat de initget, funcia ntoarce nil.
(initget 1 "Yes No")
(setq x (getkword "Sigur? (Yes/ No)"))

n funcie de rspunsul utilizatorului, variabila x poate lua valorile "Yes" sau "No".

1.7 Mulimi de selecie


(ssget [mod] [pct1] [pct2] [list_pct] [list_filtre])
Funcia ssget creeaz o mulime de selecie. Modurile de selecie sunt cele cunoscute de
la comanda Select; de fapt, comanda Select i funcia ssget au acelai efect, dar prin ssget
putem da un nume mulimii create i astfel s o folosim n orice moment al sesiunii de lucru.
(ssadd [nume_ent [ss]])
Se adaug entitatea cu numele nume_ent la mulimea de selecie ss. Dac nu exist nici
un argument, ssadd creeaz o nou mulime, vid. Dac este apelat sub forma (ssadd
nume_ent), funcia creeaz o nou mulime de selecie, ce conine numai entitatea nume_ent.
(ssdel nume_ent ss)
Entitatea nume_ent este eliminat din mulimea de selecie ss. Dac nume_ent nu este
element al mulimii ss, se ntoarce nil.
- e1 este element al mulimii ss, iar e2 nu
(ssdel e1 ss)

ss ; este ntors numele mulimii de selecie, din care a fost eliminat e1.
(ssdel e2 ss)
nil

(sslength ss)
Se obine lungimea mulimii de selecie ss, sub forma unui numr ntreg (numrul de
elemente).
(setq ss (ssget "L")) ;se creeaz mulimea ss format numai din ultima
entitate desenat
(sslength ss)

1 ; lungimea mulimii ss este 1.


11

(ssname ss index)
Se obine entitatea indicat de index (numr ntreg) din mulimea ss. Dac index este
negativ sau mai mare dect (sslength ss), se ntoarce nil.
(ssname ss 0) ntoarce primul element al mulimii ss
(ssmemb nume_ent ss)
Se verific dac entitatea cu numele nume_ent aparine mulimii de selecie ss; dac da,
se ntoarce numele entitii, altfel se ntoarce nil.
- e1 este element al mulimii ss, iar e2 nu
(ssmemb e1 ss)
e1
(ssmemb e2 ss)
nil

1.8 Funcii aritmetice


Cu cteva excepii, funciile aritmetice accept ca argumente att numere ntregi, ct i
numere reale. n cazul n care o parte din parametri sunt numere ntregi, iar restul sunt numere
reale, rezultatul va fi neaprat un numr real.
ntruct majoritatea funciilor au semnificaie evident, comentariile asupra lor sunt
minime.
(+ numr1 numr2 ...)
Rezultatul evalurii acestei funcii este suma argumentelor. Dac toate argumentele sunt
de tip ntreg rezultatul va fi un numr ntreg. Dac cel puin un argument este de tip real,
rezultatul va fi un numr real; argumentele rmn nemodificate.
(+ 7 5)
12
(+ 7.0 5)
12.0

(1+ numr)
Aceasta este funcia de incrementare i este, de fapt, forma prescurtat a apelului
(+ numr 1)

Se obine valoarea argumentului incrementat cu 1.


(1+ 5)
6

(- numr1 [numr2 ...])


Rezultatul evalurii funciei este diferena dintre valoarea primului argument i suma
celorlalte argumente. Dac exist un singur argument, rezultatul va fi diferena dintre 0 i
acesta, adic valoarea argumentului negat.
(- 7)
-7

12

(- 7 5)
2
(- 7.0 5)
2.0

(1- numr)
Aceasta este funcia de decrementare i, similar funciei de incrementare, este forma
prescurtat a apelului (- numr 1).
(1- 5)
4

(* numr1 [numr2] ...)


Rezultatul este produsul argumentelor.
(* 7 5)
35
(* 7.0 5)
35.0

(/ numr1 [numr2] ...)


Rezultatul este ctul obinut prin mprirea primului argument la al doilea, rezultatul
mprit la al treilea argument .a.m.d. Dac exist un singur argument, rezultatul este
valoarea acestuia.
(/ 5 4)
1
(/ 5.0 4)
1.25
(/ 5)
5

(~ numr)
Aceast funcie returneaz complementul fa de 1 al argumentului, care trebuie s fie
neaprat de tip ntreg.
(~ 3)
-4
(~ 100)
-101
(~ -4)
3

(abs numr)
Se obine valoarea absolut a argumentului (ntreg sau real).
(abs -3)
3

(atan numr1 [numr2])


Rezultatul evalurii acestei funcii este arctangenta argumentului "numr1". Dac exist
i al doilea argument (numr2), se obine arctangenta unghiului dat de numr1/numr2. Dac
13

numr2 este 0, se obine arctangenta unui unghi de 90 sau -90, n funcie de semnul
argumentului numr1. Rezultatul obinut este exprimat n radiani.
(atan 2.0 3.0)
0.588003
(atan 2.0 -3.0)
2.55359
(atan 1.0 0.0)
1.5708
(atan -0.5 0.0)
-1.5708

(cos unghi)
Rezultatul este cosinusul unghiului a crui valoare n radiani este argumentul "unghi".
(cos 0.0)
1.0
(cos pi)
-1.0

(exp numr)
Funcia exp (exponenial) ntoarce numrul real ce reprezint puterea indicat de
argumentul "numr" a lui e (baza logaritmilor naturali).
(exp 1.0)
2.71828
(exp 2.2)
9.02501
(exp -0.4)
0.67032

(expt baz putere)


Rezultatul este numrul "baz" ridicat la puterea "putere".
Se obine un numr ntreg dac ambele argumente sunt ntregi i un numr real dac cel
puin unul din argumente este numr real.
(expt 2 4)
16
(expt 3.0 2)
9.0

(fix numr)
Aceast funcie ntoarce rezultatul conversiei argumentului (numr real sau ntreg) ntrun ntreg. Conversia const n trunchierea numrului real, ca n exemplul:
(fix 3.7)
3

(float numr)
Funcia float ntoarce rezultatul conversiei argumentului (numr real sau ntreg) ntr-un
numr real.
(float 3)

14

3.0
(float 3.75)
3.75

(gcd numr1 numr2)


Rezultatul evalurii funciei gcd (greatest common denominator) este cel mai mare
numitor comun al celor dou numere date ca argumente. Acestea trebuie s fie neaprat
ntregi.
(gcd 81 57)
3
(gcd 12 20)
4

(log numr)
Aceast funcie ntoarce logaritmul natural al argumentului. Se obine un numr real.
(log 4.5)
1.50408

(logand numr1 numr2 ...)


Se efectueaz o operaie AND (I logic) ntre numerele din list, care trebuie s fie
ntregi; rezultatul este de asemenea un numr ntreg.
(logand 7 15 3)
3
(logand 2 3 15)

;se efectueaz un I ntre 0010B, 0011B i 1111B i rezult 0010B, adic 2.


(logand 8 3 4)
0

(logior nr_ntreg ...)


Se obine rezultatul operaiei OR (SAU logic) asupra numerelor din list. Numerele
trebuie s fie ntregi, iar rezultatul este de asemenea ntreg.
(logior 1 2 4) ; se efectueaz SAU ntre 001B, 010B i 100B
7 ; se obine 111B
(logior 9 3)
11

(lsh numr1 numr2)


Dintre argumentele funciei, "numr2" reprezint un numr de bii, iar "numr1" un
numr ntreg. Operaia efectuat este o deplasare la stnga sau la dreapta cu "numr2" bii.
Dac "numr2" este pozitiv, "numr1" se deplaseaz spre stnga; dac "numr2" este negativ,
deplasarea se face spre dreapta.
(lsh 2 1)
4
(lsh 2 -1)

1 ; s-a deplasat 010B spre dreapta cu 1 bit i s-a obinut 001B


(lsh 40 2)

15

160

(max numr1 numr2 ...)


Se obine cel mai mare numr din list.
(max 4.07 -144)
4.07
(max -88 19 5 2)
19
(max 2.1 4 8)
8.0

Dac cel puin un numr din list este real, se obine un numr real, indiferent dac
maximul este real sau ntreg.
(min numr1 numr2 ...)
Se obine cel mai mic numr din list. Ca la max, dac cel puin unul din numere este
real, se obine real indiferent de tipul celui mai mic numr.
(min 683 -10.0)
-10.0
(min 73 2 48 5)
2
(min 2 4 6.7)
2.0

(minusp nume)
Dac "nume" este un numr negativ real sau ntreg se obine T; altfel se obine nil.
(minusp -1)
T
(minusp -4.293)
T
(minusp 830.2)
nil

pi
pi este o constant (3.14...), nu o funcie.
(rem numr1 numr2 ...)
Se mparte "numr1" la "numr2" i se ntoarce restul (numr1 mod numr2).
Rezultatul se mparte la al treilea numr .a.m.d.
(rem 42 12)
6
(rem 12.0 16)
12.0
(rem 6 3)
0

(sin unghi)
16

Se obine sinusul argumentului ("unghi") dat n radiani.


(sin 1.0)
0.841471
(sin 0.0)
0.0

(sqrt numr)
Se obine rdcina ptrat a argumentului. Tipul rezultatului este real.
(sqrt 4)
2.0
(sqrt 2.0)
1.41421

(zerop nume)
Aceast funcie ntoarce T dac "nume" este un numr ntreg sau real egal cu 0 (zero) i
nil altfel.
(zerop 0)
T
(zerop 0.0)
T
(zerop 0.0001)
nil

1.9 Funcii pentru controlul programului


Funciile urmtoare sunt funcii de test, operaii logice sau ciclare.
(= atom atom ...)
Aceast funcie verific egalitatea a doi sau mai muli atomi; ntoarce T dac sunt egali
i nil altfel. Atomii pot fi numere sau iruri.
(= 1 1.0) ntoarce T
(= 1 2) ntoarce nil
(= 1 1 1) ntoarce T
(= "hopa" "hopa") ntoarce T
(= "hopa" "opa") ntoarce nil
(/= atom atom ...)
Aceast funcie verific inegalitatea a doi sau mai muli atomi; ntoarce T dac nu sunt
egali i nil dac sunt egali.
(/= 1 1.0) ntoarce nil
(/= 1 2) ntoarce T
(/= 1 1 1) ntoarce nil
(/= "hopa" "hopa") ntoarce nil
(/= "hopa" "opa") ntoarce T
17

(< atom atom ...)


Aceasta este funcia relaional "mai mic dect". Dac primul atom este mai mic dect
al doilea, ntoarce T; altfel ntoarce nil. Cnd exist mai mult de dou argumente, se verific
dac primul este mai mic dect al doilea, acesta dect al treilea .a.m.d. ntoarce T dac
fiecare atom este mai mic dect cel din dreapta lui.
(< 1 2) ntoarce T
(< "a" "b") ntoarce T
(< 1 2 3) ntoarce T
(< 1 3 2) ntoarce nil
(< 1 1) ntoarce nil
(> atom atom ...)
Aceasta este funcia relaional "mai mare dect". Dac primul atom este mai mare
dect al doilea, ntoarce T; altfel ntoarce nil. Cnd exist mai mult de dou argumente, se
verific dac primul este mai mare dect al doilea, acesta dect al treilea .a.m.d. ntoarce T
dac fiecare atom este mai mare dect cel din dreapta lui.
(> 2 1) ntoarce T
(> "b" "a") ntoarce T
(> 3 2 1) ntoarce T
(> 1 3 2) ntoarce nil
(> 1 1) ntoarce nil
(<= atom atom ...)
Aceasta este funcia relaional "mai mic sau egal". Dac primul atom este mai mic
dect al doilea sau egal cu el, ntoarce T; altfel ntoarce nil. Cnd exist mai mult de dou
argumente, se verific dac primul este mai mic dect al doilea sau egal cu el, acesta dect al
treilea .a.m.d. ntoarce T dac fiecare atom este mai mic sau egal cu cel din dreapta lui.
(<= 1 2) ntoarce T
(<= "a" "b") ntoarce T
(<= 1 2 3) ntoarce T
(<= 1 3 2) ntoarce nil
(<= 1 1) ntoarce T
(>= atom atom ...)
Aceasta este funcia relaional "mai mare sau egal". Dac primul atom este mai mare
dect al doilea sau egal cu el, ntoarce T; altfel ntoarce nil. Cnd exist mai mult de dou
argumente, se verific dac primul este mai mare sau egal cu al doilea, acesta cu al treilea
.a.m.d. ntoarce T dac fiecare atom este mai mare sau egal cu cel din dreapta lui.
(=> 2 1) ntoarce T
(=> "b" "a") ntoarce T
(=> 3 2 1) ntoarce T
(=> 1 3 2) ntoarce nil
18

(=> 1 1) ntoarce T
(and expr ...)
Aceast funcie ntoarce rezultatul operaiei AND (I logic) efectuate ntre expresiile
date ca argumente. Dac cel puin una este nil, rezultatul este nil; altfel rezultatul este T.
(setq a 1 b nil c "OK")

(and 1 a c) ntoarce T
(and a b c) ntoarce nil
(cond (test1 rez1 ...) ...)
Cond este funcia condiional principal din LISP. Ea accept orice numr de liste ca
argumente. Evalueaz primul articol din fiecare list, pn cnd unul din ele returneaz alt
valoare dect nil. Atunci evalueaz expresiile care urmeaz dup testul trecut i ntoarce
valoarea ultimei expresii din sublist. Dac exist numai o expresie n sublist (lipsete
argumentul rez), funcia va ntoarce valoarea expresiei test.
Este deci o funcie de tip case, adic o succesiune de if-uri.
(cond ((= s "Y") 1)
((= s "N") 0)
(t nil)
)

n exemplu s-a testat rspunsul utilizatorului la o cerere oarecare; dac rspunsul este
"Y", rezultatul este 1, dac rspunsul este "N", rezultatul este 0, altfel rezultatul este nil.
S-ar fi putut scrie funcia astfel:
(if (= s "Y") (quote 1)
if (= s "N") (quote 0)
))

(eq expr1 expr2)


Aceast funcie determin dac expresiile date ca argumente sunt identice; ntoarce T
dac sunt identice i nil dac nu sunt identice. Expresiile nu sunt evaluate nainte de
comparare. Se folosete de obicei pentru a verifica identitatea a dou liste, ca n exemplul de
mai jos:
setq f1 '(1 2 3))
setq f2 '(1 2 3))
setq f3 f1)
eq f1 f2)

nil ; f1 i f2 nu reprezint aceeai list (nu sunt liste identice)


eq f1 f3)

T ; f1 i f3 sunt dou liste identice


(equal expr1 expr2 [z])
Aceast funcie verific dac cele dou expresii sunt egale; pentru aceasta ele sunt mai
nti evaluate i apoi comparate. Pentru listele definite n exemplul de la eq, avem:
(equal f1 f2)

T ; rezultatul evalurii oricreia din listele f1, f2 sau f3


(equal f1 f3) ; este acelai
19

Argumentul opional [z] indic pn la a cta zecimal vor fi comparate dou numere
reale.
(setq a 1.123456)
(setq b 1.123457)
(equal a b)
nil
(equal a b 0.00001)
T

(if test expr1 [expr2])


Aceast funcie condiioneaz evaluarea unei expresii; este funcia "if" obinuit din
majoritatea limbajelor de programare, cu forma general:
dac

condiie atunci expresie1


altfel expresie2

n LISP cuvintele cheie atunci i altfel sunt nlocuite cu paranteze (pot s lipseasc dac
n locul expresiei se folosesc atomi simbolici), astfel nct forma general de apelare a funciei
if este:
(if (condiie) (expresie1)
(expresie2))

Exemple:
(if (=
(if (=
(if (=
(if (=

1
1
2
2

3)
3)
(+
(+

"Y" "N")
;ntoarce "N"
(print "Y") (print "N")) ;va afia "N" i ntoarce "N"
1 1)) "Y")
;ntoarce "Y"
1 2)) "Y")
;ntoarce nil

(or expr ...)


Aceast funcie ntoarce rezultatul operaiei logice SAU, aplicat unei liste de expresii.
Expresiile sunt evaluate de la stnga spre dreapta, cutndu-se o expresie care s fie evaluat
altfel dect nil; dac este gsit, se ntoarce T; dac nu este gsit, se ntoarce nil.
(or nil 1 '()) ;ntoarce T (1 este diferit de nil)
(or nil '())
;ntoarce nil
(repeat numr expr ...)
Aceasta este o funcie de tipul
repet de n ori
expresia,

deci nu seamn cu funciile repeat din alte limbaje (Pascal, C, etc.: repet expresie
pn cnd condiie).
Argumentul "numr" este de tip ntreg.
(setq a 10)
(repeat 4
(setq a (+ a 10))

)
20

; atribuie variabilei a valoarea 50 i ntoarce 50.

(while test expr ...)


Aceast funcie evalueaz expresia "test" i dac rezultatul nu este nil evalueaz i
expresiile urmtoare, apoi evalueaz din nou expresia "test" .a.m.d. Forma general a acestei
funcii este, ca i n alte limbaje, urmtoarea:
ct timp condiie expresii ...

Exemple:
(setq test 1)
(while (<= test 10)
(setq test (1+ test))
)

Pentru parcurgerea ntregii baze de date a AutoCAD-ului, ntr-o sesiune de lucru:


(setq e (entnext))
; e este prima entitate creat
(while (/= e nil)
........

(setq e (entnext e))

; e este entitatea urmtoare

1.10

Manipularea listelor

(append expr)
Funcia append preia un anumit numr de liste, date ca argumente, i ntoarce o list
alctuit prin concatenarea acestora.
(append '(a b) '(c d))
;ntoarce (A B C D)
(setq L '(a b))
(setq L2 c)

(append L L2)
; greit
(append L (list L2))
; ntoarce (A B C)
Argumentele trebuie s fie neaprat liste.
(assoc articol list)
Aceast funcie caut o intrare ntr-o list, adic o sublist cu constructorul "articol". De
exemplu, n lista de date a unei entiti, codul 0 este constructorul sublistei care conine tipul
entitii; funcia va fi apelat astfel:
(assoc '0 list_ent) i va ntoarce lista (0 . "LINE") (am presupus c
list_ent este lista unei linii).
Dac "articol" nu identific o intrare n "list", se ntoarce nil.
Exemplu: avem lista L:
((name box) (width 3) (size 4.7) (depth 5))

(assoc 'size L)
; ntoarce (SIZE 4.7)
(assoc 'weight L)
; ntoarce nil
Structurile de tip array i record (sau struct) din alte limbaje de programare pot fi
nlocuite n LISP prin liste alctuite din subliste, identificate prin nth (tip array) sau assoc (tip
record).
21

(car list)
Cu funcia car se obine primul element dintr-o list. Dac lista e goal, se obine nil.
(car '(a b c))
A
(car '((a b) c))
(A B)
(car '())
nil

(cdr list)
Cu aceast funcie se obine o list alctuit din toate elementele argumentului "list",
n afar de primul. Deci, o list se mparte n (car list) i (cdr list). Dac lista e goal, cdr
ntoarce nil.
(cdr '(a b c))
(B C)
(cdr '((a b) c))
(C)
(cdr '())
nil

Funcia ntoarce o list dac argumentul "list" este o list obinuit, chiar dac este
alctuit numai din doi atomi, i ntoarce al doilea element (neinclus ntr-o list) n cazul
perechilor cu punct.
(cdr '(a . b))
B
(cdr '(1 . "Text"))
"Text"

(caar list), (cadr list), (cddr list), (cadar list), etc.


Se pot folosi combinaii de car i cdr, pn la patru niveluri de adncime.
Se pot utiliza aceste funcii pentru citirea coordonatelor punctelor 2D / 3D.
(setq p2 '(5.0 1.0))
;punct 2D
(setq p3 '(5.0 1.0 2.0)) ;punct 3D
(car p2)

5.0

;coordonata X a punctului p2

(cadr p2)

1.0

;coordonata Y a punctului p2

(caddr p2)

nil

;nu exist coordonata Z

(car p3)

5.0

;coordonata X a punctului p3

(cadr p3)

1.0
(caddr p3)

22

;coordonata Y a punctului p3

2.0

;coordonata Z a punctului p3

(cons elem1 list)


Aceast funcie este un constructor de liste. Argumentul "elem1" este primul element al
listei construite, iar argumentul "list" este restul listei. Cu alte cuvinte, "elem1" este un
element (atom sau list) care se adaug la nceputul unei liste, obinndu-se o nou list. Dac
ambele argumente sunt atomi, se obine o pereche cu punct.
(cons 'a '(b c d))
(A B C D)
(cons '(a) '(b c d))
((A) B C D)
(cons 'a 2)
(A . 2)

Not: Perechea cu punct este un tip special de list, care nu este acceptat ca argument
al oricrei funcii care lucreaz cu liste. Funciile car, cdr i combinaiile acestora accept ca
argumente perechi cu punct.
(foreach nume list expr...)
Aceast funcie este similar instruciunilor de tip for din alte limbaje de programare.
Argumentul "expr" este o expresie care accept ca parametru valoarea dat de argumentul
"nume". Argumentul "list" este o list de elemente de acelai tip cu "nume". Funcia foreach
va parcurge lista "list", asignnd, pe rnd, fiecare element argumentului "nume".
(foreach n '(a b c) (print n))

este echivalent cu:


(print a)
(print b)
(print c)

i ntoarce C (rezultatul evalurii ultimei expresii).


Se accept oricte expresii n argumentul "expr".
(last list)
Aceast list ntoarce ultimul element dintr-o list. Lista nu trebuie s fie vid.
(last '(a b c))
C
(last '(a (b c)))
(B C)

(length list)
Aceast funcie ntoarce un numr ntreg, care reprezint lungimea listei date ca
argument.
(length '(a b c))
3
(length '(a (b c)))
2
(length '())
0

23

(list expr...)
Aceast funcie preia orice numr de expresii date ca argumente, alctuind din ele o
nou list.
(list 'a 'b 'c)
(A B C)
(list 'a '(b c) 'd)
(A (B C) D)
(list 3 6)
(3 6)

(listp articol)
Aceast funcie ntoarce T dac argumentul "articol" este o list i nil dac nu este list.
(listp '(a b c))
T
(listp 'a)

nil

; a este un atom, nu o list

(listp nil)

; nil este n acelai timp un atom i o list

(mapcar funcie list1 ... listn)


Funcia mapcar ntoarce o list ca rezultat al execuiei funciei "funcie" cu argumentele
"list1" ... "listn". Numrul de liste trebuie s fie egal cu numrul de argumente acceptat de
"funcie".
(setq a 10 b 20 c 30)
(mapcar '1+ (list a b c))

ntoarce (11 21 31)


i este echivalent cu
(1+ a)
(1+ b)
(1+ c)
(mapcar '+ '(10 20 30) '(4 3 2))

ntoarce (14 23 32)


i este echivalent cu
(+ 10 4)
(+ 20 3)
(+ 30 2)

Funcia lambda poate defini o funcie anonim care s fie folosit ca argument pentru
mapcar:
(mapcar (lambda (x)
(+ x 2)
)
'(10 20 30)
)

ntoarce (12 22 32)


(mapcar (lambda (x y z)
(* x (- y z))
)

24

'(5 6) '(20 30) '(14 5.0)


)

ntoarce (30 150.0)


adic ((* 5 (- 20 14)) (* 6 (- 30 5.0)))
(member expr list)
Aceast funcie caut secvena "expr" ntr-o list i ntoarce partea neexplorat din list,
ncepnd cu elementul gsit. Dac nu este gsit nici un element identic cu "expr", se ntoarce
nil.
(member 'c '(a b c d e)) ntoarce (C D E)
(member 'q '(a b c d e)) ntoarce nil
(nth n list)
Aceast funcie ntoarce elementul cu numrul "n" din "list", unde "n" este un numr
ntreg, iar "list" este o list. Dac n este mai mare dect lungimea listei, se ntoarce nil.
(nth 3 '(a b c d e))
ntoarce D
(nth 0 '(a b c d e))
ntoarce A
(nth 5 '(a b c d e))
ntoarce nil
(reverse list)
Aceast funcie returneaz lista dat ca argument cu elementele aezate n ordine
invers.
(reverse '((a) b c)) ntoarce (C B (A))

(subst elem_nou elem_vechi list)


Aceast funcie caut elementul "elem_vechi" n list, l nlocuiete cu "elem_nou" i
returneaz noua list. Dac exist mai multe elemente identice cu "elem_vechi" n list, toate
sunt nlocuite cu "elem_nou". Dac "elem_vechi" nu este ntlnit, lista este returnat
nemodificat.
(setq L '(a b (c d) b))

(subst 'qq 'b L)


; ntoarce (A QQ (C D) QQ)
(subst '(qq rr) '(c d) L) ; ntoarce (A B (QQ RR) B)
(setq L '((a b) (c d) (e f)))

(setq vechi (assoc 'a L)) ; ntoarce (A B)


(setq nou '(a g))
; ntoarce (A G)
(subst nou vechi L)
; ntoarce ((A G) (C D) (E F))

1.11

Manipularea fiierelor

(close fis)
Aceast funcie nchide un fiier deschis anterior (cu open) i ntoarce nil. Argumentul
"fis" este un descriptor de fiier, obinut la apelarea funciei open.
(close x) ;nchide fiierul al crui descriptor este x i ntoarce nil
25

(load numefis [onfailure])


Aceast funcie ncarc un fiier alctuit din expresii LISP, pe care le evalueaz.
Argumentul "numefis" reprezint numele fiierului, care trebuie s aib neaprat extensia
".lsp" (nu trebuie s fie dat explicit). Numele fiierului poate s fie precedat de numele
directorului, desprit fiind de acesta de dou backslash-uri sau un slash, adic:
"\\DIR1\\DIR2\\FIS" sau "/DIR1/DIR2/FIS".
Dac irul "numefis" nu conine calea (path), funcia load cerceteaz calea de bibliotec
a AutoCAD-ului, asemntor cu funcia findfile. Dac fiierul este gsit, este ncrcat i se
ntoarce valoarea ultimei expresii evaluate.
Dac exist argumentul [onfailure] ("la eroare") i nu este nil, atunci se va ntoarce, n
locul mesajului obinuit de eroare, rezultatul evalurii acestui argument.
(defun F1 (x)
.............
)
(defun F2 (x)
............

)
;acesta este coninutul fiierelor
- dac F2.lsp nu exist, se obine:
(load "F1")
; ntoarce F1
(load "F2")
; ntoarce un mesaj de eroare AutoLISP
(load "F2" "eroare") ; ntoarce "eroare"
Funcia load poate fi apelat dintr-o alt funcie LISP, sau chiar recursiv, adic din
fiierul care tocmai se ncarc.
(open numefis mod)
Funcia open deschide un fiier, al crui nume este specificat prin argumentul
"numefis", pentru acces prin funciile de intrare/ieire ale LISP-ului. Se obine un descriptor
de fiier care poate fi folosit de alte funcii de intrare/ ieire; de aceea, trebuie s fie atribuit
printr-o funcie setq unui simbol, astfel:
(setq f (open "file.ext" "r"))

n acest exemplu, simbolul f a primit valoarea descriptorului fiierului "file.ext", care a


fost deschis pentru citire. Descriptorul de fiier are forma "#nnnn", unde "nnnn" este un
numr hexazecimal generat intern de LISP; programatorul lucreaz numai cu simbolul f.
Argumentul "mod" indic modul de acces la fiier, astfel:
- "r" deschidere pentru citire; dac fiierul nu exist, se returneaz nil;
- "w" deschidere pentru scriere; dac fiierul nu exist, este creat un nou fiier; dac
fiierul exist, datele din el vor fi nlocuite cu cele noi;
- "a" deschidere pentru adugare (append); dac fiierul nu exist, este creat unul
nou; dac exist, datele noi sunt adugate la cele existente.
Fiierele deschise de open sunt de tip text. Argumentul "numefis" poate s conin i
calea de cutare (path).
(setq f (open "/cale/file.ext" "w"))

ntoarce <File: #6C357408> (adic un descriptor de fiier)


(setq (open "/cale/fisnou.ext" "r"))

ntoarce nil (am presupus c nu exist "fisnou.ext")

26