2012-01-16 2 views
4

SBCL의 # 'save-lisp-and-die를 사용하여 매우 잘 작동하는 서버 응용 프로그램 App1을 만드는 것으로 가정합니다. 이제 App1을 중지하지 않고 # 'func1 함수를 새 버전으로 대체하려고합니다. Common Lisp에서 어떻게 할 수 있습니까?Common Lisp에서 실행중인 함수를 바꾸는 방법은 무엇입니까?

모든 의견을 환영합니다!

+0

분명히 : 실행중인 리스프 프로그램에서 함수를 바꾸는 것을 참조 하시겠습니까? 아니면 호출되는 동안 (예 : 긴 루프에서) 함수를 교체하겠습니까? –

+0

실행중인 리스프 프로그램에서 실행 중이거나 실행 중이 아닌 함수를 대체하는 것을 의미합니다. –

답변

3

새 함수 정의를로드해야합니다. 그런 다음 새 기능을 즉시 사용할 수 있습니다. 코드가 새로로드 된 함수를 호출합니다.

새로운 기능 정의는 여러 가지 방법으로로드 할 수 : file.lispfile.fasl

  • (eval (defun ...))
  • 의 소스 코드를 컴파일 기능

  • (load "file.fasl")에 대한 소스 코드가

    • (load (compile-file "file.lisp")) 물론 예외 및 합병증이 있습니다.

      • 이 기능은 이미 실행중인 이전 기능 호출을 대체하지 않습니다. 예를 들어, 무한 이벤트 루프는 이런 식으로 변경할 수 없습니다. 어떤 종류의 중지와 새 함수 호출을 지원해야합니다. 그러나 그러한 장기 실행 기능은 거의 없습니다. 루핑 대신 재귀를 사용하여 작업 할 수 있습니다 (그러나 모든 컴파일러가 테일 호출 최적화를 수행하는 것은 아닙니다).
      • 함수 포인터 (예 : (function FOO), 여기서 FOO은 함수의 이름 임)를 사용하면 이전 값을 유지합니다. 이를 방지하려면 함수 포인터 대신 심볼을 사용하십시오 (기호는 funcall입니다).
      • 함수 코드는 가비지 수집 대상입니다. 함수의 이전 버전에 대한 참조를 남기지 않도록주의해야합니다. 또한 일부 기능이 필요하지 않은 경우 fmakunbound 기호를 잊어서는 안됩니다.
      • 컴파일 타임에 함수가 사용 된 경우 영향을받는 모든 코드도 다시로드해야합니다.
      • 최적화 수준이 높으면 (기본값은 아님) 컴파일러가이 함수를 다른 함수로 인라인했을 수 있습니다. CLHS는 함수를 재정의하면«정의되지 않은 동작»이되는 경우를 구분합니다.

      실제로 코드 리로딩은 대부분의 Common Lisp 구현에서 잘 작동합니다.

  • 10

    저는 개인적으로 SWANK (SLIME의 서버 부분)가 실행 중이므로 Emacs + SLIME을 사용하여 언제든지 이미지에 연결할 수 있고 원하는대로 다시 정의 할 수 있습니다.

    (ql:quickload "swank") 
    (swank:start-server :port 1234) ;; listen for SLIME connections on port 1234 
    

    그리고 이맥스에서, 당신은 M-x slime-connect을 할 수 있으며, 화면의 지시를 따릅니다.

    어떤 이유로 든이 작업을 수행하지 않으려는 경우 구현시 특정 항목을 제공 할 수 있습니다.

    +0

    출시 된 이미지에 스웽크를 포함시켜야한다는 의미입니까? –

    +4

    또한 새로운 패치 파일을위한 디렉토리를 볼 수도 있습니다.이 디렉토리는 프로그램이 실행되는 동안 기능을 대체하기 위해로드됩니다. – sbenitezb

    +1

    제작 된 시간에 실제로 핫 패치 할 수 있기를 원한다면 출시 된 이미지에 swank을 넣는 데는 문제가 없습니다. 포트가 어떻게 든 안전한지 확인하십시오. –

    관련 문제