【问题标题】:redefining built-in function重新定义内置函数
【发布时间】:2013-03-28 20:49:33
【问题描述】:

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

即使用 SBCL

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

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

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

【问题讨论】:

    标签: common-lisp sbcl


    【解决方案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",则不应将上述代码加载两次,因为“结果未定义”。

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2010-10-13
      • 2011-09-18
      • 1970-01-01
      • 2011-05-20
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多