2015-07-19 49 views
2

我开始学习lisp,并正在寻找一种有效的方式来管理我的个人图书馆。如何将多个lisp-fasl文件链接到单个文件中?

所以我认为将我的库编译成单个fasl文件(包含包信息和实际实现)将是有用的,我可以在之后加载(load "lib.fasl")以包含库。问题是,库包含多个* .lisp -files,可以说foo.lispbar.lisp

我分别使用(compile-file "foo.lisp")(compile-file "bar.lisp")分别编译它们。

显然,这将是相当凌乱不必LOAD库的每个文件(即foo.faslbar.fasl)手动时,我想使用它们,所以我寻找类似

(link "foo.fasl" "bar.fasl" :output "lib.fasl") 

(compile-file "foo.lisp" "bar.lisp" :output "lib.fasl") 

以产生单一lib.fasl,我可以然后LOAD

我不想使用核心文件,因为我想能够灵活地组合我的库(这将需要为库的每个可能的组合创建一个单独的核心文件)。

我搜索了SBCL用户手册中的lisp函数和SBCL手册页中的使用CLI的功能,但是我找不到任何东西。

我更喜欢使用SBCL的解决方案,但我也会采取其他措施。

在此先感谢!

+0

在ASDF中,我发现了一个很好的工具来管理库,但我认为这个问题仍然很有趣,因为链接到fasls似乎并不是一项艰巨的任务,而且似乎还没有一种明显的方式来实现它。 – jobach

回答

3

使用cat

$ cat f1.fasl f2.fasl .... > mypackage.fasl 

注意,更常见的方式是创建images

您可能也想探索asdf

+0

谢谢!没想到串联会这样做。正如我上面所说的,图像/核心文件对于发布软件来说似乎很好,但是为了结合许多不同的库,它们有点静态。已经找到ASDF! – jobach

2

用于SBCL的IIRC您只需将FASL文件连接成一个文件。

ASDF 3有一种方法可以从具有所有相关性的系统或系统构建单个FASL文件(请参阅compile-bundle-opmonolithic-compile-bundle-op)。

在其便携库uiop中还有一个功能combine-fasls,它支持多个CL实现。

+0

目前我发现纯ASDF(使用'defsystem',':defsystem-depends-on'和'require')就足够了。使用'monolithic-compile-bundle-op'创建一个与'需要'我的系统和创建映像相矛盾的软件版本'有任何进展吗? – jobach

相关问题