重新定义内置函数

Kin*_*Wee 5 sbcl common-lisp

我将如何重新定义内置函数,同时以不同的名称保持对旧函数的引用?

即与SBCL

(unlock-package 'common-lisp)
(defun old+ (a b) ??????
(defun + (a b) (old+ a b))
Run Code Online (Sandbox Code Playgroud)

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

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

sds*_*sds 13

要回答您的具体问题:

(defconstant +old-plus+ (fdefinition '+))
(defun + (&rest args) (apply +old-plus+ args))
Run Code Online (Sandbox Code Playgroud)

请注意,如果再次对此进行评估(例如,通过重新加载包含此代码的文件),您可能会遇到问题:+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))
Run Code Online (Sandbox Code Playgroud)

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

请注意,您不应该加载上述代码两次,因为如果您rename-package对现有代码有"未定义的后果" "COMMON-LISP-ORIGINAL".