【问题标题】:how to guarantee a clean exit from sbcl如何保证干净地退出 sbcl
【发布时间】:2012-12-21 02:21:33
【问题描述】:

我通过一个 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 调用将退出干净?

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

【问题讨论】:

    标签: common-lisp sbcl


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多