;;; Timers (defun start-timer () (get-internal-real-time)) (defun stop-timer (timer) (/ (float (- (get-internal-real-time) timer)) internal-time-units-per-second)) (defmacro timeit (func) `(let* ((timer (start-timer)) (rslt ,func)) (format t "~a~%" (stop-timer timer)) rslt)) ;;; Imperative (defun pipeline () (let (buffer) (do ((k 1 (1+ k))) ((= 100000 k)) (let ((j (/ (* (1+ k) k) 2))) (if buffer (let* ((i (pop buffer)) (r (/ (* i j) (do ((x (max i j) y) (y (min i j) (mod x y))) ((= 0 y) x))))) (dolist (d (do ((x r (floor x 10)) (digits nil (cons (mod x 10) digits))) ((= 0 x) digits))) (declare (ignore d)))) (push j buffer)))))) (timeit (dotimes (i 100) (pipeline)))