2011-02-06 62 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定义。