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)
我不知道是否可能,所以任何帮助将不胜感激.
怎么样
(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").