shell - CL程序作为shell脚本调用时如何使用quicklisp?

标签 shell automation common-lisp sbcl quicklisp

我目前在 Common Lisp 中有一个小程序,我想将其作为 shell 脚本运行。我正在使用 SBCL 并且完全没问题,所以我更愿意留在这个平台上。 :)

我知道 --script选项,它完美无缺,除了 (ql:quickload)形式。

我的程序使用 CL-FAD ,它通过 ql:quickload 加载(我想我应该提到它是来自 quicklisp 的包加载功能)。当脚本运行到评估

(ql:quickload :cl-fad)

形式,它因下一个错误而中断:
package "QL" not found

程序打包在单个源文件中,该文件具有以下标题:
(defpackage :my-package
  (:use :common-lisp)
  (:export :my-main-method))

它是简单的自动化可执行文件,所以我决定(可能是错误的)不编写任何 ASDF 系统。它导出应该在没有任何参数的情况下运行的单个函数。

对于这个程序,我目前正在尝试编写启动程序脚本,这就是我所关注的:
#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)

这三行(不包括shebang)是我想要自动化的。正如我在文档中读到的那样,带有这个shebang的脚本可以被称为简单的./script.lisp ,它确实做到了这一点......与之前描述的错误。

我需要在 :cl-fad 的启动器中添加什么正确加载?文档指出,与 --script选项 SBCL 不加载任何初始化文件,所以我真的需要复制粘贴这些行吗?
#-quicklisp
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

(其中 ql:add-to-init-file 添加到 .sbclrc),到我的启动器脚本?
也许我的程序设置中有一些深层的架构缺陷?

是的,当我在 sbcl 本身中输入我尝试在 REPL 中自动化的行时,程序按预期运行。

最佳答案

你做的一切都是正确的。

基本上,在你可以使用之前quicklisp ,您需要加载它(目前,它未与 SBCL 捆绑,尽管将来可能会更改)。有多种方法可以做到。例如,您可以加载您的 .sbclrc使用 quicklisp init:

#!/usr/bin/sbcl --script
(load ".sbclrc")
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)

或者像您建议的那样,将这些行粘贴到您的脚本中。

关于shell - CL程序作为shell脚本调用时如何使用quicklisp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229526/

相关文章:

python - 如何使用 Automator 运行 python 脚本以查看调试/错误消息?

python - 等待未知弹窗

recursion - LISP 迭代到递归

recursion - 在 Lisp 中合并列表

linux - 管道有效,但 bash 脚本无效

shell - 如何从变量中删除小数?

linux - 有关在文章/Web 2.0 网站上创建帐户/发帖的自动化过程的帮助

linux - Lynx的自动化

function - 从 lisp 中的整数列表中消除每次出现的 x

linux - 在 Shell 脚本中打印前一天和后一天的文件路径