lisp作为shebang脚本与lisp在SLIME中运行 我刚刚开始使用普通LISP,它来自C++和Python。我正在尝试运行一个简单的SDL程序,它除了在屏幕上显示图像之外什么都不做。我可以让它在黏液中工作。问题是,当作为脚本从shell运行时,它将不起作用

lisp作为shebang脚本与lisp在SLIME中运行 我刚刚开始使用普通LISP,它来自C++和Python。我正在尝试运行一个简单的SDL程序,它除了在屏幕上显示图像之外什么都不做。我可以让它在黏液中工作。问题是,当作为脚本从shell运行时,它将不起作用,lisp,sdl,slime,sbcl,shebang,Lisp,Sdl,Slime,Sbcl,Shebang,我的程序如下所示: #!/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 ()

我的程序如下所示:

#!/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]
然后,在编辑器窗口中,我点击C-C-k(编译/加载文件)。这会弹出一个显示image.png的窗口,如预期的那样


当作为shebang脚本运行时,为什么这不起作用?如何修复它?

正如sbcl的手册页所说,
--script
意味着
--no sysinit--no userinit--disable debugger--end top-level options
,这意味着初始化文件不会被读取,因此如果在那里设置ASDF注册表,它就不会被设置,因此找不到
lispbuilder sdl
系统。您需要在脚本本身中设置注册表,或者在已设置注册表的情况下调用它,而不是调用默认的sbcl。通常,您也可以将库保存在核心中,而不是将它们加载到脚本中,但我不太确定这与非Lisp库和资源的交互方式。

在Lisp中开发时,通常的方法是使用
ASDF
来描述项目及其依赖项。然后,您可以轻松地
(asdf:oos'asdf:load op:yourapp)

对于大多数实现,有一种生成可执行表单asdf定义的方法

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