2012-01-03 1 views
3

두 개의 분리 된 파일로 두 개의 함수를 작성했습니다.이 파일은 A.lisp 및 B.lisp 파일로 간주됩니다. 두 파일 모두 주 프로그램 테스트 및 A.lisp에 대한 코드는 B.lisp에서 함수를 호출합니다. 즉, A.lisp에서 load 메서드를 직접 사용하면 B.lisp에서 메인 코드가 실행되지만 이는 일어나지 않아야합니다. 그리고이 파일들은 제 의견으로는 패키지처럼 사용하기에는 너무 작습니다.Python의`if __name__ == "__main __":`Common Lisp에있는 내용이 있습니까

Common Lisp에 Python의 if __name__ == "__main__": 항목이 있습니까? 이 조건에 포함 된 최상위 코드는 현재 파일이 주 모듈, 즉 실행중인 프로그램이지만 라이브러리로 가져온 경우에만 실행됩니다.

+0

나는 [Clojure에 관한 비슷한 질문] (http://stackoverflow.com/questions/973106/what-is-the-clojure-equivalent-of-the-python-idiom-if-name-main) 커먼 리스프 (Common Lisp)보다는 오히려 도움이 될만한 답변, 특히 현재 최고 평점을 받고있는 답변을 찾을 수 있습니다. –

+0

감사합니다, 팀! 정말 도움이됩니다. – lastland

답변

6

패키지는 기호의 네임 스페이스입니다. 그들은 코드를 로딩하거나 컴파일하는 것에 대해 아무 말도하지 않습니다.

Common Lisp에는 라이브러리, 모듈 또는 ANSI Common Lisp 표준의 'main'모듈/루틴과 같은 개념이 없습니다. 표준에서는 두 개의 루틴 인 PROVIDEREQUIRE을 정의합니다. 그러나 그것들은 잘 규정되어 있지 않습니다.

대부분의 응용 프로그램과 라이브러리는 '시스템'도구를 사용하여 코드를 구성, 지정, 컴파일 및로드합니다.

ASDF이라는 '무료'버전이 있습니다. '다른 시스템 정의 기능'. 대부분의 응용 프로그램 유형에는 ASDF와 같은 도구가 유용합니다. 기본 응용 프로그램의 경우 COMPILE-FILELOAD과 같은 표준 함수를 사용하여 직접 도구를 작성할 수 있습니다.

Nick Levine은 ASDF (그의 버려진 Lisp 도서 프로젝트의 일부)에 대한 자습서를 작성했습니다 : Systems.

몇 가지 Lisp 구현에는 응용 프로그램 (예 : Clozure Common Lisp으로 작성된 Mac OS X 응용 프로그램)을 만드는 데 더 많은 기능이 있습니다.

2

최상위 양식이 평가됩니다.

은 다음 예에서와 같이 주요 기능을 정의 할 수 있습니다, 당신은 당신이 원하는대로 그 함수를 호출 할 수 있습니다

a.lisp :

(defun main() 
    ...)

b.lisp :

(load "a.lisp") 
(main)
+0

하지만 A.lisp을 가끔씩 일부 테스트 작업을 위해 실행하려면 어떻게해야합니까? – lastland

+0

a.lisp 및 b.lisp에는 반드시 진입 점이 있어야합니다. – sbenitezb

+0

하지만 A.lisp에서 main 함수를 실행할 수 있어야만 혼자서 실행하고 싶습니다. 메인의 함수 호출이 B.lisp에만 존재하는 경우 이것을 어떻게 할 수 있습니까? – lastland

1

파이썬에서 작동하는 방식을 모르지만 파일이인 것처럼 보입니다.은 모듈이고 두 개의 파일은 두 개의 별개 모듈입니다. 이것은 Common Lisp의 경우는 아닙니다. 패키지를 정의하지 않은 경우 load 파일을 사용하면 의 모든 정의를 현재 패키지 (CL-USER은 기본값 인 )에서 사용할 수 있습니다. 코드를 REPL에 붙여 넣은 경우가 더 좋습니다.

그러나 패키지는 사용하기가 어렵지 않습니다. A.lisp에서

:

(defpackage foo 
    (:use #:cl) 
    (:export main)) 

(in-package :foo) 

(defun main() 
    (do-some-stuff) 
    (baz:main some-args)) 

B.lisp에서 :

(defpackage baz 
    (:use #:cl) 
    (:export main)) 

(in-package :baz) 

(defun main (some-args) 
    (do-some-stuff)) 

당신은 읽을 수 The Complete Idiot's Guide to Common Lisp PackagesPCL chapter on packages.

4

이디엄은 파이썬에 매우 한정적이며, 파이썬 공동체의 일부 사람들조차도 테스트 코드 나쁜 스타일로 사용하는 것을 고려합니다.

REPL에서 대화 형 개발을 강조하는 Common Lisp의 경우 실제로 테스트를 실행할 때마다 전체 파일을 다시로드해야하는 단점이 있습니다. 테스트를 최상위 레벨이 아닌 함수 정의에두면 더 효과적입니다.

+0

그래서'(load 'myfile)'이 아닌'clisp myfile.lisp'을 사용하여 파일을 실행할 때만 실행되는 코드를 작성할 방법이 없습니까? – zstewart

+0

스크립트를 평가할 때 명령 줄에서 호출하는 특수 함수로 파일을 스크립트로 실행할 때 평가할 코드 만 넣을 수 있습니다. CLISP가 아닌 SBCL 만 설치되어 있기 때문에 CLISP로이 작업을 정확하게 수행 할 수 있는지 테스트 할 수 없습니다. SBCL로 할 수 있습니다. sbcl --noinform --load myfile.lisp --eval '(main)' --quit' 물론 코드가 최상위 레벨 일 때 할 수있는'sbcl --script myfile.lisp'보다 더 좋은 시간입니다. 그래서 더 쉬운 방법은 스크립트를 라이브러리 부분을로드하는 추가 파일로 만드는 것입니다. –

관련 문제