コンパイル時に非推奨関数の利用について警告を出す


公開したAPIが後に変更になり、古いAPIの利用を非推奨としたい場合があります。
そのような場合、関数やマクロについては、コンパイラマクロがコンパイル時に作用することを利用して警告を出すことが可能です。
コンパイラマクロの定義には、define-compiler-macroを使用します。

旧API

(defun foo (x y)
  (+ x y))

(defmacro defbaz (x y)
  `(devfar ,x ,y))

現行API

(defun new-foo (x y)
  (+ x y))

(defmacro new-defbaz (x y)
  `(devfar ,x ,y))

旧APIに非推奨警告を定義

(define-compiler-macro foo (x y)
  (declare (ignore x y))
  (warn "~S is obsoleted. Please use ~S instead." 
        'foo
        'new-foo))

(define-compiler-macro defbaz (x y)
  (declare (ignore x y))
  (warn "~S is obsoleted. Please use ~S instead." 
        'defbaz
        'new-defbaz))

非推奨関数 foo をコンパイルした場合

(defun bar ()
  (foo 1 2))
;;;*** Warning in bar: foo is obsoleted. Please use new-foo instead.

非推奨マクロ baz-zot をコンパイルした場合

(defbaz baz-zot 42)
;;;*** Warning between functions:   defbaz is obsoleted. Please use new-defbaz instead.