2013-03-28 24 views
5

組み込み関数を再定義するにはどうすればいいですか? 別の名前で古い関数への参照を保持していますか?組み込み関数の再定義

すなわちSBCL

(unlock-package 'common-lisp) 
(defun old+ (a b) ?????? 
(defun + (a b) (old+ a b)) 

と私は浮動小数点データ型を持たないLISPの実装にコードを移植しています。だから私は固定整数計算を使うように数学演算を再定義したかったのです。

私は検索と置換のほかに、この問題を解決することができます:)

答えて

12

をあなたの特定の質問に答えるために仮定:リロードすることにより、あなたは再びこれを評価場合という

(defconstant +old-plus+ (fdefinition '+)) 
(defun + (&rest args) (apply +old-plus+ args)) 

注意(例えば、 +old-plus+が新しい+に暗黙的に再定義される可能性があります(またはエラーが発生するか、警告が表示される可能性があります)。元の+の定義が失われます。

したがって、(未テスト)より良いアプローチが隠されているすべてのシンボルが+以外のCLから輸入されている新しいパッケージを作成し、代わりにCLのパッケージを使用することであろうと思わ:

(rename-package "COMMON-LISP" "COMMON-LISP-ORIGINAL") 
(make-package "COMMON-LISP") 
(use-package "COMMON-LISP-ORIGINAL" "COMMON-LISP") 
(shadow "+" "COMMON-LISP") 
(do-external-symbols (s "COMMON-LISP-ORIGINAL") 
    (export (find-symbol (symbol-name s)) "COMMON-LISP")) 
(defun common-lisp::+ (&rest args) (apply #'common-lisp-original:+ args)) 

コードを処理できるようになりました。

rename-packageから既存の"COMMON-LISP-ORIGINAL"までの場合は、「結果は未定義」なので、上記のコードを2回読み込まないでください。

関連する問題