with-slots

with-slots の完全な仕様を把握してないのでこれでいいのかわからんけど叩き台。

(require "symbol-macrolet")

(defmacro with-slots ((&rest slot-entries) object &body body)
  `(let ((#1=#:object ,object))
     (symbol-macrolet
         ,(mapcar (lambda (slot-entry)
                    (multiple-value-bind (var-name slot-name)
                        (if (consp slot-entry)
                            (values (car slot-entry) (cadr slot-entry))
                          (values slot-entry slot-entry))
                      `(,var-name (slot-value #1# ',slot-name))))
            slot-entries)
       ,@body)))

(setf (get 'with-slots 'lisp-indent-hook) 2)