如何确保从SBCL干净退出

7
我正在通过一个调用了必要参数的shell脚本来调用我的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 调用将干净退出?
对于第一个场景,一个不指定要捕获什么的通用 catch 可能会起到作用。第二个场景必须能够处理导致调用低级别调试器的错误或 bug。
1个回答

7

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接