2014-07-06 12 views
4

Common Lisp 위에 일종의 DSL을 작성했습니다. 도메인은 매우 이상하며 내 언어는 Common Lisp과는 완전히 다르게 보입니다. 나는 패키지 foo에 모든 인터페이스를 넣었습니다 : 패키지 사이내용이 지정된 패키지에있는 것처럼 파일을 컴파일합니다.

(defpackage :foo 
    (:use  :common-lisp 
      :internal-machinery) 
    (:shadow :in-package 
      :*packages*)) 

전환이 언어의 개념을 넘어, 그래서 문자를 in-package*package*를 미행하여이 기능을 비활성화했습니다. 이제 내 언어의 사용자 (프로그래머)가 패키지를 전환 할 수 없습니다. 벌금.

명백히,이 언어로 작성된 프로그램을 컴파일하기 위해 Common Lisp 컴파일러를 사용하고 싶습니다. 기능 compile-file는 나를 위해 괜찮아 보입니다. 그러나 어려움이 있습니다.

마치 내 내용이 내 foo 패키지 안에있는 것처럼 파일을 컴파일하려고합니다. 프로토 타입 언어로 된 모든 프로그램 상단에 (in-package :foo)을 두는 것은 바람직하지 않은 옵션입니다. 가능 여부의 경우

(in-package :internal-machinery) 

(defun compile-stuff (filename) 
    (in-package :foo)     ; it will have no effect, because 
            ; this macro must be top level form 

    (compile-file filename)   ; other options are omitted 

    (in-package :internal-machinery)) ; no way, even if it were top level 
            ; form, in-package is shadowed 

나는 아무 생각이 없다, 그래서 어떤 도움을 주시면 감사하겠습니다 :

는 상황이 더 악화하기 위해, 나는 함수의 내부 파일을 컴파일해야합니다.

+2

사용자는 언제나'(cl : in-package "FOO")'를 호출 할 수 있습니다. –

답변

6

어떻게

(defun compile-stuff (filename) 
    (let ((*package* (find-package '#:foo))) 
    (compile-file filename))) 

에 대한 PS. Rainer가 언급 한 바와 같이 REPL을 사용자에게 제공하면 사용자가 (cl:in-package "CL-USER")으로 패키지를 바꾸지 않아도 이 아닌이됩니다.

+0

작동! 나는 그것이 그렇게 단순하거나 불가능하다는 것을 알았다. 고마워요! :-) – Mark