;;;;;;;;;;;;;;;;;corrige_cc3.lisp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;EXO1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;Q1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun sompui(n m) (do ((p 0 (1+ p)) (som 0 (+ (expt p n) som))) ((> p m) som))) ;CL-USER> (sompui 2 3) ;14 ;;;;;;;;;;;;;;;;;;;;;;;;Q2;;;;;;;;;;;;;;;;;;;;;;; (defmacro defsompui(nom n) `(defun ,nom(m) (do ((p 0 (1+ p)) (som 0 (+ (expt p ,n) som))) ((> p m) som)))) (defsompui somcarre 2) (somcarre 3) ;CL-USER> (somcarre 3) ;14 ;;;;;;;;;;;;;;;;;;;;;;;;Q3;;;;;;;;;;;;;;;;;;;;; (defmacro defsomf(nom f) `(defun ,nom(l) (let ((som 0)) (dolist (p l som) (setf som (+ (funcall ,f p) som)))))) (defsomf somcarre2 (lambda(x) (* x x))) ;CL-USER> (somcarre2 '(1 2 3)) ;14 (defsomf somsinus #'sin) ;CL-USER> (somsinus '(1 2 3)) ;1.8918884 ;CL-USER> (somsinus (list pi (/ pi 2))) ;1.0000000000000002d0 ;;;;;;;;;;;;;;;;;;;;;;;;EXO 2;;;;;;;;;;;;;;;;;;;;;;; (defmacro enumf(n f) ;; retourne la liste des images par f des entiers de 0 a n `(do ((i 0 (1+ i)) (l nil (cons (funcall ,f i) l))) ((> i ,n) l))) (enumf 3 (lambda(x) (* x x))) ;CL-USER> (enumf 3 (lambda(x) (* x x))) ;(9 4 1 0) ;;;;;;;;;;;;;;;;;;;;;;;;Q1;;;;;;;;;;;;;;;;;;;;; ;(defparameter i 6) ;CL-USER> (enumf (/ i 2) (lambda(x) (* x x))) ;(0) ;explication: l'expansion de l'appel de macro ci-dessus retourne une boucle do ;dont le test d'arret est ;(> i (/ i 2)) ; ce test devient vrai des que i=1 ;;;;;;;;;;;;;;;;;;;;;;;;Q2;;;;;;;;;;;;;;;;;;;;; (defmacro enumf2(n f) ;; retourne la liste des images par f des entiers de 0 a n (let ((i (gensym)) (l (gensym))) `(do ((,i 0 (1+ ,i)) (,l nil (cons (funcall ,f ,i) ,l))) ((> ,i ,n) ,l)))) CL-USER> (defparameter i 6) CL-USER> (enumf2 (/ i 2) (lambda(x) (* x x))) (9 4 1 0)