;;; 1a (defun iota (n) (labels ((aux (n) (if (zerop n) '() (cons (1- n) (aux (1- n)))))) (nreverse (aux n)))) ;;; enlever des points pour non utilisation de zerop, 1-, nreverse ;;; enlever egalement pour utilisation de () ou NIL a la place de '() ;;; 1b (defun iota (n) (let ((result '())) (dotimes (i n) (push i result)) (nreverse result))) ;;; enlever des point pour non utilisation de push. ;;; 1c (defun iota (n &optional (step 1)) (mapcar (lambda (e) (* e step)) (simple-iota n))) ;;; 1d (defun iota (n & optional (step 1) (start 0)) (loop for i from start by step repeat n collect i)) ;;; 2a (defclass region () ()) (defclass point () ((x :initarg :x :reader point-x) (y :initarg :y :reader point-y))) (defgeneric point-in-zone-p (point region)) (defclass elementary-region (region) ()) (defclass polygonal-region (elementary-region) ((corners :initarg :corners :reader corners))) (defmethod point-in-zone-p (point (region polygonal-region) ... ; le code est un peu complique ) (defclass circular-region (elementary-region) ((center :initarg :center :reader center) (radius :initarg :radius :reader radius))) (defmethod point-in-zone-p (point (region circular-region)) (let ((dist-x (- (point-x point) (point-x (center region)))) (dist-y (- (point-y point) (point-y (center region))))) (<= (+ (* dist-x dist-x) (* dist-y dist-y)) (* (radius region) (radius region))))) (defclass function-region (elementary-region) ((fun :initarg :function :reader characteristic-fun))) (defmethod point-in-zone-p (point (region function-region)) (funcall (characteristic-fun region) point)) (defclass composit-region (region) ((regions :initarg :regions :reader regions))) (defclass union-region (composit-region) ()) (defmethod point-in-zone-p (point (region (union-region))) (some (lambda (reg) (point-in-zone-p point reg)) (regions region))) (defclass inersection-region (composit-region) ()) (defmethod point-in-zone-p (point (region (intersection-region))) (every (lambda (reg) (point-in-zone-p point reg)) (regions region))) ;;; 2b (defgeneric zone-union (region1 region2)) (defgeneric zone-intersection (region1 region2) (defmethod zone-union ((region1 region) (region2 region)) (make-instance 'union-region :regions (list region1 region2))) (defmethod zone-intersection ((region1 region) (region2 region)) (make-instance 'intersection-region :regions (list region1 region2))) (defmethod zone-unon ((region1 polygonal-region) (region2 polygonal-region)) ... (make-instance 'polygonal-region ...)) (defmethod zone-intersection ((region1 polygonal-region) (region2 polygonal-region)) ... (make-instance 'polygonal-region ...))