我已經在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
我不知道是否有可能或沒有,所以任何幫助,將不勝感激。
請注意,用戶可以隨時調用'(cl:in-package「FOO」)'。 –