【问题标题】:Struggling with common lisp libraries挣扎于常见的 lisp 库
【发布时间】:2010-09-28 21:06:41
【问题描述】:

我学过scheme并很快掌握了很多,然后用它做了一个项目就好了。从字面上看,我花了几天时间才完成。我现在正在尝试学习 common lisp 来感受一下,现在我真的很努力学习 asdf。如何将它与库一起使用似乎是常识,但我很困惑。我想这是因为大多数 lisp 程序都是在 repl 中制作和运行的,因为一切正常。当我尝试将其编译为可执行文件时,我失去了自己的位置。

有没有人可以给我任何建议或指向我的教程?我真的希望能够制作一个可执行文件来提供给人们,而不必解释如何安装 sbcl 并(要求)它然后运行它。我只是想学习在 lisp 中做一些我无法用 scheme 做的实质性事情。

我想我可以使用方案并使用 ffi 来让 c 库工作,但我没有使用 c 的经验。我只是出于个人原因学习 lisp 的网络开发人员。当然学习一些c和ffi可能不会花这么长时间哈哈。
谢谢

【问题讨论】:

  • 我想帮助你,并在 comp.lang.lisp 上回复你的问题。我的反应不够快吗?
  • 不,哈哈。就好像我把你当生命线一样紧紧抓住,怕你忙,占用你太多时间。所以我在这里发帖看看是否有其他人可以参与可能不在 comp.lang.lisp 上的内容。

标签: lisp scheme common-lisp


【解决方案1】:

我真的很想制作一个 可执行给没有的人 不得不解释如何安装 sbcl 并(要求)然后运行它。

您不需要 ASDF 即可生成“独立”可执行文件。大多数实现都提供了保存可执行映像的方法,但标准中并未提及如何执行此操作(以及是否要提供)。

通常,您会将代码加载到正在运行的映像中,然后“转储”该映像。

例如,在 SBCL 中,您可以使用 sb-ext:save-lisp-and-die; CCL 有ccl:save-application。您必须查看实现的文档才能了解如何操作。

我现在没有 SBCL,但是这个最小的例子应该可以工作(未经测试):

(defun do-it () (format t "hello world~%"))
(sb-ext:save-lisp-and-die "hello" :toplevel #'do-it :executable t)

这是一个使用 CCL 的工作示例:

Welcome to Clozure Common Lisp Version 1.6-dev-r14287M-trunk  (LinuxX8632)!
? (defun do-it () (format t "hello world~%"))
DO-IT
? (ccl:save-application "hello" :toplevel-function #'do-it :prepend-kernel t)
[danlei@susi ~/build/ccl]% ./hello
hello world

这些可执行映像的大小可能相当大,除非您的实现提供了类似于 tree-shaker 的东西,但我认为现在这应该不是问题。

您可以在another SO question about this topic 中找到 clisp 的详细示例。

ASDF Documentation

【讨论】:

  • 这是否回答了您的问题?我不太确定我是否理解正确,因为你说过,一切都可以从 REPL 中运行。如果你可以在 REPL 中加载你的库,我上面描述的是获取独立可执行文件的方法,然后你可以将其分发给你的用户。如果您希望它们具有正常的 REPL,但您的库已经存在于图像中,只需省略 :toplevel(-function) 关键字参数。
【解决方案2】:

这不是您所要求的,但它可能会有所帮助。

我也永远无法让 ASDF 很好地工作。有人将我指向clbuild,这是解决类似问题的一种稍微不同的方法。到目前为止,它对我来说效果很好。

【讨论】:

  • clbuild 使用 ASDF 加载所有内容。你是说 asdf-install 吗?
猜你喜欢
  • 2023-04-06
  • 2014-08-30
  • 1970-01-01
  • 2015-08-24
  • 2021-08-05
  • 2012-01-06
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多