Exercice 1 ========== Problèmes: - Le commentaire commence par un seul caractère `;' au lieu de trois, - Le commentaire est trop volumineux pour la taille de la fonction, - Le commentaire est incorrect (`fn' au lieu de `f', pas de `n'), - Le `labels' n'est pas indenté correctement, - Utilisation de nil au lieu de '() pour indiquer une liste vide, - Utilisation de `if' à la place de `when' pour un test sans partie `sinon', - Il est préférable d'utiliser endp à la place de null pour tester la fin de la liste, - Append est sans effets de bord. Il faut récupérer la valeur. - Utilisation de (append retval (list (car l))) au lieu de (push (car l) retval) puis (nreverse retval), - Le cas spécial du test n'est pas le premier traité, - Utilisation de `if' avec `progn' possible à remplacer par `cond', - Utilisation de la récursivité au lieu de l'itération sur une liste simple. Version améliorée : ;;; return the members of l for which f returns a value > n (defun all-fs (l f n) (remove-if-not #'(lambda (x) (> (funcall f x) n)) l)) ou équivalent, par exemple (pour les amateurs de loop) : ;;; return the members of l for which f returns a value > n (defun all-fs (l f n) (loop for x in l when (> (funcall f x) n) collect x)) voici une version méritant 1p : ;;; return the members of l for which f returns a value > n (defun all-fs (l f n) (let ((retval '())) (dolist (x l) (when (> (funcall f x) n) (push x retval))) (nreverse retval))) Exercice 2 ========== (defclass event () ...) (defclass key-press-event (event) ...) (defclass button-press-event (event) ...) (defclass widget () ...) (defclass text-widget (widget) ...) (defclass canvas-widget (widget) ...) (defgeneric handle-event (event widget)) (defmethod handle-event ((event key-press-event) (widget text-widget)) ...) (defmethod handle-event ((event key-press-event) (widget canvas-widget)) ...) (defmethod handle-event ((event button-press-event) (widget text-widget)) ...) (defmethod handle-event ((event button-press-event) (widget canvas-widget)) ...) (defmethod handle-event :before ((event event) (widget widget)) ;; vérifier les coordonnées ...) Exercice 3 ========== (defmacro with-implicit-point (&body body) (let ((x (gensym)) (y (gensym))) `(let ((,x 0) (,y 0)) (labels ((moveto (x y) (setf ,x x ,y y)) (lineto (x y) (draw-line ,x ,y x y) (setf ,x x ,y y))) ,@body (values)))))