;; Exemples d'utilisation de la macro loop (loop ;; forme simple (format t "Number? ") (let ((n (parse-integer (read-line) :junk-allowed t))) (if n (progn (write n) (terpri)) (return)))) (loop ;; formes avec mots-clés for i from 1 to (* 2 10) while (not (> i 6)) collect (* i i) do (format t "Working on ~D now~%" i) when (evenp i) do (format t "~D i an even number~%" i) finally (format t "About to exit!")) (loop for e in '(1 2 3) do (print e)) (loop for e across #(1 2 3) do (print e)) (loop for i from 2 to 5 do (print i)) (loop for i from 1 to 10 by 3 do (print i)) ((loop for i from 1 below 10 by 3 do (print i)) loop for i from 10 downto 0 by 3 do (print i)) (loop for i downfrom 10 to 0 by 3 do (print i)) (loop for i from 2 to 5 do (print i) collect i) (loop for i from 0 to 5 do (print i) when (evenp i) collect i) (loop for i from 2 to 5 do (print i) sum i) (loop for i from 1 to 4 for e in '(a b c d e f) collect (cons i e)) (loop for i from 1 to 5 for e in '(a b c d) append (list i e)) ; aussi nconc (loop for i from 0 to 1000 while (< i 3) do (print i)) (loop for i from 0 to 1000 while (< i 4) when (oddp i) collect i finally (print "bye")) ; aussi initially (loop for l = '(1 2 3) then (reverse l) repeat 4 collect l) ;; des clauses "for" consécutives affectent les variables séquentiellement (loop for i from 2 to 345 for j from i to 6 by i do (print j)) ;; pour obtenir un comportement "parallèle", utiliser "and" (let ((i 3)) (loop for i from 2 to 345 and j from i to 6 by i do (print j))) ;; accumulation (loop for i in '(6 3 4 7 4 9 5) maximize (sin i)) ;; aussi "minimize" "sum" (loop for i in '(6 3 4 7 4 9 5) count i) (loop for i in '(6 3 NIL 7 4 9 5) count i) (loop for i in '(6 3 4 7 4 9 5) count (evenp i)) ;; clauses conditionnelles (loop for i from 3 to 8 when (oddp i) sum i) (loop for i from 3 to 8 if (oddp i) sum i else do (format t "~A pas impair~%" i)) ;; variables locales qui ne sont pas des variables de boucle (loop with val = 5 with sin = (sin val) for i from 0 to 2 sum (+ i val sin))