如何重新定义内置函数 以不同的名称保留对旧函数的引用?
即使用SBCL
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
我正在将代码移植到没有float数据类型的LISP实现。所以我想重新定义数学运算以使用固定整数数学。
我想我也可以通过搜索和替换来解决这个问题:)
答案 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))
,则不应加载上述代码两次,因为“后果未定义”。