2014-07-06 59 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

相關問題