16

私は現在、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自体に入力すると、プログラムは期待どおりに実行されます。

4

2 に答える 2

18

あなたはすべてを正しくやっています。

基本的に、を使用する前に、それquicklispをロードする必要があります(現在、SBCLにはバンドルされていませんが、将来変更される可能性があります)。それを行うにはさまざまな方法があります。たとえば.sbclrc、quicklispinitを使用してをロードできます。

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

または、提案したように、これらの行をスクリプトに貼り付けます。

于 2012-02-10T19:55:37.530 に答える
8

コアイメージの専用バージョンを作成することは良いオプションです。してもいいです:

  1. 新しい画像をロードquicklispします。たとえば、次のようなsb-ext:save-lisp-and-die名前のシェル/バットスクリプトを記述します。qlsbcl

    sbcl --core <my-new-image-full-path-location> "$@"
    
  2. http://gitorious.org/clbuild2で取得clbuild2し、を実行します。clbuildをパス内のバイナリディレクトリにシンボリックリンクし、一般的な場所にいない場合、またはhttps://gist.github.com/1485836)を使用する場合は、いくつかのスクリプトを微調整する必要があります。 ://gist.github.com/1621825)。そうすることで、、およびconf.lispに追加できるすべてのものを使用して新しいコアを作成します。これで、シェバンは次のようになります。clbuild lispquicklispASDF2clbuildquicklispASDF

    #!/usr/bin/env sbcl --noinform --core <my-clbuild-install-directory>/sbcl-base.core --script
    

の利点は、 (デフォルトで)または他の最新のCLのような実装のclbuildために、シェルからコアおよびクイックリストのインストールを簡単に作成および管理できることです。2つの手法(スクリプトと)を組み合わせると、問題が解決します。sbclccl64clbuild

于 2012-02-10T21:58:00.900 に答える