Laborator 8

Laborator 8

Problema 1

Cod:

(defun fetch(cheie listaAsociatii) (if (assoc cheie listaAsociatii)

(cadr (assoc cheie listaAsociatii))

(format t "nu a fost gasit")

)

)

Apel: (fetch 'temperature '((temperature 100)(pressure (120 60))(pulse 72)))

Rezultat obtinut: 100

Explicatii:

Simpla utilizare a functiei "assoc". Pentru a returna doar valoarea, trebuie sa returnezi primul element din "restul listei", adica "cadr"

Problema 2

Cod:

(defun listaChei(listaAsociatii) (mapcar 'car listaAsociatii))

Apel: (listaChei '((temperature 100)(pressure (120 60))(pulse 72)))

Rezultat obtinut: (TEMPERATURE PRESSURE PULSE)

Explicatii:

A forma o lista cu toate cheile, inseamna sa creez o lista cu primul element al fiecarui element de tip lista.

Problema 3

Cod:

(setf(get 'mare0 'tata) 'mare1)

(setf(get 'mare1 'tata) 'mare2)

(setf(get 'mare2 'tata) 'mare3)

(setf(get 'mare3 'tata) 'mare4)

(defun bunic(simbol proprietateCautata) ( get (get simbol proprietateCautata) proprietateCautata))

Apel: (bunic 'mare0 'tata)

Rezultat obtinut: MARE2

Explicatii:

Am inclus inca un parametru pentru a merge pe orice tip de proprietate, nu numai una specifica care sa se numeasca "tata".

Problema 4

Cod:

(defun adam(simbol proprietateCautata) ( if(null (bunic simbol proprietateCautata))

(get simbol proprietateCautata)

(adam (get simbol proprietateCautata) proprietateCautata)

)

)

Apel: (adam 'mare0 'tata)

Rezultat obtinut: MARE4

Explicatii:

Trebuie doar sa verific daca urmatorul mai exista, altfel sa returnez curentul. Pentru asta folosesc functia bunic.

Problema 5

Cod:

(setf(get 'copil0 'tata) 'tata0)

(setf(get 'copil0 'mama) 'mama0)

(setf(get 'mama0 'mama) 'mama1)

(setf(get 'mama1 'mama) 'mama2)

(setf(get 'mama2 'mama) 'mama3)

(setf(get 'mama3 'mama) 'mama4)

(setf(get 'tata0 'tata) 'tata1)

(setf(get 'tata1 'tata) 'tata2)

(setf(get 'tata2 'tata) 'tata3)

(setf(get 'tata3 'tata) 'tata4)

(defun listaProprietati(simbol proprietateCautata)(

append (list(get simbol proprietateCautata))

( if(not (null (bunic simbol proprietateCautata)) )

(append (listaProprietati(get simbol proprietateCautata) proprietateCautata))

)

)

)

(defun stramosi(simbol proprietate1 proprietate2) (append (list simbol)

(listaProprietati simbol proprietate1)

(listaProprietati simbol proprietate2)

)

)

Apel: (stramosi 'copil0 'mama 'tata)

Rezultat obtinut: (COPIL0 MAMA0 MAMA1 MAMA2 MAMA3 MAMA4 TATA0 TATA1 TATA2 TATA3 TATA4)

Explicatii:

Un obiect poate avea mai multe proprietati, astfel functia "listaProprietati" furnizeaza o lista cu stramosii cautati, in functie de proprietatea ceruta.

Functia "listaProprietati" merge pe acelasi principiu ca si procedura "bunic". In loc sa doar parcurg toti stramosii si sa il returnez doar pe ultimul, ii pun in lista.

Functia "stramosi" concateneaza rezultatele obtinute de functia "listaProprietati".

Problema 6

Cod:

(defmacro define(numeFunctie parametrii corp) '(defun ,numeFunctie ,parametrii ,corp) )

sau

(defmacro define (numeFunctie parametrii corp)

(subst numeFunctie 'numeFunctie

(subst parametrii 'parametrii

(subst corp 'corp

'(defun numeFunctie parametrii corp)

)

)

)

)

Apel: (define adunare(a b) (+ a b))

(adunare 1 2)

Rezultat obtinut: 3

Explicatii:

Problema 7

Cod:

(defmacro dotimes (var count rezultat corp)

`(if (integerp ,count)

(do( (,var 0 (+ ,var 1))

) ( (equal ,var (- ,count 1)) ,rezultat)

,corp

)

)

)

sau

(defmacro dotimes (var count rezultat corp)

(subst var 'var

(subst count 'count

(subst rezultat 'rezultat

(subst corp 'corp

`(do ((var 0 (+ var 1))) ((equal var (- count 1)) rezultat)

corp

)

)

)

)

)

)

Apel: (dotimes x 9 'gata (print x))

Rezultat obtinut:

0

1

2

3

4

5

6

7

GATA

Explicatii: