私は現在、Common Lispに小さなプログラムを持っており、それをシェルスクリプトとして実行したいと思っています。私はSBCLを使用しており、これで完全に問題ないので、このプラットフォームにとどまるのを好みます。:)
私は--script
オプションについて知っています、そしてそれはフォームを除いて完璧に動作します(ql:quickload)
。
私のプログラムは、ロードスルーするCL-FADを使用しています( quicklispql:quickload
からのパッケージロード関数であることに言及する必要があると思います)。スクリプトが実行されて評価されるとき
(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)
この3行(シェバンは数えません)は、私が自動化したいものです。ドキュメントを読んだように、このシバンを使用したスクリプトは単純なものと呼ぶことができますが./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)))
(これql:add-to-init-file
は.sbclrcに追加されます)、ランチャースクリプトに?たぶん、プログラムのセットアップにいくつかの深いアーキテクチャ上の欠陥がありますか?
はい、REPLで自動化しようとしている行をsbcl自体に入力すると、プログラムは期待どおりに実行されます。