Cflp Laborator |
|
Facultatea de
Automatica si Calculatoare
Departamentul de Calculatoare |
Home | Lucrarea 1 | Lucrarea 2 | Lucrarea 3 | Lucrarea 4 | Lucrarea 5 | Proiect |
Lucrarea 6 | Lucrarea 7 | Lucrarea 8 | Lucrarea 9 | Lucrarea 10 |
Lucrarea 8 | |||
Subiecte |
La definirea unei funcţii putem specifica faptul că un parametru este opţional:
(defun putere (x &optional y) (cond ((not y) x) ; y = 1 (t (expt x y))))
Funcţia de mai sus dacă primeşte un singur argument, consideră că cel de al doilea este 1. Putere da şi o valoare implicită parametrului opţional:
(defun putere (x &optional (y 1)) (expt x y))
Pot exista oricâţi parametri opţionali. Poate exista şi un singur parametru semnalat de &rest, a cărui valoare devine o listă cu toate argumentele în plus faţă de cele specificate la definirea funcţiei.
|
||
(defun my-or (&rest r) (cond ((null r) nil) ((car r)) (t (apply 'my-or (cdr r))))) |
|||
Macrourile sunt definite ca şi funcţiile dar ele nu îşi evaluează niciodată argumentele. Urmăriţi cu atenţie exemplul următor:
|
|||
(defmacro demo (par) (print par)) (setq this 'value-of-this) (demo this) this value-of-this |
|||
La apelul macroului nu se încearcă evaluarea lui this, deci chiar this devine valoarea lui par şi se afişează this. La returnare însă this se evaluează. În exeplul următor se implementează un macro our-if.
|
|||
(defmacro our-if (test success failure) (subst test ţest (subst success şuccess (subst failure 'failure '(cond (test success) (t failure)))))) |
|||
Parametrul failure poate fi declarat opţional.
Mecanismul backquote permite uşor generarea de expresii a căror mare parte este fixată şi doar câteva variabile trebuie înlocuite. Caracterul backquote ` acţionează asemănător cu quote ' cu observaţia că orice virgule ce apar în interior au efect de "unquoting" pentru expresia următoare.
|
|||
(setq variable 'example) example `(this is an ,variable) (this is an example) |
|||
Folosind mecanismul backquote our-if devine: (defmacro our-if (test success &optional failure) `(cond (,test ,success) (t ,failure)))
Probleme
1. Definiţi un macro define care defineşte o funcţie dar având sintaxa: (define (<nume functie> <param 1> ... <param n>) <corp>)
2. Definiţi un macro dotimes cu sintaxa: (dotimes (<var> <count> <rezultat>) <corp>) Prima dată se evaluează <count> care trebuie să dea un întreg. Apoi <var> este succesiv legată la întregi de la 0 la valoarea lui <count> minus 1. Corpul este evaluat de fiecare dată iar <rezultat> este returnat la sfârşit.
Obs. căutaţi o formă folosind do care este echivalentă şi apoi scrieţi macroul dotimes.
|