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
M-x slime-connect
次に、Emacs で、プロンプトに従うことができます。
なんらかの理由でこれを行いたくない場合は、実装によって特定のものが提供される場合があります。
新しい関数定義をロードする必要があります。その後、新しい機能がすぐに利用できるようになります。コードは新しくロードされた関数を呼び出します。
新しい関数定義は、さまざまな方法でロードできます。
(load (compile-file "file.lisp"))
file.lisp
関数のソースコードはどこですか(load "file.fasl")
file.fasl
コンパイルされたソースコードはどこにありますか(eval (defun ...))
もちろん、例外と複雑さがあります:
(function FOO)
whereでFOO
)、古い値が保持されます。これを回避するには、関数ポインタの代わりにシンボルを使用します(シンボルは可能ですfuncall
)。fmakunbound
その記号を忘れないでください。しかし実際には、コードのリロードはほとんどのCommonLisp実装でうまく機能します。