我刚开始使用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)
当我将其作为脚本运行时,出现以下错误:
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)
然后,在编辑器窗口中,我点击了C-c C-k(编译/加载文件)。这会弹出一个显示image.png的窗口,如预期的那样。
为什么在作为shebang脚本运行时不起作用?我该如何解决?
答案 0 :(得分:7)
正如sbcl的手册页所说,--script
暗示--no-sysinit --no-userinit --disable-debugger --end-toplevel-options
,这意味着不会读取初始化文件,因此如果您在那里设置ASDF注册表,则不会设置它,因此它找不到lispbuilder-sdl
系统。您需要在脚本本身中设置注册表,或者在已设置注册表的情况下设置save an executable core并调用该注册表而不是默认的sbcl。通常你也可以在核心中保存库而不是在脚本中加载它们,但我不太确定它与非Lisp库和资源的交互方式。
答案 1 :(得分:0)
在lisp中开发时的常用方法是使用ASDF
来描述项目及其依赖项。然后,您可以轻松(asdf:oos 'asdf:load-op :yourapp)
。
对于大多数实现,有一种生成可执行形式asdf定义的方法。