;;; 関数fは元の数を2倍にする (defun f (x) (* x 2)) (f 3) ; => 6 ;;; 関数gはfを呼び出すだけ (defun g (x) (f x)) ;;; そこで、ローカル関数fで[元の数に1を足す関数]に再定義する ;; 元々はfletを使えば望み通りの結果になった (flet ((f (x) (1+ x))) (f 3) ; => 4 (g 3)) ; => 4 ;; しかし!cl-fletはfletとは異なりgの内部で呼ばれるfには波及しない!!! ;; しかも元のfletはobsolet扱いされている、困った (cl-flet ((f (x) (1+ x))) (f 3) ; => 4 ;; !!!!!!!!!!!!!!!!!!! (g 3)) ; => 6 ;;; そこでcl-fletの代わりにdfletを使えば元のfletを再現してくれる (dflet ((f (x) (1+ x))) (f 3) ; => 4 (g 3)) ; => 4