Может ли фрагмент кода elisp дать результат, чтобы emacs не блокировался?

Есть ли способ написать что-то подобное, не используя emacs?

(defun dumb-wait (seconds)
    (let ((done (+ (second (current-time)) seconds)))
        (while (< (second (current-time)) done)
            (message "waiting"))))

(dump-wait 5) заблокирует emacs с 5 секунд. Есть ли способ написать это, чтобы он не блокировался? Я просто хочу быть в курсе и время от времени проверять некоторые условия, и при этом иметь возможность использовать emacs.

Спасибо!


person killdash10    schedule 25.09.2009    source источник
comment
sit-for? Вы также можете уступить redisplay.   -  person jrockway    schedule 25.09.2009
comment
эту функцию тупого ожидания можно использовать для розыгрыша над другим emacser. М-: (тупица-подожди 3600). Но ведь не так много emacsers имеют заставки без пароля.   -  person Yoo    schedule 26.09.2009
comment
В том месте, где я работаю, у вас будут всевозможные неприятности, если вы оставите свой компьютер незапертым и оставите свой стол. Висячий emacs будет наименьшей из ваших проблем :)   -  person killdash10    schedule 27.09.2009


Ответы (2)


(run-at-time time repeat function &rest args) должен это сделать. nil как время означает сейчас.

(setq my-timer 
      (run-at-time nil 5 (lambda () (message "waiting")))) ; returns timer object
;; or
(setq my-timer
      (run-at-time nil 5 'message "waiting"))

(cancel-timer my-timer) ; use timer object from above

Изменить:

Параметр repeat ожидает число в секундах, однако есть функция timer-duration, которую можно использовать вместо числа. Он возвращает количество секунд, указанное в строковом параметре. Это несколько легче читать для больших интервалов.

(timer-duration "3 hours 2 seconds 1 millisec") ; => 10802.001

Возможные слова, которые вы можете использовать, определены в переменной timer-duration-words.

person andre-r    schedule 25.09.2009

В связи с этим не существует общего способа написания кода Emacs Lisp, который не блокируется, потому что в языке нет таких функций, как сопрограммы, продолжения и многопоточность (пока). Вместо этого вам нужно искать асинхронные встроенные функции, которые делают что-то наиболее близкое к тому, что вы хотите. Пример: url-retrieve и async-shell-command. Некоторым приложениям, таким как SLIME, удалось обойти эту проблему и реализовать своего рода многопоточность самостоятельно, в то время как другие, такие как gnus, ждут улучшения Emacs Lisp.

person artagnon    schedule 25.09.2009