我有一个函数:
(defun function-name (&optional args) ... <unknown content>)
我用以下方式重新定义它:
(defun function-name (&optional args) ... my own content)
我可以在一段时间后删除自己的function-name
版本,保留第一个吗?
不,你不能。
在重新定义函数之前,您可以自己保存该定义:
Common Lisp:
(defparameter *old-def* (fdefinition 'function-name))
(defun function-name ...)
...
(setf (fdefinition 'function-name) *old-def*)
Emacs Lisp:
(defconst *old-def* (symbol-function 'function-name))
(defun function-name ...)
...
(fset 'function-name *old-def*)
或者,如果您知道函数定义的位置,可以重新加载该定义:
Common Lisp:
(load "file-name")
Emacs Lisp: 与上面相同或者使用M-x load-library RET命令加载。
或者,如果您知道原始定义,可以将其粘贴到Common Lisp提示符中重新评估,或者通过访问包含定义的文件并使用C-M-x键进行函数求值,正如@Drew在评论中建议的那样。
请注意,重新定义其他库或Emacs自己的函数是有风险的,因为您不知道依赖于它们按预期工作的其他内容。如果可能的话,请使用不同的名称。如果不行,请提供大量文档,突出警告重新定义。此外,请先检查现有函数是否可以使用预定义的钩子在其之前或之后运行,或者通过自定义任何特定用户选项来调整满足您的需求。
不是通过创建新定义的方式,而是通过使用建议来获取所需结果。例如:
(defadvice function-name (around my-overrride activate)
... my own content)
(defun my-function-name (&optional args) ... my own content)
(add-advice 'function-name :override #'my-function-name)
可以通过撤销来恢复
(remove-advice 'function-name #'my-function-name)
defparameter
和fdefinition
。 - Sergeyfdefinition
吗? - Sergeyload-library
是一个不错的方法。如果出于某种原因您不想重新加载该库的所有代码,则可以只访问该库,在定义上/内放置光标,并使用C-M-x
重新评估它。 - Drew