Pachetele sunt ceva care stabilesc legatura dintre simboluri si nume. In orice moment un singur pachet este curent, si e tinut in variabila *package*. Pachetele ajuta la separarea numelor, pentru a evita coliziunile si a permite folosirea aceluiasi nume de mai multe ori pentru a desemna obiecte diferite.
Pachetele sunt colectii de simboluri Lisp avand proprietatea ca au nume unice.
Simbolurile sunt un tip de data ca oricare altul, pot fi transmise ca parametri functiilor si pot fi returnate din functii.
Simbolurile au pachet-acasa si pot fi importate sau internate in pachete. Pot fi si deinternate, si pot fi si ascunse de altele.
Functia GENTEMP creeaza simboluri noi, pornind de la un string-radacina data de utilizator si atasand un numar. MAKE-SYMBOL la fel, dar foloseste numai string-ul dat de utilizator.
Simbolurile au o reprezentare textuala, dar aceasta nu contine toate informatiile despre simbol. Astfel se poate ajunge ca simboluri diferite sa aiba aceeasi reprezentare.
(eq (make-symbol "mama") (make-symbol "mama")) ==> nil
Desi arata la fel, sunt diferite.
Functia SET seteaza celula valoare a unui simbol la valoarea data de utilizator.
NU UITA CA SIMBOLURILE AU ATAT O CELULA VALOARE CAT SI O CELULA FUNCTIE! asta inseamna ca Common Lisp este Lisp-2, are doua namespace-uri separate, unul pentru functii si unul pentru valori.
READER-ul interneaza (le pune in pachetul curent) simbolurile pe care le citeste, dupa ce le modifica sa fie cu majuscule.
Un nume citit de la tastatura ar trebui sa indice tot timpul catre acelasi simbol.
(eq 'mama 'mama) ==> t
Simbolurile pot fi neinternate/deinternate, si atunci sunt afisate cu prefixul #:
De fapt prefixul #: inseamna ca simbolul respectiv nu are pachet-acasa, nu neaparat ca nu e internat intr-un pachet.
IMPORT: adauga un simbol la un pachet
UNINTERN: scoate un simbol dintr-un pachet
FIND-SYMBOL: primeste un string si iti spune daca exista acel simbol deja internat
SYMBOL-NAME: returneaza numele unui simbol ca string
INTERN: primeste un string si ori returneaza simbolul existent corespunzator acelui string, ori un simbol nou
Pachetele sunt si ele structuri de date obisnuite.
PACKAGE-NAME si FIND-PACKAGE corespund functiilor SYMBOL-NAME si FIND-SYMBOL
MAKE-PACKAGE: creeaza pachete noi, SLIME stie ce argumente sa-i dai un pic mai bine decat in cazul lui DEFPACKAGE
IN-PACKAGE: seteaza pachetul curent
Pachete-acasa: pentru a se pastra consistenta intre afisare si citire, Common Lisp califica simbolurile cu numele pachetelor lor. Consistenta asta inseamna ca daca printezi un simbol si apoi citesti reprezentarea printata ar trebui sa rezulte acelasi simbol, cu doua exceptii: 1) nu se aplica la simboluri neinternate si 2)se aplica doar daca nu faci niste anume chestii "periculoase".
(make-package :bob)
(in-package bob)
(defun foo () "Foo din Bob.")
(make-package :jane)
(in-package jane)
(defun foo () "Foo din Jane.")
(in-package bob)
(unintern 'foo)
(import 'jane::foo)
(make-package :charlie)
(in-package charlie)
'bob::foo ==> JANE::FOO
JANE e pachetul acasa a lui FOO
Pachetul acasa de obicei e primul pachet in care simbolul a fost internat. Cand este nevoie ca simbolul sa fie calificat cu numele pachetului, foloseste numele pachetului-acasa.
SYMBOL-PACKAGE: returneaza pachetul-acasa
Simbolurile neinternate nu au pachete-acasa. E posibil si sa ai simboluri internate dar fara pachete acasa: le creezi intr-un pachet, le importi in altul si apoi le deinternezi din pachetul initial.
Poti sa atasezi niste proprietati simbolului, in PLIST-ul asociat lui.
Niciun comentariu:
Trimiteți un comentariu
S-ar putea sa nu vedeti comentariul aparand imediat, asta inseamna ca el asteapta aprobarea mea. Aceasta e o masura anti-SPAM.