【问题标题】:lisp as a shebang script vs lisp running in SLIMElisp 作为 shebang 脚本与在 SLIME 中运行的 lisp
【发布时间】:2011-06-22 07:50:51
【问题描述】:

我刚开始使用 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 脚本运行时这不起作用?我该如何解决?

【问题讨论】:

    标签: lisp sdl slime sbcl shebang


    【解决方案1】:

    正如 sbcl 的手册页所说,--script 暗示 --no-sysinit --no-userinit --disable-debugger --end-toplevel-options,这意味着不读取初始化文件,因此如果您在那里设置 ASDF 注册表,则它不会设置,因此找不到 @ 987654324@系统。您需要在脚本本身中设置注册表,或者 save an executable core 已经设置了注册表并调用它而不是默认的 sbcl。通常您也可以将库保存在核心中,而不是在脚本中加载它们,但我不太确定它如何与非 Lisp 库和资源交互。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        • 2011-11-08
        • 1970-01-01
        • 2021-09-12
        • 2013-06-27
        • 2011-05-24
        相关资源
        最近更新 更多