重新定义内置函数

时间:2013-03-28 20:49:34

标签: common-lisp sbcl

如何重新定义内置函数  以不同的名称保留对旧函数的引用?

即使用SBCL

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

我正在将代码移植到没有float数据类型的LISP实现。所以我想重新定义数学运算以使用固定整数数学。

我想我也可以通过搜索和替换来解决这个问题:)

1 个答案:

答案 0 :(得分:13)

回答您的具体问题:

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

请注意,如果再次对此进行评估(例如,通过重新加载包含此代码的文件),则可能会出现问题:+old-plus+可能会被静默地重新定义为新的+(或者您可能得到错误,或者您可能会收到警告),您将失去原来的+定义。

因此,似乎更好的方法是创建一个新的包,其中所有符号都是从CL导入的,但被遮蔽的+除外,然后使用该包代替{{1} }(未经测试):

CL

现在你应该能够处理代码了。

请注意,如果rename-package为现有(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)) ,则不应加载上述代码两次,因为“后果未定义”。