如何保证从sbcl中彻底退出

时间:2012-12-21 02:21:34

标签: common-lisp sbcl

我通过一个使用必要参数调用sbcl的shellscript调用我的common-lisp程序,我必须保证无论如何实际程序完成调用都会以一些/无输出结束。

我目前的解决方案如下:

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))"

但在接下来的两个版本中它不会起作用:

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))"

我现在想知道是否有另一个解决方案可以捕获被调用程序的任何可能结果并确保sbcl调用将退出干净?

对于第一种情况,一般情况下,没有指明要捕获的东西,可能会做出这笔交易。第二种情况必须能够处理导致低级别debuger被调用的错误/错误。

1 个答案:

答案 0 :(得分:6)

--non-interactive开关将确保SBCL永远不会进入调试器或REPL。它与传递--disable-debugger和使用--eval "(sb-ext:quit)"类似。如果您不希望在发生错误时打印回溯,也可以自定义sb-ext:*invoke-debugger-hook*