;;; Exercice 1 ;; 1. (defun map-if (f l &key (test (lambda (x) (declare (ignore x)) t))) (if (endp l) '() (let ((e (car l)) (rest (map-if f (cdr l) :test test))) (if (funcall test e) (cons (funcall f e) rest) rest)))) ;; 2. (defun map-if (f l &key (test (lambda (x) (declare (ignore x)) t))) (loop for e in l when (funcall test e) collect (funcall f e))) ;;; Exercice 2 ;; 1. (defclass marked-mixin () ((mark :initarg :mark :accessor mark :initform nil))) ;; 2. (defgeneric mark-object (object) (:documentation "mark OBJECT")) (defmethod mark-object ((object marked-mixin)) (setf (mark object) t)) ;; 3. (defgeneric unmark-object (object) (:documentation "unmark OBJECT")) (defmethod unmark-object ((object marked-mixin)) (setf (mark object) nil)) ;; 4. (defclass node (mark-mixin) ((num :initarg :num :accessor num :initform nil) (out-arcs :initform nil :initarg :out-arcs :accessor node-out-arcs))) (defclass arc (mark-mixin) ((origin :initarg :origin :reader origin) (extremity :initarg :extremity :reader extremity)) (:documentation "an arc of an oriented graph")) ;; 5. (defgeneric all-nodes-marked-p (graph) (:documentation "checks whether all nodes of GRAPH are marked")) (defmethod all-nodes-marked-p ((g graph)) (every #'node-marked-p (graph-nodes g))) ;; 6 (defmethod mark-from ((node node) (g graph)) (unless (mark node) (mark-node node) (loop for arc in (node-out-arcs node) do (mark-from (extremity arc) g)))) ;;; Exercice 3 ;; 1. à tester ;; 2. (set-dispatch-macro-character #\# #\? (lambda (stream char1 char2) (declare (ignore char1 char2)) (let* ((n (read stream t nil t)) (l (loop for i from 0 below n collect i))) `(make-array ,n :initial-contents (quote ,l)))))