abbrevってわざわざ展開する必要があるんでしょうか。

abbrev展開しない方が見やすいんじゃないかとかねがね思っていました。

(defmacro abbr (((abbr long-expression &rest nsubst-conditions) &rest more-args) &body body)
  (dolist (args (list* (list abbr long-expression) more-args))
    (setq body (apply 'nsubst (cadr args) (car args) body (cddr args))))
  `(progn ,@body))

(abbr ((h hogehoge) (f foobar))
  '(h f))
|
(hogehoge foobar)

(abbr ((h (list 1 2 3)) ((f & b) foobar :test equal)) ; マクロだからtest関数はquoteしない
  '(h (f & b)))
|
((list 1 2 3) foobar)