2013-06-28 2 views
2

В emacs lisp форма псевдо-асинхронности может быть достигнута посредством команд run-with-timer и run-with-async-timer. Подумайте, например. следующий простого таймер обратного отсчета:Emacs lisp: Отладка таймеров?

(defun -c (i) 
(cond 
    ((= i 0) (error "TESTERROR")) 
    (t 
    (message "Countdown at %d" i) 
    (run-with-timer 1 nil '-c (1- i))))) 

Запуск (-c 3) будет отображать сообщения

Countdown at 3 
Countdown at 2 
Countdown at 1 

молча игнорировать сигнальную ошибку.

Есть ли какой-то способ в emacs lisp, чтобы получить отчет об ошибках для таких таймеров, желательно с полным стеклом?

+2

Как указывает sds, это была ошибка (на мой взгляд), и я исправил ее несколько месяцев назад в Em acs. – Stefan

ответ

0

я не наблюдаю поведение, вы можете описать с Emacs 24.3.50.3:

(lexical-let ((countdown 3) timer) 
    (defun countdown() 
    (message "countdown %d" countdown) 
    (when (zerop (decf countdown)) 
     (cancel-timer timer) 
     (error "BOOM"))) 
    (setq timer (run-with-timer 1 1 'countdown))) 

Я вижу в эхо-области и в *Messages*:

countdown 3 
countdown 2 
countdown 1 
Entering debugger... 

, а затем в *Backtrace*:

Debugger entered--Lisp error: (error "BOOM") 
    signal(error ("BOOM")) 
    error("BOOM") 
    (progn (cancel-timer (symbol-value G66502)) (error "BOOM")) 
    (if (zerop (let* ((v G66503)) (set v (1- (symbol-value G66503))))) (progn (cancel-timer (symbol-value G66502)) (error "BOOM"))) 
    (lambda (G66502 G66503) (message "countdown %d" (symbol-value G66503)) (if (zerop (let* ((v G66503)) (set v (1- (symbol-value G66503))))) (progn (cancel-timer (symbol-value G66502)) (error "BOOM"))))(--timer-- --countdown--) 
    apply((lambda (G66502 G66503) (message "countdown %d" (symbol-value G66503)) (if (zerop (let* ((v G66503)) (set v (1- (symbol-value G66503))))) (progn (cancel-timer (symbol-value G66502)) (error "BOOM")))) --timer-- --countdown-- nil) 
    countdown() 
    apply(countdown nil) 
    byte-code("r\301\302H\303H\"\210)\301\207" [timer apply 5 6] 4) 
    timer-event-handler([t 20941 51022 556644 1 countdown nil nil 176000]) 
+0

Спасибо ... Я собрал emacs из источника сейчас, и теперь он работает. Однако, чтобы получить стек, я должен был также выполнить «M-x toggle-debug-on-error». По умолчанию включена функция debug-on-error? – kdb

+0

Да, я включил 'debug-on-error' по умолчанию. – sds