実践Common Lispを読んでみる5

実践Common Lisp

実践Common Lisp

今日は93ページの途中まで。
とうとうマクロ定義。
正直、まだよくわかっていないところがたくさんある。
以下、ソースコード

(dolist (x '(1 2 3)) (print x))
(dolist (x '(1 2 3)) (print x) (if (evenp x) (return)))
(dotimes (i 4) (print i))
(dotimes (x 20)
  (dotimes (y 20)
    (format t "~3d " (* (1+ x) (1+ y)))))
(do ((n 0 (1+ n))
     (cur 0 next)
     (next 1 (+ cur next)))
    ((= 10 n) cur)
;  (format t "~3d" cur)
  )
(do ((i 0 (1+ i)))
    ((>= i 4))
  (print i))
(do ()
    ((> (get-universal-time) *some-future-date*))
  (format t "Warning~%")
  (sleep 1))
(defvar *some-future-date* (+ 3446977325 (* 60 1)))
(loop
   (when (> (get-universal-time) *some-future-date*)
     (return))
   (format t "Waiting~%")
   (sleep 60))
(do ((nums nil) (i 1 (1+ i)))
    ((> i 10) (nreverse nums))
  (push i nums)
;  (print i)
  )
(loop for i from 1 to 10 collecting i)
(loop for x from 1 to 10 summing (expt x 2))
(loop for x across "the quick brown fox jumps over the lazy dog"
     counting (find x "aeiou"))
(loop for i below 10
     and a = 0 then b
     and b = 1 then (+ b a)
     finally (return a))

(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))
(do-primes (p 0 19)
  (format t "~d " p))
(do ((p (next-prime 0) (next-prime (1+ p))))
    ((> p 19))
  (format t "~d " p))
(defmacro do-primes (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 ((var strat end) &body body)
  `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
       ((> ,var ,end))
     ,@body))

http://dl.getdropbox.com/u/228440/veleno-samples/lisp-samples/sample.lisp