実践 Common Lisp 3.8

少しずつだが『実践Common Lisp』を読み始めた。3章の where の例で早くも感動。Lispのマクロはとにかく凄いのだと、著者がくどいくらいに主張する理由が分かってきた。確かにこれは凄い。

練習のために update のマクロ版も書いてみた。後の章で出てくるのかも知れないが。

(defun make-update-expr (field value)
  `(setf (getf cd ,field) ,value))
 
(defmacro update (selector-fn &rest clauses)
  `(setf *db*
	 (mapcar
	  #'(lambda (cd)
	      (when (funcall ,selector-fn cd)
		,@(make-expr-list #'make-update-expr clauses))
	      cd)
	  *db*)))

make-expr-list は make-comparison-list を一般化したもので、次の通り。

(defun make-expr-list (make-expr-fn fields)
  (loop while fields
       collecting (funcall make-expr-fn (pop fields) (pop fields))))

Leave a Reply