我目前在 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 的脚本可以被称为 simple ./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 中自动化的行时,程序按预期运行。