lisp作为shebang脚本vs在SLIME中运行的lisp

Sup*_*ric 9 lisp sdl sbcl slime shebang

我刚开始使用common-lisp,它来自C++和Python.我正在尝试运行一个简单的SDL程序,除了在屏幕上显示图像之外什么都不做.我可以在SLIME中使用它.问题是,从shell作为脚本运行时它将无法工作.

我的程序看起来像这样:

#!/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)
Run Code Online (Sandbox Code Playgroud)

当我将其作为脚本运行时,我收到以下错误:

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]
Run Code Online (Sandbox Code Playgroud)

(...长回溯省略)

奇怪的是,如果我执行以下操作,此程序可以正常工作.我在Emacs中打开程序,在另一个窗口中启动SLIME,在SLIME窗口中,我输入程序的第一行:

(asdf:operate 'asdf:load-op :lispbuilder-sdl)
Run Code Online (Sandbox Code Playgroud)

然后,在编辑器窗口中,我点击了Cc Ck(编译/加载文件).这会弹出一个显示image.png的窗口,如预期的那样.

为什么在作为shebang脚本运行时不起作用?我该如何解决?

Ram*_*ren 7

正如sbcl的手册页所示,--script暗示--no-sysinit --no-userinit --disable-debugger --end-toplevel-options,这意味着不会读取初始化文件,因此如果您在那里设置ASDF注册表,则不会设置它,因此无法找到lispbuilder-sdl系统.您需要在脚本本身中设置注册表,或者使用已设置的注册表保存可执行内核并调用该注册表而不是默认的sbcl.通常你也可以在核心中保存库而不是在脚本中加载它们,但我不太确定它与非Lisp库和资源的交互方式.