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

 

 

Parametri opţionali

 

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)))))

 

 

Macrouri

 

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.

 

 

Backquote

 

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.