假设我们使用 SBCL 的#'save-lisp-and-die 创建一个服务器应用程序 App1,它运行良好。现在我们想在不停止 App1 的情况下用新版本替换函数 #'func1。我们如何在 Common Lisp 中做到这一点?
任何建议表示赞赏!
假设我们使用 SBCL 的#'save-lisp-and-die 创建一个服务器应用程序 App1,它运行良好。现在我们想在不停止 App1 的情况下用新版本替换函数 #'func1。我们如何在 Common Lisp 中做到这一点?
任何建议表示赞赏!
我个人确保 SWANK(SLIME 的服务器部分)正在运行,以便我可以随时使用 Emacs+SLIME 连接到图像并重新定义我想要的任何内容。
(ql:quickload "swank")
(swank:start-server :port 1234) ;; listen for SLIME connections on port 1234
然后在 Emacs 中,您可以M-x slime-connect
,并按照提示进行操作。
如果您出于某种原因不想这样做,您的实现可能会提供一些特定的东西。
您需要加载新的函数定义。然后新功能将立即可用;代码将调用新加载的函数。
可以通过多种方式加载新的函数定义:
(load (compile-file "file.lisp"))
file.lisp
函数的源代码在哪里(load "file.fasl")
file.fasl
编译的源代码在哪里(eval (defun ...))
当然,也有例外和并发症:
(function FOO)
在哪里FOO
),它将保留其旧值。为避免这种情况,请使用符号而不是函数指针(可以使用符号funcall
)。fmakunbound
它们的符号。但在实践中,代码重载在大多数 Common Lisp 实现中运行良好。