2013-03-28 41 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)) 

現在你應該能夠處理代碼。

請注意,如果您對現有"COMMON-LISP-ORIGINAL"rename-package產生「後果未定義」,則不應加載上述代碼兩次。