;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun moyenne-histo (h) (let ((s 0) (m 0)) (dotimes (i (length h) (/ s m)) (let ((nb (aref h i))) (incf s (* i nb)) (incf m nb))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun fpower (f n) (if (zerop n) #'identity (lambda (x) (funcall f (funcall (fpower f (1- n)) x))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1. à tester par soi-même ;; 2. capture de la variable z ;; 3. (defmacro swap (x y) (let ((z (gensym))) `(let ((,z ,x)) (setf ,x ,y ,y ,z) (list ,x ,y)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1- (defclass compte () ((solde :initform 0.0 :initarg :solde :accessor solde))) ;; 2- (defmethod print-object :after ((compte compte) stream) (format stream " solde: ~,2f" (solde compte))) ;; 3- (defmethod transfert (montant (compte1 compte) (compte2 compte)) (decf (solde compte1) montant) (incf (solde compte2) montant)) ;; 4- (defclass compte-plafonne (compte plafonne-mixin) ()) ;; 5- (defmethod print-object :after ((compte plafonne-mixin) stream) (format stream " plafond: ~,2f" (plafond compte))) ;; 6- (defmethod transfert :before (montant (compte1 compte) (compte2 plafonne-mixin)) (assert (< (+ (solde compte2) montant) (plafond compte2))))