1

次のような再起動に沿って手をつなぐことは可能ですか?

(handler-bind ((simple-error #'(lambda(condition)
                       (write condition)
                       (invoke-restart 'alle condition))))
    (restart-case
      (restart-case
        (error 'simple-error)
       (next (err)))
      (alle (err) (invoke-restart 'next))))

これは現在、

No restart NEXT is active.
   [Condition of type SB-INT:SIMPLE-CONTROL-ERROR]

「just-log-all-conditions」のような一般的な再起動を実装できるようにしたいと思います。これにより、式内で通知された条件に対して正しい再起動が呼び出されます。

4

2 に答える 2

1

それが本当にやりたいことかどうかを確認するかもしれません...通常は、ハンドラーに最適な再起動を選択させます。ハンドラーは、使用可能なすべての再起動を確認します。再起動から再起動への移行は珍しいことです。私見では。また、ある条件では「正しい」再起動はありません。いくつかの再起動が利用可能で便利な場合があります。これは、ユーザーがプログラムまたはインタラクティブに決定できます。再起動は、いくつかの異なる条件でも役立つ場合があります。

Common Lisp Condition Systemには、いくつかの基本的な概念があります。

  • 条件、通常はCLOSクラスとして実装されます

  • 条件オブジェクトのシグナリング。これは通常、ユーザーコードで行われます。

  • 状態の処理。条件に基づいて、ハンドラーが選択されて呼び出されます。ハンドラーが実行されているとき、ハンドラーは何をすべきかを検査して決定できます。ハンドラーは通常、条件の処理を拒否するか、使用可能な再起動の1つを選択します。通常の開発環境では、これには再起動の提示とユーザーへの選択の要求が含まれる場合があります。

  • 再起動します。その後、再起動は状態から抜け出す責任があります。再起動への制御の転送により、エラーコンテキストから抜け出します。'UNWIND-PROTECT'を介してコードの実行を強制できます。再起動すると、状態が通知されたコンテキストはなくなります。

つまり、ハンドラーだけが使用可能なすべての再起動を確認し、ハンドラーは次のハンドラーに制御を移すこともできます。

再起動から再起動へのジャンプは、実際にはこのモデルの一部ではありません。

条件システムのアイデアの背景については、Kent Pitmanによるこのテキストを参照してください:Lisp言語ファミリの条件処理

于 2012-08-23T07:27:47.870 に答える
0

次のように、すべてを逆の順序で指定する必要があります。

(restart-case
    (restart-case
        (handler-bind ((simple-error #'(lambda(condition)
                                         (write condition)
                                         (invoke-restart 'alle condition))))
          (error 'simple-error))
      (alle (err) (invoke-restart 'next)))
  (next () #|do nothing|#))

詳細については、 CLHSを参照してください。

于 2012-08-21T18:01:50.510 に答える