2013-03-19 5 views
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 напрямую. Тот же результат с одним исключением: пример низкого уровня в this answer работ, как я думаю, что он должен:

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

возвращается к строке без жалобы. Пример высокого уровня будет корректно перезагружаться, только если он выбран вручную из меню перезапуска.

ответ

2

Если вы запустите compute-restarts, вы увидите, что перезапуск retry фактически внутренней по отношению к swank пакета:

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

Если вы квалифицируете его таким образом, как swank::retry, вы получите ожидаемое поведение.

+0

Спасибо. Это делает трюк. Угадайте, что бесконечный цикл не должен был меня удивлять. :-) – BnMcGn

3

Звезда перед перезапуском 1 на вашем выходе указывает, что этот перезапуск будет вызываться командой [q] uit SLIME. Название перезапуске «ABORT, поэтому для того, чтобы вызвать его, используйте:

(handler-case 
    whatever 
    (unbound-variable (e) (invoke-restart 'abort))) 
+0

Это работает для вас? Это дает мне оценку, отмененную на # . – BnMcGn

+0

Я получаю то же самое «Нет перезапуска активен» в диапазоне повторных запусков и ошибок, например, перезапуск USE-OLD из clsql: connect делает то же самое. – BnMcGn

+1

Это сообщение «Оценка прервано ...» - это именно то, что делает перезапуск «abort». – Svante

2

retry просто пытается снова оценить ту же переменную. Поскольку вы не связывали его, он все еще несвязан. Вы, возможно, лучше удачи с

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

, который должен вернуться 42.

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)..                                    
Смежные вопросы