【问题标题】:How do I link multiple lisp-fasl files into a single file?如何将多个 lisp-fasl 文件链接到一个文件中?
【发布时间】:2015-10-08 16:36:46
【问题描述】:

我开始学习 lisp 并正在寻找一种有效的方式来管理我的个人库。

所以我认为将我的库编译成单个 fasl 文件(包含包信息和实际实现)会很有用,然后我可以使用 (load "lib.fasl") 加载以包含库。问题是,该库由多个 *.lisp 文件组成,比如说 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 的解决方案,但我也会采用其他方法。

提前致谢!

【问题讨论】:

  • 在 ASDF 中我找到了一个很好的库管理工具,但我认为这个问题仍然很有趣,因为链接到 fasls 似乎并不是一项艰巨的任务,而且似乎仍然没有明显的方法。

标签: compilation load common-lisp sbcl


【解决方案1】:

IIRC 对于 SBCL,您只需将 FASL 文件连接到一个文件中。

ASDF 3 有一种方法可以在系统或具有所有依赖项的系统之外构建单个 FASL 文件(请参阅 compile-bundle-opmonolithic-compile-bundle-op)。

在它的可移植库uiop中还有一个函数combine-fasls,它支持多种CL实现。

【讨论】:

  • 目前我发现普通的 ASDF(使用 defsystem:defsystem-depends-onrequire)就足够了。使用monolithic-compile-bundle-op 创建与require我的系统并创建映像相矛盾的软件版本有什么进步吗?
【解决方案2】:

使用cat:

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

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

您可能还想探索asdf

【讨论】:

  • 谢谢!没想到串联会做。正如我上面所说,图像/核心文件似乎适合发布软件,但为了组合许多不同的库而有点静态。已经找到 ASDF!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2020-06-28
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多