我通过一个使用必要参数调用sbcl的shellscript来调用我的common-lisp程序,我必须保证无论如何实际程序完成调用都会以some/none输出结束.
我目前的解决方案如下:
sbcl --eval "(unwind-protect
(handler-case
(progn
(declaim #+sbcl(sb-ext:muffle-conditions style-warning))
(let ((*standard-output* (make-broadcast-stream)))
(ql:quickload \"module\"))
(eval (read-from-string \"(package:start)\"))) ;this starts the program
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
Run Code Online (Sandbox Code Playgroud)
但在以下两个szenarios它不会工作:
sbcl --eval "(unwind-protect
(handler-case
(progn
(define-condition bad () ())
(error 'bad))
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
sbcl --eval "(unwind-protect
(handler-case
(progn
(labels ((rek () (rek)))
(rek)))
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
Run Code Online (Sandbox Code Playgroud)
我现在想知道是否有另一种解决方案可以捕获被调用程序的任何可能结果并确保sbcl调用将退出干净?
对于第一种情况,一般情况下没有指明要捕获的东西,可能会做出这笔交易.第二种情况必须能够处理导致低级别debuger被调用的错误/错误.
该--non-interactive开关将确保SBCL不会进入调试器或REPL.它类似于传递--disable-debugger和使用--eval "(sb-ext:quit)".sb-ext:*invoke-debugger-hook*如果您不希望它在发生错误时打印回溯,您也可以自定义.