2012-06-24 4 views
4

나는 약간의 서비스를 개발하기 위해 emacs와 slime을 사용하기 시작했다.개발 중 SLIME에서 재로드하고 재시작하는 방법

변경 후 코드를 다시로드하는 방법을 찾았지만 더 편리하고 빠르게이 코드를 원합니다. 다음 점액에,

  • 1) 시작 이맥스 점액을 시작 :

    이것은 내가 지금 덜렁이 어떻게

    2) (부하 "init.lisp"); 일부 초기화 코드를로드하지 마십시오. 변경

    3) (load "myseervice.lisp"); 이 시점에서

    5)가 seeervice가들이받은됩니다) 시작하고 내가 그것을 테스트 할 수 있습니다 :이 내가

    4) (MYSERVICE 작업 오전 코드를 containts. 그런 다음 I myseervice.lisp을 변경하여 수정하십시오. 에 내가 이렇게 새로운 버전의 코드를 교체하려면

    6) (MYSERVICE : 정지)

    7) (부하 "myservice.lisp")

    8) 4로 이동)를 시작합니다 그것은 다시 ...


이 지금까지 작동합니다. 그러나 수동으로 중지, 다시로드 및 시작하는 것은 재미 없습니다. 그리고 호출 사이에 슬라임에 많은 출력이 있으므로 이전에 입력 한 명령을 다시 사용하는 것은 쉽지 않습니다. 4) -7).

나는 단지 하나의 명령에 나를 위해이 작업을 수행해야 devhelper 패키지를 시작 솔루션을 가지고,하지만이 작동하지 않습니다

(defpackage :devhelper 
    (:use :common-lisp :myservice) 
    (:export :start :reload)) 

(in-package :devhelper) 

(defun start() 
    (myservice:start)) 

(defun reload() 
    (myservice:stop) 
    (load "myservice.lisp") ;I think it is not possible to load it here, 
          ;because this module is using the file that it is just loading 
          ;But it does not have to work this way, 
          ;I just like any good solution 
    (myservice:start)) 

그리고 내가이 지금처럼 그것을 할 수 있다고 생각 :

  • 1) 막스 슬라임에이어서, 점액을 시작 시작 :

    2) (부하 "init.lisp"); 변경하지 않는 초기화 코드를로드하십시오.

    3a) (load "myseervice.lisp"); 이 시점에서 seeervice가들이받은 내가됩니다 시작)

    5)이 내가)

    3B에 (부하 "devhelper.lisp")

    4) 작업 오전 코드 (devhelper를 containts 그것을 테스트 할 수 있습니다. 그런 다음 I myseervice.lisp을 변경하여 수정하십시오.

    6) (devhelper : 에 나는 내가 할 수있는 꿈 jussst 새 버전의 코드를 교환하려면 다시로드)

을하지만이 시점에서 정지.

그리고 나는이 devhelper 아이디어에 집착하지 않고 있으며, 단지 더 부드러운 개발주기를 원합니다.

어떻게 진짜 lisper는 그것을 할 것입니까? 나는이 모든 것을 처음 접했고 전통적인 프로그래밍 배경에서 온 것이다.) IDE와 수입이있다. 이전 명령을 인용

+1

4 단계 후, C-c C-c 또는 C-c C-k를 통해 Lisp 구현에 코드를 다시 보내려고 했습니까? 이것이 제가하는 것입니다. Lisp 이미지의 이런 종류의 핫 패치 (hotpatching)는 프로덕션 IMHO에서는 사용해서는 안되지만, 개발시에는 꽤 잘 작동합니다 (개발시 요청을 제어 할 수 있으므로 요청 처리 코드가 실행될 때 중요한 포인트 중 하나입니다. 요청을 처리하는 사이에 코드가 다시로드되는지 확인할 수 있습니다. –

답변

5

역사

는 점액/이맥스에서 어려운 일이 아니다.

M-pM-n 명령은 이전 또는 다음 입력을받습니다. M-rM-s을 사용하면 입력에서 정규 표현식을 사용하여 검색 할 수 있습니다.

또 다른 방법은, 리스프 파일에 명령을 적어 버퍼에서 파일을 열고 거기에서 그들을 실행할 수하는 버퍼에서

실행.

다시로드

귀하의 재 장전 아이디어는 괜찮습니다. 서비스을 종료하고 새 코드를로드 한 다음 서비스을 다시 시작할 수 있습니다. 왜 얼어 버린 지 알아 내야합니다. 그걸 디버깅해야합니다. 설명서와 코드화 된 버전의 차이점 중 하나는 다음과 같습니다. 중지,로드 및 시작 사이의 시간이 코드화 된 버전으로 훨씬 짧습니다. 문제가 있는지 확인해야합니다. 하나 개 이상의 파일이있을 때 코드

보다 진보 된 조직은 일반적으로이 코드를 구성하는 하나 이상의 시스템를 사용하는 의미가 있습니다. 또한 코드가 파일 컴파일러를 사용하여 코드를 컴파일하는 파일에있는 경우에도 의미가 있습니다. 이렇게하면 조기에 경고와 오류가 발생합니다. 종종 Common Lisp 개발자는 시스템 도구로 ASDF을 사용합니다. 많은 구현에는 추가 기능이 있습니다.

시스템 도구는 당신에게 당신이 시스템에 사용할 수있는 몇 가지 명령을 제공합니다

  • 부하 : 부하 컴파일 또는 소스 코드를
  • 컴파일에 필요한 (강제)하는 경우 : 필요한 경우 코드를 컴파일 (또는 강제)
  • 컴파일 및로드 : 컴파일 및로드 코드 경우 ...) 필요 (또는 강제

보통 컴파일 또는 코드를로드하는 데 필요한 명령의 작은 금액을 발행합니다. 하지만 모든 것을 다시로드하거나 다시 컴파일하도록 강제 할 수 있습니다.

일반적으로 시스템에는 하위 시스템이있을 수 있습니다. 서브 시스템은 예를 들어 서비스을 컴파일 할 수 있습니다. 코드를 변경하면 서브 시스템에 compile and load을 저장하십시오. ASDF (또는 유사한 도구)가 변경된 파일을 컴파일하고로드합니다.

더 고급 : 다음, 실행중인 서비스을 중지/변경 사항을로드 컴파일 한 후 서비스를 시작하는 시스템 도구에 대한 자신의 명령을 작성합니다.

권장 사항 :

버전이이 중단 이유를 알아가는 가져옵니다.