6

私は必要なパラメータでsbclを呼び出すシェルスクリプトを介して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))"

しかし、次の2つのシナリオでは、機能しません。

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呼び出しがクリーンに終了することを保証する別の解決策があるかどうか疑問に思っていますか?

最初のシナリオでは、何をキャッチするかを指定しない一般的なキャッチが、おそらく取引を行います。2番目のシナリオは、低レベルのデバッガーが呼び出される結果となるバグ/エラーに対処できる必要があります。

4

1 に答える 1

7

スイッチは、--non-interactiveSBCLがデバッガーまたはREPLに入らないようにします。これは、を渡し--disable-debuggerて使用するのと似てい--eval "(sb-ext:quit)"ます。sb-ext:*invoke-debugger-hook*エラーが発生した場合にバックトレースを出力したくない場合は、カスタマイズすることもできます。

于 2012-12-21T03:01:08.963 に答える