;; Exercice 1 (defun vector-sum (v1 v2) (let* ((len1 (length v1)) (len2 (length v2)) (maxlen (max len1 len2)) (minlen (min len1 len2)) (v (make-array maxlen))) (dotimes (i minlen) (setf (aref v i) (+ (aref v1 i) (aref v2 i)))) (do ((i minlen (1+ i))) ((>= i len1)) (setf (aref v i) (aref v1 i))) (do ((i len1 (1+ i))) ((>= i len2) v) (setf (aref v i) (aref v2 i))))) ;; Exercice 2 (defun equality-fun (order-fun) (lambda (e1 e2) (not (or (funcall order-fun e1 e2) (funcall order-fun e2 e1))))) (defun member-sort (e l &key (order-fun #'<)) ;; member dans une liste triee suivant order-fun (let ((test (equality-fun order-fun))) (do ((l l (cdr l))) ((or (endp l) (funcall order-fun e (car l)))) (when (funcall test e (car l)) (return-from member-sort l))))) ;; Exercice 3 (defgeneric op-bin-set (set1 set2 op-bin-fun)) (defmethod op-bin-set ((set1 my-set) (set2 my-set) op-bin-fun) (let ((equality-fun (equality-fun set1))) (make-set (funcall op-bin-fun (elements set1) (elements set2) :test equality-fun) equality-fun))) (defmethod difference-set ((set1 my-set) (set2 my-set)) (op-bin-set set1 set2 #'set-difference)) (defclass ordered-set (my-set) ((order-fun :initarg :order-fun :reader order-fun))) (defmethod member-set (element (set ordered-set)) (member-sort element (elements set) :test (equality-fun set) :order-fun (order-fun set))) ;; Exercice 4 (defmacro def-saturation (name next-fun) (let ((next-elements (gensym)) (next-new-elements (gensym))) `(defun ,name (elements new-elements object) (let* ((,next-elements (append elements new-elements)) (,next-new-elements (set-difference (,next-fun new-elements object) ,next-elements))) (if (endp ,next-new-elements) ,next-elements (,name ,next-elements ,next-new-elements object))))))