2013-03-28 5 views
5

Wie würde ich eine eingebaute Funktion neu definieren, während einen Verweis auf die alte Funktion unter einem anderen Namen behalten?Neudefinition der integrierten Funktion

dh mit SBCL

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

Ich Portierung Code in eine LISP-Implementierung, die nicht float-Datentyp hat. Also wollte ich die mathematischen Operationen neu definieren, um feste ganze Zahlen zu verwenden.

nehme ich mich dieses Problem auch mit Such- und ersetzen :)

Antwort

12

lösen kann Ihre Frage zu beantworten:

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

Beachten Sie, wenn Sie die Bewertung dieses wieder (zB durch Neuladen die Datei, in der dieser Code enthalten ist), haben Sie möglicherweise ein Problem: +old-plus+ möglicherweise in Ihrem neuen + (oder Sie erhalten möglicherweise eine Fehlermeldung oder Sie erhalten möglicherweise eine Warnung) im Stillen neu definiert und Sie verlieren die ursprüngliche + Definition.

Daher scheint es, dass ein besserer Ansatz ein neues Paket zu erstellen wäre, wo alle Symbole von CL Ausnahme + importiert werden, das beschattet wird, und verwenden Sie dann das Paket statt CL (ungetestet):

(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)) 

Jetzt sollten Sie in der Lage sein, den Code zu verarbeiten.

Beachten Sie, dass Sie den obigen Code nicht zweimal laden sollten, weil "Konsequenzen sind nicht definiert", wenn Sie rename-package zu einem vorhandenen "COMMON-LISP-ORIGINAL".