;; Exercice 1 ;; 1- ;; iterative (defun cartesian-product (l1 l2) (let ((couples '())) (dolist (e1 l1 (nreverse couples)) (dolist (e2 l2) (push (list e1 e2) couples))))) ;; 2- ;; recursive (defun cartesian-product (l1 l2) (labels ((distribute (e l2 couples) (if (endp l2) couples (distribute e (cdr l2) (cons (list e (car l2)) couples)))) (aux (l1 couples) (if (endp l1) (nreverse couples) (aux (cdr l1) (append (distribute (car l1) l2 '()) couples))))) (aux l1 '()))) ;; 3- récursive terminale ;; Exercice 2 ;; 1- (defun make-empty-grid () (make-array (list *size* *size*))) ;; 2- (defun square-full-p (grid x y) (let ((value (aref grid x y))) (and (plusp value) value))) ;; 3- (defun make-direction (dir-x dir-y) (make-instance 'direction :dir-x dir-x :dir-y dir-y)) ;; 4 (defmethod homogeneous-dir-p ((grid array) (x integer) (y integer) (direction direction)) (let ((dx (dir-x direction)) (dy (dir-y direction)) (value (aref grid x y)) (size (car (array-dimensions grid)))) (do ((x (funcall dx x) (funcall dx x)) (y (funcall dy y) (funcall dy y))) ((or (>= x size) (>= y size) (< x 0) (< y 0)) t) (unless (= (aref grid x y) value) (return))))) ;; 5- methode after sur initialize-instance (defmethod initialize-instance :after ((direction direction) &rest initargs &key &allow-other-keys) (declare (ignore initargs)) (let ((dir-x (dir-x direction)) (dir-y (dir-y direction))) (assert (member dir-x *1directions* :test #'eq)) (assert (member dir-y *1directions* :test #'eq)) (when (eq dir-x #'identity) (assert (not (eq dir-y #'identity)))))) ;; Exercice 3 ;; 1- à tester soi-même ;; 2- évaluations multiples (defmacro setq2 (variable1 variable2 expression) ;; correct (let ((v (gensym))) `(let ((,v ,expression)) (progn (setq ,variable1 ,v) (setq ,variable2 ,v)))))