(defun primep (number)
(when (> number 1)
(loop for fac from 2 to (isqrt number) never (zerop (mod number fac)))))
(defun next-prime (number)
(loop for n from number when (primep n) return n))
(defmacro do-primes-1 (var-and-range &rest body)
(let ((var (first var-and-range))
(start (second var-and-range))
(end (third var-and-range)))
`(do ((,var(next-prime ,start) (next-prime(1+ ,var))))
((> ,var ,end))
,@body)))
(defmacro do-primes-2 ( (var start end) &body body)
`(do ((,var(next-prime ,start) (next-prime(1+ ,var))))
((> ,var ,end))
,@body))
在do-primes-1中需要手工拆解 var-and-range
在do-primes-2中解构形参列表,使用(var start end)替换 var-and-range
执行:
CL-USER> (do-primes (p 0 19) (format t "~d~t" p))
2 3 5 7 11 13 17 19