少しずつだが『実践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))))