我将如何重新定义一个内置的功能,同时保持一个参考旧的函数以不同的名称?
即与SBCL
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
我移植代码,不具有浮点数据类型的Lisp实现。 所以我想重新定义数学OPS使用固定的整数运算。
我想我可以与搜索和替换解决这个问题,以及:)
我将如何重新定义一个内置的功能,同时保持一个参考旧的函数以不同的名称?
即与SBCL
(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
我移植代码,不具有浮点数据类型的Lisp实现。 所以我想重新定义数学OPS使用固定的整数运算。
我想我可以与搜索和替换解决这个问题,以及:)
为了回答您的具体问题:
(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))
现在,你应该能够处理的代码。
需要注意的是,因为“后果是未定义”如果你不应该加载上面的代码中两次rename-package
到一个现有的"COMMON-LISP-ORIGINAL"
。