;; Exercice 1 ;; 1. (defun intersection-length (s1 s2) (list-length (intersection s1 s2))) ;; 2. (defun intersection-length (s1 s2) (let ((k 0)) (dolist (e s1 k) (when (member e s2) (incf k))))) ;; 3. (defun intersection-length (s1 s2) (if (endp s1) 0 (let ((k (intersection-length (cdr s1) s2))) (if (member (car s1) s2) (1+ k) k)))) (defun intersection-length (s1 s2) (labels ((aux (s k) (if (endp s) k (aux (cdr s) (+ k (if (member (car s) s2) 1 0)))))) (aux s1 0))) ;; 4. la premiere n'est pas recursive terminale, la deuxieme l'est. ;; 5. (defun intersection-length (s1 s2 &key (test #'eql)) (let ((k 0)) (dolist (e s1 k) (when (member e s2 :test test) (incf k))))) ;; Exercice 2 ;; 6. (defun arcs-to-edges (arcs) (remove-duplicates (mapcar (lambda (arc) (sort (copy-list arc) #'<)) arcs) :test #'equal)) ;; 7. ;; (LET ((L NIL)) ;; (DOTIMES (I 5 (NREVERSE L)) ;; (DOTIMES (J 5) (WHEN (AND (/= I J) (= J (1+ I))) (PUSH (LIST I J) L))))) ;; T ;; 8. ;; ((0 1) (1 2) (2 3) (3 4)) ;; 9. ;; (expression-to-arcs 3 t) ;; Exercice 4 ;; 10. ;; blocked-account herite de account et blocked-mixin ;; 11. (defmethod print-object :after ((account account) stream) (format stream " balance: ~,2f" (balance account))) ;; 12. (defmethod transfer (montant (account1 account) (account2 account)) (decf (balance account1) montant) (incf (balance account2) montant)) ;; 13. (defmethod transfer :before (montant (account1 account) (account2 blocked-mixin)) (assert (< (+ (balance account2) montant) (roof account2))))