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

hij*_*ian 15 shell automation sbcl common-lisp quicklisp

我目前在Common Lisp中有一个小程序,我希望它作为shell脚本运行.我正在使用SBCL并且完全没问题,所以我宁愿留在这个平台上.:)

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

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

(ql:quickload :cl-fad)
Run Code Online (Sandbox Code Playgroud)

形式,它打破了下一个错误:

package "QL" not found
Run Code Online (Sandbox Code Playgroud)

程序打包在单个源文件中,该文件具有以下标题:

(defpackage :my-package
  (:use :common-lisp)
  (:export :my-main-method))
Run Code Online (Sandbox Code Playgroud)

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

对于这个程序,我目前正在尝试编写启动器脚本,这就是我正在盯着的:

#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)
Run Code Online (Sandbox Code Playgroud)

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

我需要在启动器中添加什么:cl-fad才能正确加载?文档说明使用--script选项SBCL不加载任何init文件,所以我真的需要复制行

#-quicklisp
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))
Run Code Online (Sandbox Code Playgroud)

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

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

Vse*_*kin 16

你正在做的一切正确.

基本上,在你可以使用之前quicklisp,你需要加载它(目前,它没有与SBCL捆绑在一起,虽然它可能会在未来发生变化).有各种方法可以做到这一点.例如,您可以.sbclrc使用quicklisp init 加载您:

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

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

  • 哇,"你做的一切都很正确"......这句话真的很难找,谢谢你,@ Vsevolod.你和Martial的答案都非常好而且很有效,我感到很遗憾,只能回答单一的答案.:)我更喜欢coredumping,它在每个脚本中省了一行,只需很少的准备工作就可以将所有内容整合在一起. (2认同)
  • @hijarian没问题.正如我所说的那样.有很多方法可以解决您的问题.我希望看到更多的答案:) (2认同)

小智 8

创建专用版的核心映像是一个不错的选择.你可以:

  1. 加载quicklispsb-ext:save-lisp-and-die在新图像中.你编写了一个shell/bat脚本,比如说qlsbcl:

    sbcl --core <my-new-image-full-path-location> "$@"
    
    Run Code Online (Sandbox Code Playgroud)
  2. clbuild2http://gitorious.org/clbuild2和运行clbuild lisp.你必须将clrobild符号链接到路径中的二进制目录,如果你quicklisp不在常见的地方,可以稍微调整一些脚本〜/ quicklisp(https://gist.github.com/1485836)或者如果你使用ASDF2(https) ://gist.github.com/1621825).通过这样做,clbuild创建一个新的核心quicklisp,ASDF以及您可以在conf.lisp中添加的任何内容.现在shebang看起来像这样:

    #!/usr/bin/env sbcl --noinform --core <my-clbuild-install-directory>/sbcl-base.core --script
    
    Run Code Online (Sandbox Code Playgroud)

优点clbuild是您可以从shell sbcl(默认情况下)或任何其他现代CL类ccl64实现轻松创建和管理核心和quicklisp安装.混合使用这两种技术(脚本和clbuild)将解决您的问题.