10

私は、C++とPythonから来たcommon-lispから始めました。画面に画像を表示する以外に何もしない単純なSDLプログラムを実行しようとしています。SLIME内から動作させることができます。問題は、シェルからスクリプトとして実行すると機能しないことです。

私のプログラムは次のようになります。

#!/usr/bin/sbcl --script

(asdf:operate 'asdf:load-op :lispbuilder-sdl)

(defun main ()
  (sdl:with-init ()
    (sdl:window 320 240)
    (sdl:draw-surface (sdl:load-image "image.png"))
    (sdl:update-display)
    (sdl:with-events ()
      (:quit-event () t)
      (:video-expose-event () (sdl:update-display)))))

(main)

これをスクリプトとして実行すると、次のエラーが発生します。

mkg@chisel:~/projects/common-lisp/sandbox$ ./hello-world.lisp 
unhandled ASDF:MISSING-COMPONENT in thread #<SB-THREAD:THREAD "initial thread" RUNNING {AA5E849}>:
  component "lispbuilder-sdl" not found

0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {AAF1EF5}>)[:EXTERNAL]

(...長いバックトレースは省略)

奇妙なことに、私が次のことをすれば、このプログラムはうまく機能します。Emacsでプログラムを開き、別のウィンドウでSLIMEを起動し、SLIMEウィンドウでプログラムの最初の行を入力します。

(asdf:operate 'asdf:load-op :lispbuilder-sdl)

次に、エディターウィンドウで、Cc Ck(コンパイル/ロードファイル)を押します。これにより、期待どおり、image.pngを示すウィンドウがポップアップ表示されます。

シバンスクリプトとして実行すると、これが機能しないのはなぜですか?どうすれば修正できますか?

4

2 に答える 2

8

sbcl のマニュアル ページにある--scriptよう--no-sysinit --no-userinit --disable-debugger --end-toplevel-optionsに、これは初期化ファイルが読み取られないことを意味するため、ASDF レジストリを設定しても設定されず、lispbuilder-sdlシステムを見つけることができません。スクリプト自体でレジストリを設定するか、設定済みのレジストリを使用して実行可能なコアを保存し、デフォルトの sbcl の代わりにそれを呼び出す必要があります。通常、ライブラリをスクリプトにロードする代わりにコアに保存することもできますが、それが Lisp 以外のライブラリやリソースとどのように相互作用するかはよくわかりません。

于 2011-02-06T22:40:12.360 に答える
0

Lisp で開発するときの通常の方法は、ASDFプロジェクトとその依存関係を記述するために を使用することです。次に、簡単にできます(asdf:oos 'asdf:load-op :yourapp)

ほとんどの実装では、実行形式の asdf 定義を生成する方法があります。

于 2011-02-08T10:29:28.340 に答える