Maple dispune de un numar impresionant de functii (cteva mii, n continua
crestere cu ecare noua versiune), dar la nceperea sesiunii doar un numar mic dintre acestea sunt prezente n memorie, restul ramn n biblioteca sistem aata pe disc. Maple dispune de un mecanism simplu prin care denitia unei proceduri (de fapt denitia oricarei variabile) devine accesibila functiilor aate deja n memorie precum si utilizatorului, prin aducerea acesteia n memorie. Instructiunea Maple care realizeaza acest lucru este read. Multe functii sistem apeleaza ele nsele aceasta instructiune pentru ncarcarea altor denitii de care au nevoie. Instructiunea save permite utilizatorului sa creeze propriile siere cu denitii. Instructiunea read foloseste att ncarcarii denitiilor aate n biblioteci (n particular n biblioteca sistem), ct si a celor aate n siere individuale; pentru ncarcarea din biblioteci este nsa de preferat utilizarea mecanismului de citire automata descris n continuare. Motivul pentru care Maple utilizeaza biblioteci n locul unor siere individuale este datorat, pe de o parte, faptului ca n felul acesta spatiul ocupat pe disc este mult redus, iar pe de alta parte multe sisteme de operare nu accepta nume de siere de forma celor continute n biblioteci (ca de exemplu eval/piecewise.m), sau nu disting caracterele majuscule de cele minuscule. O biblioteca Maple (sub Windows) consta din doua siere denumite nume.lib si nume.ind. Primul sier contine informatia propriu zisa (cu siere .m arhivate), iar cel de-al doilea contine un sistem de indexare pentru rapiditatea accesului; n plus, majoritatea bibliotecilor sunt nsotite de un sier nume.hdb continnd subiectele de help organizate ntr-o baza de date. ntr-un director pot exista mai multe biblioteci Maple (In versiunile mai vechi, ntr-un director putea ex- ista o singura biblioteca si numele acesteia trebuia sa e maple).. ntretinerea unei biblioteci (creare, actualizare etc) se face cu comanda march (n versiu- nile mai vechi, era utilizat un program extern march.exe n acest scop); nu se recomanda utilizarea acesteia asupra bibliotecii sistem, ci doar asupra bibliotecilor create de utilizator. Informatii privind utilizarea comenzii march se obtin cu ?march; aici mentionam doar ca, pentru crearea unei biblioteci se foloseste comanda march(create,nume, dimensiune) , unde nume este numele complet al bibliotecii (inclusiv calea dar fara extensia .lib; directorul trebuie sa existe n momentul apelului; nume poate nsa numele unui director existent, n acest caz numele bibliotecii ind implicit maple), iar dimensiune este numarul (aproximativ) de functii pe care le va contine biblioteca (cu pre- cizarea ca un sier .m poate contine mai multe proceduri Maple, iar n cazul unui modul trebuie numarate toate elementele exportate de acesta). Nota: Exista o interfata graca (maplet) pentru comanda march ce poate lansata cu comanda LibraryTools[Browse](). Parametrii bibliotecilor pot astfel inspectati si modicati pe cale vizuala. Variabila globala libname contine secventa tuturor numelor bibliotecilor Maple (sub forma de string sau symbol) cunoscute sistemului (o biblioteca Maple al carei nume nu gureaza n libname nu va n general accesata); n libname n locul unui nume de biblioteca (sier cu extensia .lib) poate sa apara numele unui director, situatie n care sunt avute n vedere toate bibliotecile existente n acest director. De exemplu, > libname; c:/mymaple/mylib1, "C:\\Program Files\\Maple 8/update", "C:\\Program Files\\Maple 8/lib", C:\\MVx/share Se observa ca n acest exemplu apar numai nume de directoare: primul contine o biblioteca personala, al doilea o biblioteca update continnd corectii furnizate de producator pentru biblioteca sistem, al treilea contine bibliotecile sistem, iar ultimul director contine biblioteca share continnd contributii ale utilizato- rilor; de notat ca este acceptat ca separator de directoare att \ (care trebuie nsa dublat datorita interpretarii acestui caracter de catre Maple), ct si / (ca n Unix). Revenim acum asupra instructiunilor read si save preciznd modul n care sunt accesate bibliotecile. Instructiunea read nume sier are urmatorul efect: Se evalueaza nume sier, rezultatul trebuind sa e de tip string sau symbol, reprezentnd un nume de sier; Daca nume sier are extensie diferita de .m, atunci este considerat a numele unui sier de format text care este ncarcat si executat, ca si cnd ecare linie a sa ar introdusa de la tastatura (si terminata cu Enter). Ecoul liniilor citite este conform variabilei de interfata echo, iar daca sierul contine erori, reactia sistemului este conforma variabilei de interfata errorbreak. Daca nume sier are extensie .m, atunci este considerat a numele unui sier de format binar (intern Maple). Daca sierul cu numele respectiv este gasit, el este ncarcat si toate denitiile pe care le contine devin ac- cesibile; nu se produce nici un fel de ecou. Daca sierul individual nu este gasit, numele acestuia este cautat n acele biblioteci Maple care gureaza n variabila globala libname, daca directorul bibliotecii poate interpre- tat ca ind cale (path) pentru numesier. n caz ca exista, este ncarcat sierul din prima biblioteca gasita, iar daca nu exista, este emis un mesaj de eroare. (Daca ntr-un director indicat de libname exista mai multe biblioteci Maple, cautarea se face n ordine descrescatoare a numarului de prior- itate asociat bibliotecilor prin comanda march, sau, n caz de egalitate, n ordine alfabetica.) De exemplu, daca libname contine "c:/lib","c:/lib/slib","c:/mv/lib" atunci la instructiunea > read "c:/lib/slib/test.m"; se va cauta n urmatoarea ordine: 1. sierul test.m din directorul c:/lib/slib 2. sierul slib/test.m din biblioteca aata n directorul c:/lib 3. sierul test.m din biblioteca aata n directorul c:/lib/slib Instructiunea save v1,v2,...,vn,nume sier are urmatorul efect: Sunt evaluati la un nume toti parametrii cu exceptia ultimului, care se evalueaza complet, rezultatul trebuind sa e de tip string sau symbol, reprezentnd un nume de sier; Daca nume sier are extensie diferita de .m, atunci este considerat a numele unui sier de format text n care sunt salvate denitiile variabilelor v1,v2,...,vn sub forma a n atribuiri (n 1): Daca nume sier are extensie .m, atunci este considerat a numele unui sier de format binar (intern Maple). Daca unul dintre numele de directoare aate n variabila globala libname coincide cu calea (path) a sierului nume sier, atunci denitiile variabilelor v1,v2,...,vn sunt memorate ntr-un sier care se depune n prima biblioteca Maple corespunzatoare gasita. n caz contrar, va creat un sier individual cu numele nume sier continnd denitiile variabilelor v1,v2,...,vn. (n variantele mai vechi de Maple, era acceptat si cazul n = 0; situatie n care erau salvate denitiile tuturor variabilelor asignate.) Nota: Datorita modului de cautare n biblioteci, se recomanda evitarea prezentei sierelor de extensie .m n directoare continnd biblioteci Maple. Nu se reco- manda utilizarea instructiunii read pentru citirea sierelor bibliotecilor, deoarece prin mecanismul de indexare, ncarcarea din bibliotecile ce gureaza n libname are loc automat. Salvarea variabilelor n biblioteci nu se face nsa n general cu instructiunea save, ci cu comanda savelib(v1,v2,...,vn) : sunt evaluati la un nume toti parametrii, dupa care are loc salvarea acestora n prima biblioteca gasita n secventa aata n variabila globala savelibname; daca aceasta variabila glob- ala nu este asignata sau nu contine nume de directoare valide cu biblioteci Maple, sunt considerate bibliotecile aate n variabila globala libname; daca nici aceasta nu contine biblioteci valide, apare o eroare. Se recomanda utilizarea variabilei savelibname care sa contina numele unei singure biblioteci, pentru a avea un control precis asupra salvarii. Functiile (procedurile) de care dispune Maple pot clasicate n 3 categorii: 1. Functii din nucleu. Aceste functii se aa permanent n memorie si sunt foarte eciente. Numarul acestora este relativ mic (mult sub o zecime din numarul total), printre acestea amintim: ERROR, map, seq, substring, iquo, max, min, coeff, degree, sort, diff, expand, eval, evalf, evalhf, evaln, frontend, convert, op, subs, table, alias. Aceste proceduri au optiunea builtin si nu pot listate (neind scrise n limbajul Maple), dar n general nici nu este nevoie, ntruct nu incumba algoritmi matematici, si sunt oricum putine + . 2. Functii uzuale. Acestea nu sunt ncarcate n memorie la nceputul sesiunii, dupa cum s-a precizat mai sus. Din punct de vedere al utilizatorului, nu exista nici o deosebire ntre aceste functii si cele din nucleu. Maple dispune de un mecanism performant de ncarcare a functiilor din biblioteci: pentru orice nume neasignat n momentul apelului, este consultat indexul bibliotecilor pentru a preluata denitia sa (daca exista) | . Fiind vorba de + Secventa acestora poate obtinuta prin comanda anames(builtin); | Anterior versiunii Maple 6, nu toate functiile bibliotecii puteau obtinute att de transparent. O parte a acestora (mai rar folosite) trebuiau ncarcate explicit de utilizator printr-o comanda readlib (devenita actualmente inutila). De exemplu pentru a putea utilizata functia log10, trebuia utilizat apelul readlib(log10). Daca o astfel de functie era apelata nainte de readlib, rezulta un obiect de tip function; de exemplu log10(100) ramnea sub aceeasi forma si dupa simplicare, dar n urma utilizarii readlib se simplica la 2: functii aate n biblioteci, ele sunt scrise n limbajul Maple si utilizatorul are posibilitatea sa le examineze. Pentru aceasta, este sucient sa se execute comanda interface(verboseproc=2) si sa se evalueze (sau aseze cu print) functia n cauza. O astfel de examinare a functiilor din biblioteca Maple poate utila pentru utilizatorul care doreste sa vada modul de implementare a unor algoritmi matematici, putndu-se astfel perfectiona n programarea propriilor algoritmi. Maple este probabil singurul program (comercial) de calcul simbolic care permite asa ceva. Mai exista nca un motiv pentru care examinarea codului Maple este utila, si anume n cazurile de functionare defectuoasa; programe de aceasta anvergura nu pot lipsite de erori. 3. Functii aate n pachete. Unele functii Maple care trateaza o prob- lema particulara sunt grupate ntr-un pachet. De exemplu n pachetul orthopoly sunt grupate 6 functii destinate calculului unor tipuri de poli- noame ortogonale, numele acestora ind G, H, L, P, T si U. Pentru a putea utiliza functiile unui pachet exista variantele: 1. Se utilizeaza comanda with(numepachet) ; este ntoarsa o lista cu numele tuturor functiilor aate n pachet, si toate devin accesibile. De exemplu, cu with(orthopoly) se obtine lista [G; H; L; P; T; U], iar n continuare H(3,x) va avea ca rezultat polinomul Hermite de grad 3 n x. 2. Cu comanda with(numepachet,f1,f2,...,fn) sunt ncarcate numai functiile f1,f2,...,fn din pachet (daca nu toate gureaza n pachet, este emis un mesaj de eroare) si este ntoarsa lista [f1,f2,...,fn]. De exemplu, cu with(orthopoly,T,H); numai functiile T si H devin accesibile. 3. Orice functie f a unui pachet numepachet poate accesata utiliznd numele sau lung si anume numepachet[f ]. De exemplu, orthopoly[H](3,x) furnizeaza polinomul Hermite, chiar daca nici o functie din pachet nu este ncarcata. Multe dintre procedurile bibliotecii, care nu sunt destinate folosirii directe de catre utilizatori, au nume de genul f/f1/f2. Astfel, de exemplu, procedura simplify (destinata simplicarii expresiilor), apeleaza procedura simplify/exp atunci cnd urmeaza sa simplice un apel al functiei exponentiale exp. n felul acesta, integrarea n Maple a unor noi functionalitati este extrem de simpla. Daca utilizatorul doreste ca functia myfunc pe care a denit-o sa e prelucrata de simplify, va sucient sa scrie si o procedura nu- mita simplify/myfunc; se poate inspira n acest scop din procedurile simplify/xxx existente. Exemple de proceduri ce pot extinse n acest mod sunt: abs, convert, diff, evalf, expand, print, series, signum, type, value. Pentru a le descoperi singuri, puteti examina numele procedurilor aate n memorie (cu anames()), sau puteti inspecta direct biblioteca Maple cu comanda bib- liotecar march. Maple este deci un sistem extensibil (Pentru amanunte si modalitati mai recente de extindere a sistemului Maple, vezi ?extension). Nota: Informatiile despre o functie f sunt deci localizate n sistem n mai multe locuri; n afara de procedura f propriu-zisa, mai pot exista procedurile simplify/f, expand/f etc. n plus, informatiile referitoare la inversa functiei f sunt localizate n tabela invfunc, care pentru indicele f contine functia inversa (de exemplu, invfunc[sin]=arcsin, invfunc[arcsin]=sin). Exista nca o tabela cu numele Invfunc, continnd inverse multivoce pentru functii neinversabile; de exemplu, Invfunc[sin](x) se simplica la (1-2*_B1~)*arcsin(x)+Pi*(2*_Z1~+_B1~), variabilele _B1~, _Z1~ ind cu valori binare, respectiv ntregi (asa cum apar n cadrul comenzii solve, care de altfel utilizeaza tocmai aceasta tabela). Un utilizator poate completa sau modica aceste tabele n mod uzual (ind obiecte de tip table). Daca dorim ca o noua functie sa se integreze armonios n sistem, va trebui sa scriem toate aceste proceduri si intrari de tabele. Procedurile bibliotecii Maple pot chiar modicate de catre un utilizator cu experienta. Este nsa recomandabil ca salvarea functiei modicate sa nu e facuta n biblioteca Maple initiala (pentru ca o eventuala eroare sa nu mpiedice functionarea programului si pentru a nu aparea diferente la rularea pe un alt sistem Maple), ci ntr-o biblioteca proprie. Daca numele directorului n care se aa biblioteca proprie va precede n variabila libname numele directorului bibliotecii Maple, functia modicata va preluata din biblioteca proprie. Pachete, construirea unui pachet Maple Implementarea pachetelor n Maple este realizata prin doua metode. Prima metoda este bazata pe tabele (tipul table): numele tabelei co- incide cu numele pachetului, iar indicii tabelei sunt numele procedurilor pachetului. A doua metoda (mai recent introdusa) este bazata pe module; n acest caz, numele modulului coincide cu numele pachetului, iar procedurile pachetului sunt cele exportate de modul. Indiferent de modul de implementare, apelul procedurii f din pachetul P se poate face prin numele lung P[f ], n cazul implementarii prin module ind posibila si sintaxa P:-f; Dupa cum s-a precizat n sectiunea precedenta, comanda with permite uti- lizarea numelor scurte pentru procedurile pachetului (Sunt executate automat atribuiri de forma f:=P[f] ); pentru a efectiva, comanda with trebuie apelata de la nivelul liniei de comanda (top level). Lista pachetelor ncarcate (cu with) este furnizata de comanda packages() . La ncarcare completa a pachetului P cu comanda with(P), sunt apelate (daca exista) procedurile de initializare ale pachetului; n cazul modulelor, procedura (exportata) de initializare este P:-ModuleLoad, iar n cazul tabelelor proce- dura de initializare este P[init]. De notat faptul ca aceste proceduri de initializare nu mai sunt executate a doua oara, chiar daca este reexecutata co- manda with(P). Daca numele unei variabile globale g coincide cu un nume scurt generat de with la ncarcarea pachetului, este emis un mesaj de avertisment, dupa care vechea variabila g nu mai este accesibila (chiar daca era protejata) n cazul pachetelor implementate prin tabele; n cazul celor implementate prin module poate accesata prin apelativul :-g . Pentru dezinstalarea unui pachet instalat anterior cu with se poate folosi co- manda unwith(P) ; aceasta comanda nu functioneaza nsa dect n cazul pa- chetelor implementate prin module. Majoritatea pachetelor actuale au fost (re)implementate prin module astfel nct n versiunea 9.5 pachetele ramase tabelare sunt: algcurves, combstruct, DEtools, dialg, diorms, Domains, inttrans, liesymm, LRETools, Matlab, networks, PDEtools, plots, simplex, Slode, stats, student, tensor Pentru a testa daca pachetul P este implementat prin tabele sau prin module pot folosite apelurile type(P, module) si/sau type(P, table) . > type(linalg,module), type(plots,module), type(student,table); true, false, true Vom construi n continuare un pachet simplu destinat aritmeticii intervalelor. Pachetul va contine doar doua functii: suma si prod care vor implementa operatiile elementare de adunare si nmultire a intervalelor. Un interval (nchis) [a; b] R va reprezentat prin functia inerta INT(a,b). Suma a doua intervale [a; b] si [c; d] este prin denitie intervalul x +y : x [a; b]; y [c; d]; si similar pentru produs. Va implementat tipul Maple INT destinat recunoasterii intervalelor de forma INT(a,b). Vom construi doua variante ale pachetului pINT: prin tabele si prin module. Metoda recomandata de construire a pachetelor este cea pe baza de module, dar n biblioteca Maple exista nca pachete implementate prin tabele, astfel nct cunoasterea modului de realizare a acestora este utila. a) Implementare prin tabele > pINT:=table(); > pINT[init]:=proc() > global type/INT; > type/INT:=INT(realcons,realcons) > end; > pINT[suma]:=proc(u::INT,v::INT) > INT(op(1,u)+op(1,v),op(2,u)+op(2,v)) > end; > pINT[prod]:=proc(u::INT,v::INT) > local w; > w:=op(1,u)*op(1,v),op(1,u)*op(2,v),op(2,u)*op(1,v),op(2,u)*op(2,v); > INT(min(w),max(w)) > end; Vom testa acum procedurile pachetului astfel denite; > pINT[init](); #acum tipul INT este accesibil > with(pINT); [init, prod, suma] > suma(INT(2,3),INT(10,20)); INT(12; 23) > prod(INT(2,3),INT(-20,10)); INT(60; 30) Procedurile functioneaza corect. Vom crea o biblioteca si vom salva pachetul n aceasta. > march(create, "c:/mylib", 100); #directorul trebuie s a existe! > savelibname:="c:/mylib": > savelib(pINT); Pentru testarea nala, vom apela functiile direct din biblioteca, dupa reinitializarea nucleului Maple: > restart: > libname:="c:/mylib",libname; libname := "c:/mylib", "C:\\Program Files\\Maple 9.5/lib" > with(pINT); [init, prod, suma] > suma(INT(2,3),INT(10,20)); INT(12; 23) > prod(INT(-2,sqrt(3)),INT(10,20)); INT(40; 20 _ 3) Asadar, pachetul functioneaza corect. De remarcat faptul ca procedura init este apelata de sistem n momentul ncarcarii pachetului cu comanda with, ceea ce permite functionarea celorlalte proceduri din pachet care o utilizeaza. Pa- chetul are nsa o mica slabiciune: nu pot utilizate numele lungi (pINT[suma], pINT[prod]) fara a folosita comanda with. Acest lucru se ntmpla toc- mai datorita faptului ca tipul INT denit n procedura init este necunoscut sistemului nainte de with! Daca procedurile suma si prod nu ar recurs la testarea argumentelor, totul ar decurge normal! Se va vedea n continuare ca implementarea pachetelor bazata pe module nu pune astfel de probleme. b) Implementarea aceluiasi pachet utiliznd modulele decurge astfel: > pINT:=module() > description "Pachet pentru adunarea si inmultirea intervalelor"; > export suma,prod; > local setup; > option package, load = setup; > > setup :=proc() > global type/INT; > type/INT:=INT(realcons,realcons) > end; > > setup(); #se apeleaza acum! > > suma:=proc(u::INT,v::INT) > INT(op(1,u)+op(1,v),op(2,u)+op(2,v)) > end; > > prod:=proc(u::INT,v::INT) > local w; > w:=op(1,u)*op(1,v),op(1,u)*op(2,v),op(2,u)*op(1,v),op(2,u)*op(2,v); > INT(min(w),max(w)) > end; > > end module: Pentru testare, procedam similar: > with(pINT); [prod, suma] > suma(INT(2,3),INT(10,20)); INT(12; 23) > prod(INT(2,3),INT(-20,10)); INT(60; 30) > march( create, "c:/mylib", 100 ); Error, (in march) there is already an archive in "c:/mylib" La crearea bibliotecii va aparea un mesaj de eroare daca aceasta exista deja. Acest mesaj poate ignorat: n cazul nostru biblioteca a fost creata anterior si intentionam sa nlocuim vechiul pachet cu cel nou bazat pe module. > savelibname:="c:/mylib"; savelibname := "c:/mylib" > savelib(pINT); Testarea se face exact ca n cazul precedent. Acum vor putea utilizate si nume lungi nainte de with, ntruct la apelul primei functii din pachet este apelata procedura setup() care deneste tipul INT. > restart: > libname:="c:/mylib",libname; libname := "c:/mylib", "C:\\Program Files\\Maple 10/lib" > pINT[suma](INT(2,3),INT(20,30)); INT(22; 33) > with(pINT); [prod, suma] > prod(INT(-2,sqrt(3)),INT(10,20)); INT(40; 20 _ 3) > type(INT(0,Pi),INT); true Nota: Pentru examinarea continutului bibliotecii nou create putem utiliza co- manda march(list,"c:/mylib"); se va obtine o lista cu numele sierelor continute n biblioteca, data crearii, adresa si dimensiunea acestora: [[":-3.m", [2005, 9, 5, 22, 56, 34], 1415, 88], ["pINT.m", [2005, 9, 5, 22, 56, 34], 1024, 200], [":-1.m", [2005, 9, 5, 22, 56, 34], 1503, 139], [":-2.m", [2005, 9, 5, 22, 56, 34], 1224, 191]] Se observa ca pe lnga sierul "pINT.m" sunt prezente nca 3 siere cu nume numerice; acestea sunt create automat de Maple (n cazul modulelor) n vederea uniformizarii interne a prelucrarilor. Pentru a introduce o foaie de help (att n varianta table ct si n cea module) se poate proceda astfel: Se completeaza o foaie de calcul cu continutul dorit. n acest scop poate preluata cu copy&paste o foaie de help dintre cele existente si se modica, sau se tasteaza de la nivelul liniei de comanda ?examples/CommandTemplate obtinndu-se astfel un schelet care contine si cteva recomandari de completare. Dintre acestea, mentionam pastrarea paragrafelor: Calling Sequences, Parame- ters, Description, Examples, See Also. n nal este accesat meniul Help/Save to Database... si se completeaza rubricile Topic, Parent, Aliases iar n cmpul Database este trecut numele directorului sau al sierului ce va contine baza de date de help, n cazul nostru "c:/mylib" sau "c:/mylib/maple.hdb". Nota: Daca dorim ca functiile pachetului sa e accesibile chiar de la nceputul sesiunii Maple, fara a trebui sa ncepem prin a actualiza variabila libname, se poate introduce linia: libname:="c:/mylib",libname; n sierul "maple.ini" din unul din directoarele: directorul curent, "Maple 10/Users" sau "Maple 10/Users/numeutilizator" (n cazul configur arii Maple n modul multi-user). (acest sier va trebui creat daca nu exista; Maple va prelua primul sier gasit din directoarele mentionate). Daca numele bibliotecii ar fost ales diferit de maple (si de restul bibliotecilor sistemului), am putut pur si simplu plasa sierele .lib si .ind n directorul c:\Program Files\Maple 10\lib.