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