编译文件,就好像其内容在指定的包中一样

Mar*_*ark 4 lisp prototyping compilation common-lisp package

我在Common Lisp上编写了一种DSL.该域非常奇怪,我的语言与Common Lisp本身完全不同.我已将所有界面放入包中foo:

(defpackage :foo
  (:use     :common-lisp
            :internal-machinery)
  (:shadow  :in-package
            :*packages*))
Run Code Online (Sandbox Code Playgroud)

包间的切换是超越语言的概念,所以我被遮蔽的符号已停用这项能力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
Run Code Online (Sandbox Code Playgroud)

我不知道是否可能,所以任何帮助将不胜感激.

sds*_*sds 6

怎么样

(defun compile-stuff (filename)
  (let ((*package* (find-package '#:foo)))
    (compile-file filename)))
Run Code Online (Sandbox Code Playgroud)

PS.正如Rainer在评论中提到的那样,如果您向用户提供REPL,则用户更换软件包并不安全(cl:in-package "CL-USER").