SBCL의 # 'save-lisp-and-die를 사용하여 매우 잘 작동하는 서버 응용 프로그램 App1을 만드는 것으로 가정합니다. 이제 App1을 중지하지 않고 # 'func1 함수를 새 버전으로 대체하려고합니다. Common Lisp에서 어떻게 할 수 있습니까?Common Lisp에서 실행중인 함수를 바꾸는 방법은 무엇입니까?
모든 의견을 환영합니다!
SBCL의 # 'save-lisp-and-die를 사용하여 매우 잘 작동하는 서버 응용 프로그램 App1을 만드는 것으로 가정합니다. 이제 App1을 중지하지 않고 # 'func1 함수를 새 버전으로 대체하려고합니다. 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
그리고 이맥스에서, 당신은 M-x slime-connect
을 할 수 있으며, 화면의 지시를 따릅니다.
어떤 이유로 든이 작업을 수행하지 않으려는 경우 구현시 특정 항목을 제공 할 수 있습니다.
출시 된 이미지에 스웽크를 포함시켜야한다는 의미입니까? –
또한 새로운 패치 파일을위한 디렉토리를 볼 수도 있습니다.이 디렉토리는 프로그램이 실행되는 동안 기능을 대체하기 위해로드됩니다. – sbenitezb
제작 된 시간에 실제로 핫 패치 할 수 있기를 원한다면 출시 된 이미지에 swank을 넣는 데는 문제가 없습니다. 포트가 어떻게 든 안전한지 확인하십시오. –
분명히 : 실행중인 리스프 프로그램에서 함수를 바꾸는 것을 참조 하시겠습니까? 아니면 호출되는 동안 (예 : 긴 루프에서) 함수를 교체하겠습니까? –
실행중인 리스프 프로그램에서 실행 중이거나 실행 중이 아닌 함수를 대체하는 것을 의미합니다. –