2011-02-06 53 views
9

我剛剛開始使用common-lisp,來自C++和Python。我正在嘗試運行一個簡單的SDL程序,除了在屏幕上顯示圖像外別無它物。我可以在SLIME中使用它。問題是,從shell作爲腳本運行時,它不起作用。lisp作爲shebang腳本vs lisp在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) 

當我運行這是一個腳本,我得到以下錯誤:

[email protected]:~/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打開程序,在另一個窗口啓動泥,並在泥窗口,我進入程序的第一行:

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

然後,在編輯器窗口,我打抄送CK(編譯/負載文件)。如預期的那樣,彈出一個顯示image.png的窗口。

爲什麼在作爲shebang腳本運行時這不起作用?我該如何解決它?

回答

7

至於SBCL手冊頁說,--script意味着--no-sysinit --no-userinit --disable-debugger --end-toplevel-options,這意味着初始化文件不被讀取,所以如果你設置了航空自衛隊註冊表那裏不成立,因此它無法找到lispbuilder-sdl系統。您需要在腳本本身中設置註冊表,或者在註冊表已設置的情況下設置註冊表,並調用該註冊表而不是默認的sbcl。通常,您還可以將庫保存在覈心中,而不是將它們加載到腳本中,但我不太確定它是如何與非Lisp庫和資源進行交互的。

0

在lisp中開發的常用方法是使用ASDF來描述項目及其依賴關係。那麼,你可以很容易(asdf:oos 'asdf:load-op :yourapp)

對於大多數實現有一種方法來生成可執行形式asdf定義。