Tema 1
Exercicis bàsics
Calculau
(+ 553 47)> 600
Calculau
(+ (- 386 70) 38)> 354
Calculau:
(expt 4 3)> 64
(* 4 4 4)> 64
(* 4 ( * 4 4))> 64
Calculau
(+ 1024 (expt 2 3) (- (/ 27 3) 1))> 1039
(+ 1024 (* 2 (* 2 2)) (- (+ (/ 27 3) 1)))> 1039
Manipulació de llistes
Les operacions bàsiques són el CAR i el CDR – El CAR retorna el primer element d’una llista – El CDR retorna el resta de la llista (sense el primer element).
(car '(a b c d))> a;pot ser un àtom o una llista
(cdr '(a b c d))> (b c d);sempre és una llista
Obteniu el segon elemente de la llista (a b c d): b
(car (cdr '(a b c d)))> b
Obteniu el tercer elemente de la llista (a b c d): c
(car (cdr (cdr '(a b c d))))> c
Podem trobar funcions amb el ormat CxxxR on x és una A o una D que permeten la composició de CAR i CDR per obtenir el segon, el tercer, etc.
;cadr == car(cdr)(cadr '(a b c d))> b
;caddr == car(cdr(cdr))(caddr '(a b c d))> c
Altres funcions són:
- null : mira si una llista és buida o no.
- append: s’utilitza per afegir dues llistes.
- member: mira si un element pertany a una llista.
- delete: borra un element d’una llista.
- reverse: inverteix una llista.
Eliminau l’element b de la llista (a b c d)
(delete 'b '(a b c d))> (a c d)
Afegiu les llistes (a b) i (a b c d): (a b a b c d)
(append '(a b) '(a b c d))> (a b a b c d)
Afegiu l’element a a la llista (b c d): (a b c d)
(append '(a) '(b c d))> (a b c d)
Construcció de llistes
Per construir llistes es poden utilitzar el CONS i el LIST.
- CONS afegeix un nou element al principi d’una llista donada
(cons 'a '(b c d))> (a b c d)
(cons '(1 2) '(b c d))> ((1 2) b c d)
- LIST crea una llista a partir del seus arguments
(list 'a 'b 'c 'd)> (a b c d)
Afegiu l’element a a la segona posició de la llista (b c d): (b a c d)
(cons (car '(b c d)) (cons 'a (cdr '(b c d))))> (b a c d)
(append (list (car '(b c d)) 'a) (cdr '(b c d)))> (b a c d)
Assignacions
Encara que la seva utilització no és massa aconsellada, es poden donar valors als àtoms directament amb dues funcions: SET i SETQ
- SETQ vol dir “set quote” i permet assignar un valor a un àtom.
(setq ciutats '(palma inca manacor))> (palma inca manacor)
(set 'ciutats '(palma inca manacor))> (palma inca manacor)
Diferència EQUAL i EQ
- EQ mira si dos àtoms són iguals.
- EQUAL mira si dues llistes són iguals.
(set 'l1 '(a b c))> (a b c)
(set 'l2 l1)> (a b c)
(set 'l3 '(a b c))> (a b c)
(eq l1 l2)> t
(eq l1 l3)> nil
(eq l2 l3)> nil
(equal l1 l2)> t
(equal l1 l3)> t
(equal l2 l3)> t
Definició de noves funcions
Les funcions es poden definir amb la instrucció DEFUN. El format és el següent:
(defun nom-de-funció parametres expressió)
Exemple:
(defun suma1 (x) (+ x 1))> suma1
(suma1 4)> 5
Escriu la funciço quadrat, que calculi el quadrar d’un nombre
(defun quadrat (x) (* x x))> quadrat
(quadrat 4)> 16
Escriu la funció suma3, que calculi la suma de tres nombres
(defun suma3 (x y z) (+ x y z))> suma3
(suma3 4 5 5)> 14
Escriu la funció tercer, que retorni el tercer element d’una llista
(defun tercer (l) (car (cdr (cdr l))))> tercer
(tercer '(a b c ))> c
Escriu la funció darrer, que retorni l’últim element d’una llista
(defun darrer (l) (car (reverse l)))> darrer
(darrer '(a b c d))> d
Recursivitat
Per poder definir recursivament una funció necessitarem una instrucció condicional que ens permeti determinar quan s’acaba la recursivitat.
Expressions condicionals
(cond (condició-1 acció-1) (condició-2 acció-2) (condició-3 acció-3) ... (condició-n acció-n) )
S’avalua l’acció corresponent a la primera condició que es verifiqui.
És un bon costum que la darrera condició sigui t (true) per assegurar que al menys una de les condicions es compleix (equivalent a un default).
Escriu la funció darrer, que retorni el darrer element d’una llista (sense emprar el reverse)
(defun darrer (L) (cond ((null (cdr L)) (car L)) (t (darrer (cdr L)))))> darrer
(darrer '(a b c d))> d
Escriu la funció longitud, que retorni la longitud d’una llista
(defun longitud (L) (cond ((null L) 0) (t (+ 1 (longitud (cdr L))))))> longitud
(longitud '(a b c d))> 4