;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- (NIL A B C D) ;; 2- ((A B C D)) ;; 3- ((A B C D) NIL) ;; 4- (A B C D) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- ((1 1 1 1) (2 2 2)) ;; 2- (1 1 1 1 2 2 2 5) ;; 3- (defun expand (paires &optional (concatene nil)) (funcall (if concatene #'mapcan #'mapcar) (lambda (paire) (make-list (car paire) :initial-element (cdr paire))) paires)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defmacro verifier-propriete (expression propriete &optional (stream t)) (let ((exp (gensym))) `(let ((,exp ,expression)) (format ,stream "~A ~A ~A.~%" ,exp (if (,propriete ,exp) "est" "n'est pas") ',propriete)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Exercice 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- ;; 2- (defmethod cardinal ((word word)) (declare (ignore word)) 1) ;; 3- (defmethod cardinal ((language language)) (length (words language))) ;; 4- Oui: pour chaque objet d'une classe concrète dérivée de alanguage ;; il y a une méthode "words" qui s'applique: ;; (defmethod words ((word word)) pour les objets de la classe "word", ;; (defmethod words ((language language)) pour objets de la classe "language", ;; (defmethod words ((lexpression lexpression)) pour tous les objets ;; de la classe "lexpression". ;; 5- ;; (WORDS ;; (Union < [] [{a}{a}] [{b}{a}] > < [{b}{a}] [{a}{b}{a}] [{b}{b}] > [{a}{b}])) ;; -> words ((lexpression lexpression)) ;; (WORDS < [] [{a}{a}] [{b}{a}] >) -> words ((language language)) ;; (WORDS < [{b}{a}] [{a}{b}{a}] [{b}{b}] >) -> words ((language language)) ;; (WORDS [{a}{b}]) -> words ((word word)) ;; 6- ;; toutes les expressions d'une même catégorie (union, intersection, concatenation) ;; partagent le même opérateur: cet opérateur est donc stocké dans un créneau de ;; classe.