Common lisp 重新定义内置函数

Common lisp 重新定义内置函数,common-lisp,sbcl,Common Lisp,Sbcl,我如何重新定义内置函数,而 是否以其他名称保留对旧函数的引用 与SBCL合作 (unlock-package 'common-lisp) (defun old+ (a b) ?????? (defun + (a b) (old+ a b)) 我正在将代码移植到一个没有浮点数据类型的LISP实现中。所以我想重新定义数学运算,使用固定整数数学 我想我也可以通过搜索和替换来解决这个问题:)来回答您的具体问题: (defconstant +old-plus+ (fdefinition '+)) (de

我如何重新定义内置函数,而 是否以其他名称保留对旧函数的引用

与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))
请注意,如果您再次对此进行评估(例如,通过重新加载包含此代码的文件),您可能会遇到问题:
+旧加+
可能会被静默地重新定义为新的
+
(或者您可能会得到错误,或者您可能会得到警告),并且您将丢失原始的
+
定义

因此,似乎更好的方法是创建一个新的包,其中所有符号都从
CL
导入,但
+
阴影部分除外,然后使用该包而不是
CL
(未测试):

现在您应该能够处理代码了

请注意,您不应两次加载上述代码,因为如果要加载现有的
“COMMON-LISP-ORIGINAL”
,则“结果未定义”

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