なんちゃって symbol-macrolet

(defmacro symbol-macrolet (defs &body body)
  (labels ((rplatom (old new forms)
             (cond ((null forms) nil)
                   ((atom forms)
                    (if (eq forms old) new forms))
                   (t (cons (rplatom old new (car forms))
                            (rplatom old new (cdr forms)))))))
    `(progn ,@(dolist (def (reverse defs) body)
                (setf body (rplatom (car def) (cadr def) body))))))
=> symbol-macrolet

(setf (get 'symbol-macrolet 'lisp-indent-hook) 1)
=> 1

(macroexpand-1 '(symbol-macrolet ((hi (progn (print "howdy") 1)))
                 (+ hi 2)))
=> (progn (+ (progn (print "howdy") 1) 2))
=> t
  • setq と setf とか
    • setq -> setf
    • psetq -> psetf
    • multiple-value-setq -> (setf (values ...))
      • xyzzy では values に setf できないぽ?
  • (declare (special )) はエラー
  • let による shadowing
(defstruct person
  name age)
=> #<structure-definition: person>

(defmacro with-person (person &body body)
  (let ((he (gensym)))
    `(symbol-macrolet ((name (person-name ,he))
                       (age (person-age ,he)))
       (let ((,he ,person))
         ,@body))))
=> with-person

(with-person (make-person :name "ふぐ" :age 3)
  (format t "おっす、オラ ~A!生まれてからもう ~S 年経っちまった!"
          name age))
おっす、オラ ふぐ!生まれてからもう 3 年経っちまった!
=> nil