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