実践Common Lispを読んでみる6

実践Common Lisp

実践Common Lisp

今日は99ページの途中まで。
スゴい勢いでマクロを組むマクロとか言うところまで駆け足で来た。
…すいません、たぶんまだちゃんとわかっていません。
会社で昼休みにOn Lispを読もう…。
On Lisp

On Lisp

以下、ソースコード

(defmacro do-primes ((var start end) &body body)
  `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
       ((> ,var ,end))
     ,@body))

(macroexpand-1 '(do-primes (p 0 19) (format t "~d " p)))
(do-primes (p 0 (random 100))
  (format t "~d " p))
(macroexpand-1 '(do-primes (p 0 (random 100))
  (format t "~d " p)))
(defmacro do-primes ((var start end) &body body)
  `(do ((ending-value ,end)
	(,var (next-prime ,start) (next-prime (1+ ,var))))
       ((> ,var ending-value))
     ,@body))
(defmacro do-primes ((var start end) &body body)
  `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
	(ending-value ,end))
       ((> ,var ending-value))
     ,@body))
(defmacro do-primes ((var start end) &body body)
  (let ((ending-value-name (gensym)))
    `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
	  (,ending-value-name ,end))
	 ((> ,var ,ending-value-name))
       ,@body)))
(defmacro with-gensyms ((&rest names) &body body)
  `(let ,(loop for n in names collect `(,n (gensym)))
     ,@body))
(defmacro do-primes ((var start end) &body body)
  (with-gensyms (ending-value-name)
    `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
	  (,ending-value-name ,end))
	 ((> ,var ,ending-value-name))
       ,@body)))

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