by shigemk2

当面は技術的なことしか書かない

関数の別名定義

好き勝手な拡張が出来るのがelispの魅力だが、
名前空間がフラットであるために、すべての関数が
どこからでも呼び出せる。

勝手に関数名を変更したらファイル内の全ての処理に
影響が及ぶ。

elispは、githubとかもあるから
他の人が拡張しやすいから、勝手に関数名や変数名を
変更したら拡張してくれた人の処理にまで影響が及ぶ。

特に同じ関数名で引数の順序を入れ替える行為は最悪といえる。
そのため、elispでの開発において大切なのは互換性を保つことである。

関数名を変更するにはdefaliasを使う。

;; これは失敗
(defun f () 'original)
(defalias 'f-old 'f)
(defun f () 'redefined)
(f)					; => redefined
(f-old)					; => redefined
;; これが正解
(defun f () 'original)
(defalias 'f-old (symbol-function 'f))
(defun f () 'redefined)
(f)					; => redefined
(f-old)					; => original

;; 変数の別名定義を行う
(defvar var 'original)
(defvaralias 'alias 'var)
(cons var alias)			; => (original . original)
(setq alias 'modified)
(cons var alias)			; => (modified . modified)

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル