古い関数への参照を別の名前で保持しながら、組み込み関数を再定義するにはどうすればよいですか?
すなわちSBCLで
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
float データ型を持たない LISP 実装にコードを移植しています。そこで、固定整数演算を使用するように演算操作を再定義したいと考えました。
検索と置換でもこの問題を解決できると思います:)
古い関数への参照を別の名前で保持しながら、組み込み関数を再定義するにはどうすればよいですか?
すなわちSBCLで
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
float データ型を持たない LISP 実装にコードを移植しています。そこで、固定整数演算を使用するように演算操作を再定義したいと考えました。
検索と置換でもこの問題を解決できると思います:)
特定の質問に答えるには:
(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))
これで、コードを処理できるはずです。
上記のコードを 2 回ロードしないでください。rename-package
既存の"COMMON-LISP-ORIGINAL"
.