6

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

我目前的解决方案如下所示:

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 调用将退出干净?

对于第一种情况,一般捕获没有指定捕获什么,可能会做交易。第二种情况必须能够处理会导致调用低级调试器的错误/错误。

4

1 回答 1

7

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

于 2012-12-21T03:01:08.963 回答