5
我將如何重新定義一個內置的功能,同時 保持參照舊函數以不同的名稱?重新定義內置功能
即與SBCL
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
我移植代碼,不具有浮點數據類型的Lisp實現。所以我想重新定義數學運算使用固定整數數學。
我想我可以與搜索和替換,以及:)
我將如何重新定義一個內置的功能,同時 保持參照舊函數以不同的名稱?重新定義內置功能
即與SBCL
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
我移植代碼,不具有浮點數據類型的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))
現在你應該能夠處理代碼。
請注意,如果您對現有"COMMON-LISP-ORIGINAL"
的rename-package
產生「後果未定義」,則不應加載上述代碼兩次。