重新定义的内置功能(redefining built-in function)

2019-08-18 04:03发布

我将如何重新定义一个内置的功能,同时保持一个参考旧的函数以不同的名称?

即与SBCL

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

我移植代码,不具有浮点数据类型的Lisp实现。 所以我想重新定义数学OPS使用固定的整数运算。

我想我可以与搜索和替换解决这个问题,以及:)

Answer 1:

为了回答您的具体问题:

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



文章来源: redefining built-in function