2

わかりました、この質問を書き直す必要があります。

もし私が行くならば:

CL-USER> whatever

デバッガーフレームでこれを取得します:

The variable WHATEVER is unbound.
   [Condition of type UNBOUND-VARIABLE]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {C0C6CF9}>)
 ...

したがって、私はこれを行うことができるはずです:

(handler-case
    whatever
  (unbound-variable (e) (invoke-restart 'retry)))

それでも、次の結果が得られます。

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

私は何が欠けていますか?

ABORT 再試行は正しく機能します。指摘してくれた hans と Svante に感謝します。その他 - 再試行、スレッドの終了など - すべてエラーになります。

また、デバッガーで e を押して、INVOKE-RESTART を直接実行してみました。1 つの例外を除いて同じ結果です。この回答の低レベルの例は、私が思うように機能します。

Eval in frame (COMMON-LISP-USER)> (invoke-restart 'go-on)

文句なしにプロンプ​​トに戻ります。高レベルの例は、再起動メニューから手動で選択した場合にのみ正しく再起動します。

4

4 に答える 4

3

出力のリスタート1の前にある星印は、このリスタートがSLIMEの[q]uitコマンドによって呼び出されることを示しています。再起動の名前は'ABORTであるため、再起動を呼び出すには、次を使用します。

(handler-case
    whatever
  (unbound-variable (e) (invoke-restart 'abort)))
于 2013-03-19T06:04:23.523 に答える
2

を実行するcompute-restartsと、再起動retryが実際にはswankパッケージの内部にあることがわかります。

(#<RESTART SWANK::RETRY {100462AE63}> #<RESTART ABORT {1003E4C2B3}>
 #<RESTART ABORT {1007138083}>)

このようにそれをと認定するとswank::retry、期待される動作が得られます。

于 2013-03-20T14:41:19.140 に答える
2

retry同じ変数の評価を再試行するだけです。バインドしていないため、まだバインドされていません。あなたはより良い運を持っているかもしれません

(handler-case
    whatever
  (unbound-variable (e)
    (setq whatever 42)
    (invoke-restart 'swank::retry)))

42を返す必要があります。

于 2013-03-20T14:10:58.650 に答える
1

すべての再起動を確認し、実際のシンボルを取得するには、次のようにします。デバッガーは呼び出されないため、その再起動は利用できないことに注意してください。

CL-USER> (handler-case whatever
           (unbound-variable (c)
              (mapcar (lambda (r) (describe r) (terpri))
                      (compute-restarts c))
              (abort)))

我々が得る:

#<RESTART SWANK::RETRY {10055BDB83}>                                                                                                                                                             
  [structure-object]                                                                                                                                                                             

Slots with :INSTANCE allocation:                                                                                                                                                                 
  NAME                  = SWANK::RETRY                                                                                                                                                           
  FUNCTION              = #<CLOSURE (LAMBDA (&REST SB-IMPL::TEMP)..                                                                                                                              
  REPORT-FUNCTION       = #<CLOSURE (LAMBDA (STREAM) :IN SWANK::CALL-WITH-RETRY-RESTART) {10055B..                                                                                               
  INTERACTIVE-FUNCTION  = NIL                                                                                                                                                                    
  TEST-FUNCTION         = #<FUNCTION (LAMBDA (COND)..                                                                                                                                            



#<RESTART ABORT {10055B9A83}>                                                                                                                                                                    
  [structure-object]                                                                                                                                                                             

Slots with :INSTANCE allocation:                                                                                                                                                                 
  NAME                  = ABORT                                                                                                                                                                  
  FUNCTION              = #<CLOSURE (LAMBDA (&REST SB-IMPL::TEMP) :IN SWANK::HANDLE-REQUESTS) {1..                                                                                               
  REPORT-FUNCTION       = #<FUNCTION (LAMBDA (STREAM) :IN SWANK::HANDLE-REQUESTS) {10041ECF6B}>                                                                                                  
  INTERACTIVE-FUNCTION  = NIL                                                                                                                                                                    
  TEST-FUNCTION         = #<FUNCTION (LAMBDA (COND)..                                                                                                                                            



#<RESTART SB-SYS:REMOVE-FD-HANDLER {10055B97D3}>                                                                                                                                                 
  [structure-object]                                                                                                                                                                             

Slots with :INSTANCE allocation:                                                                                                                                                                 
  NAME                  = SB-SYS:REMOVE-FD-HANDLER                                                                                                                                               
  FUNCTION              = #<CLOSURE (LAMBDA (&REST SB-IMPL::TEMP)..                                                                                                                              
  REPORT-FUNCTION       = #<CLOSURE (LAMBDA (STREAM) :IN SB-IMPL::SUB-SUB-SERVE-EVENT) {10055B97..                                                                                               
  INTERACTIVE-FUNCTION  = NIL                                                                                                                                                                    
  TEST-FUNCTION         = #<FUNCTION (LAMBDA (COND)..                                                                                                                                            




#<RESTART ABORT {10029531B3}>                                                                                                                                                                    
  [structure-object]                                                                                                                                                                             

Slots with :INSTANCE allocation:                                                                                                                                                                 
  NAME                  = ABORT                                                                                                                                                                  
  FUNCTION              = #<CLOSURE (LAMBDA (&REST SB-IMPL::TEMP) :IN SB-IMPL::TOPLEVEL-REPL) {1..                                                                                               
  REPORT-FUNCTION       = #<FUNCTION (LAMBDA (STREAM) :IN SB-IMPL::TOPLEVEL-REPL) {100014A8BB}>                                                                                                  
  INTERACTIVE-FUNCTION  = NIL                                                                                                                                                                    
  TEST-FUNCTION         = #<FUNCTION (LAMBDA (COND)..                                                                                                                                            
于 2013-03-20T16:08:01.973 に答える