macos - 由于 sdl_delay,lispbuilder-sdl 在 osx 上不工作

标签 macos lisp sdl common-lisp

我的操作系统是OS X 10.11.5,代码是用emacs+slime+sbcl
我使用命令加载了 lispbuilder-sdl:

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

然后将示例代码复制到here

(sdl:with-init ()
  (sdl:window 320 240)
  (sdl:update-display)
  (sdl:with-events ()
     (:quit-event () t)))

但什么也没发生,所以我输入“C-c C-c”来终止进程, 它显示了这样的错误:

Restarts:
0: [CONTINUE] Continue from break.
1: [RETRY] Retry SLIME REPL evaluation request.
2: [*ABORT] Return to SLIME's top level.
3: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1003FC0003}>)

Backtrace:
0: ("bogus stack frame")
1: ("foreign function: SDL_Delay")
2: (LISPBUILDER-SDL-CFFI::SDL-DELAY 27)
3: ((SB-PCL::EMF LISPBUILDER-SDL::PROCESS-TIMESTEP) #<unavailable argument> #<unavailable argument> #<LISPBUILDER-SDL:FPS-FIXED {10059F6E43}> #<FUNCTION (LAMBDA NIL :IN #:DROP-THRU-TAG-1) {10056C6A0B}>)
4: ((:METHOD LISPBUILDER-SDL::PROCESS-TIMESTEP :AROUND (LISPBUILDER-SDL::FPS-MANAGER T)) #<LISPBUILDER-SDL:FPS-FIXED {10059F6E43}> #<FUNCTION (LAMBDA NIL :IN #:DROP-THRU-TAG-1) {10056C6A0B}>) [fast-metho..
5: ((LAMBDA ()))
6: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LISPBUILDER-SDL:WITH-INIT NIL (LISPBUILDER-SDL:WINDOW 320 240) (LISPBUILDER-SDL:UPDATE-DISPLAY) (LISPBUILDER-SDL:WITH-EVENTS NIL (:QUIT-EVENT NIL T))) #<NULL-LEXENV>)
7: (EVAL (LISPBUILDER-SDL:WITH-INIT NIL (LISPBUILDER-SDL:WINDOW 320 240) (LISPBUILDER-SDL:UPDATE-DISPLAY) (LISPBUILDER-SDL:WITH-EVENTS NIL (:QUIT-EVENT NIL T))))

有没有人可以帮我解决这个错误?

最佳答案

我试图重现您的示例 (Linux/SBCL)。第一:

(ql:quickload :lispbuilder-sdl)

然后:

(sdl:with-init ()
  (sdl:window 320 240)
  (sdl:update-display)
  (sdl:with-events ()
    (:quit-event () t)))

这会在 REPL 挂起(如预期)时显示一个空窗口,直到我关闭窗口并可以再次使用 REPL。但是,如果我在显示窗口时执行 C-c C-c,那么我将获得类似于您的堆栈跟踪:

Interrupt from Emacs
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [CONTINUE] Continue from break.
 1: [RETRY] Retry SLIME REPL evaluation request.
 2: [*ABORT] Return to SLIME's top level.
 3: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1003498033}>)

Backtrace:
  0: ("bogus stack frame")
  1: ((SB-PCL::EMF LISPBUILDER-SDL::PROCESS-TIMESTEP) #<unavailable argument> #<unavailable argument> #<LISPBUILDER-SDL:FPS-FIXED {1006F962A3}> #<FUNCTION (LAMBDA NIL :IN #:DROP-THRU-TAG-1) {1006F95F0B}>)
  2: ((:METHOD LISPBUILDER-SDL::PROCESS-TIMESTEP :AROUND (LISPBUILDER-SDL::FPS-MANAGER T)) #<LISPBUILDER-SDL:FPS-FIXED {1006F962A3}> #<FUNCTION (LAMBDA NIL :IN #:DROP-THRU-TAG-1) {1006F95F0B}>) [fast-metho..
  3: ((LAMBDA ()))
  4: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LISPBUILDER-SDL:WITH-INIT NIL (LISPBUILDER-SDL:WINDOW 320 240) (LISPBUILDER-SDL:UPDATE-DISPLAY) (LISPBUILDER-SDL:WITH-EVENTS NIL (:QUIT-EVENT NIL T))) #<NULL-LEXENV>)
  5: (EVAL (LISPBUILDER-SDL:WITH-INIT NIL (LISPBUILDER-SDL:WINDOW 320 240) (LISPBUILDER-SDL:UPDATE-DISPLAY) (LISPBUILDER-SDL:WITH-EVENTS NIL (:QUIT-EVENT NIL T))))
 --more--

但是,一切都按预期工作,因为我可以选择继续执行或中止。这就是中断的用途。

我的猜测是一切正常,但您看不到窗口。我不知道为什么,不幸的是我没有使用 OS X 的经验。也许如果你尝试实际显示一些东西(见下文),如 SDL window does not show 中的建议,它可以工作。 这是一个绘制内容的示例:

(sdl:with-init ()
  (sdl:window 320 240)
  (sdl:update-display)
  (sdl:with-events ()
    (:quit-event () t)
    (:idle (sdl:fill-surface sdl:*white*)
           (sdl:update-display))))

关于macos - 由于 sdl_delay,lispbuilder-sdl 在 osx 上不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38418427/

相关文章:

Python 使用 selenium 切换浏览器焦点

lisp - (Common lisp) 扁平化和传递列表

dictionary - 创建一个函数来配对 2 个列表中的相应元素

emacs - Emacs 编辑器的添加/编辑功能

c++ - SDL TTF 库内存泄漏(每帧创建和释放曲面)

c++ - 我的 SDL2 程序需要哪些二进制文件才能在另一台未安装 SDL2 的计算机上运行

c++ - SDL/c++ 按住鼠标按钮绘图

macos - 在 Mac 上安装 Python3.6 和 Python3.7

macos - Swift - 如何在 OS X 中定义核心数据上下文

mysql - Excel Mac 2016,在 VBA 函数内调用时 ListObject 不起作用