SBCLの# 'save-lisp-and-dieを使用してApp1というサーバーアプリケーションを作成すると、うまくいきます。今度は、関数# 'func1をApp1を停止せずに新しいバージョンに置き換えたいと考えています。 Common Lispでどうすればいいですか?Common Lispで実行中の関数を置き換えるには?
ご迷惑をおかけして申し訳ございません。
SBCLの# 'save-lisp-and-dieを使用してApp1というサーバーアプリケーションを作成すると、うまくいきます。今度は、関数# 'func1をApp1を停止せずに新しいバージョンに置き換えたいと考えています。 Common Lispでどうすればいいですか?Common Lispで実行中の関数を置き換えるには?
ご迷惑をおかけして申し訳ございません。
新しい関数定義を読み込む必要があります。新しい機能がすぐに利用可能になります。コードは新しくロードされた関数を呼び出します。
新しい関数定義は、多くの方法でロードすることができる。 :file.lisp
はfile.fasl
が
(eval (defun ...))
のソースコードにコンパイルされた関数
(load "file.fasl")
のソースコードがある
(load (compile-file "file.lisp"))
コースには、例外と合併症があります:
(function FOO)
によって、FOO
が関数の名前である)、古い値が保持されます。これを避けるには、関数ポインタの代わりにシンボルを使用してください(シンボルはfuncall
です)。fmakunbound
のシンボルを忘れないようにしてください。実際には、コードリロードはほとんどの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
を入力し、プロンプトに従います。
何らかの理由でこれを実行したくない場合は、実装で特定のものが提供されることがあります。
リリースされた画像にスワンクを含める必要がありますか? –
また、プログラムの実行中に機能を置き換えてロードする新しいパッチファイル用のディレクトリを見ることもできます。 – sbenitezb
リリース時の画像にスワンクを入れても問題は発生しません。実際には生産時にホットパッチできるようにしたいと思っています。ポートが何とか安全であることを確認してください。 –
実行中のLispプログラムで関数を置き換えることを参照するか、呼び出されている間に関数を置き換えることを頼りにしていますか(たとえば、長いループで)? –
私は実行中のLispプログラムで、実行されているかもしれないし、ないかもしれない関数を置き換えることを意味します。 –