如何使Quicklisp可用于从Shebang运行的脚本?



我最近一直在使用Quicklisp,并且在使用Shebangs脚本时遇到了这个小问题。

置>我做了以下操作:

  1. 下载quicklisp withcurl https://beta.quicklisp.org/quicklisp.lisp -o /tmp/quicklisp.lisp
  2. (quicklisp-quickstart:install)一起安装,同时在环境中加载/tmp/quicklisp
  3. 添加Quicklisp init文件使用(ql:add-to-init-file)

问题对于需要Quicklisp(特别是ASDF)的脚本,我可以用sbcl --load ~/quicklisp/setup.lisp --script start.lisp来运行它。但是,当我使用Shebang/usr/bin/env sbcl --script将其作为独立脚本运行时,它会失败,并出现错误,说它无法找到UIOP等内容,除非我在脚本本身中放置以下两行:

(load "~/quicklisp/setup.lisp")
(ql:quickload "asdf")

你可以在这里找到我愚蠢的实验,在这里找到有问题的脚本。

PS:任何提示都会很有帮助的。

PPS:我肯定这是我犯的一个愚蠢的错误,请原谅我。

在这种情况下,您需要:

(require :asdf)
老实说,我也不知道为什么。--script等于--no-sysinit --no-userinit --disable-debugger --end-toplevel-options,所以我们忽略了很多。(这样就加载了quicklisp的设置。lisp似乎也是必需的,因为它不会被.sbclrc加载,Quicklisp就是在这里添加了这个小片段)

这是我在其他环境中需要的设置,例如CI。

我将使用roswell-它使使用公共Lisp代码的独立脚本可用。

我在这里描述了设置roswell。这非常简单。我描述了roswell在系统范围内的安装,以及如何在ubuntu, mac和windows中本地安装roswell。

或者你也可以直接在roswell的网站上查找。

使用roswell的好处是你可以使用任何可以安装roswell的公共Lisp实现,它们是:

Candidates impls for installation are:
abcl-bin
allegro
ccl-bin
clasp-bin
clasp
clisp
cmu-bin
ecl
mkcl
sbcl-bin
sbcl
sbcl-source

不仅仅是sbcl

并且roswell允许使用Common Lisp编写的脚本可以直接从shell调用。

在roswell$ ros ...命令中,quicklisp是可用的。所以$ ros install xxx通常使用quicklisp来安装xxx

使用roswell,您可以通过一个命令(包括您的脚本)从bash中调用任何通用Lisp程序。

看这里的例子:https://roswell.github.io/Roswell-as-a-Scripting-Environment.html

最新更新