;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- ((A) B C D) ;; 2- ((A) (B C D)) ;; 3- (A B C D) ;; 4- (NIL) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun op-vecteur-do (v1 v2 op) (let ((length (length v1))) (assert (= length (length v2))) (let ((v (make-array length))) (dotimes (i length v) (setf (aref v i) (funcall op (aref v1 i) (aref v2 i))))))) (defun op-vecteur-loop (v1 v2 op) (let ((length (length v1))) (assert (= length (length v2))) (loop with v = (make-array length) for i from 0 below length do (setf (aref v i) (funcall op (aref v1 i) (aref v2 i))) finally (return v)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Exercice 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CL-USER> (leaves *tree*) ;; (1 R 4 F 6 7 2 4 D 3.4) ;; CL-USER> (leaves *tree* #'integerp) ;; (1 4 6 7 2 4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Exercice 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- ;; CL-USER> (macroexpand-1 '(threaded-length queue reply-next reply-buffer)) ;; (DO ((X QUEUE (REPLY-NEXT (THE REPLY-BUFFER X))) ;; (COUNT 0 (INDEX1+ COUNT))) ;; ((NULL X) COUNT)) ;; T ;; 2- Risque de capture des variables X et COUNT ;; 3- (defmacro threaded-length (list next type) (let ((x (gensym)) (count (gensym))) `(do ((,x ,list (,next (the ,type ,x))) (,count 0 (index1+ ,count))) ((null ,x) ,count)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Exercice 5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- region <- polygon ;; <- circle ;; 2- (defmethod compute-area ((circle circle)) (let ((r (radius circle))) (* pi r r))) ;; 3- ;; L'implémentation est déjà faite. On peut améliorer en supprimant la méthode ;; primaire print-object et en utilisant juste une méthode :after (defmethod print-object :after ((polygon polygon) stream) (format stream "(corners: ~A)" (corners polygon))) ;; 4- (defclass area-mixin () ((area :initform nil))) (defclass polygon (region area-mixin) ((corners :initarg :corners :accessor corners))) (defmethod area :around ((region area-mixin)) (format t "around area-mixin") (with-slots (area) region (or area (setf area (call-next-method))))) ;; remettre le créneau à NIL après une opération qui change l'aire (defmethod scale :after ((area-mixin area-mixin) scalar) (declare (ignore scalar)) (setf (slot-value area-mixin 'area) nil))