我的操作系统是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/