используя sbcl schedule-timer с хитрым - PullRequest
1 голос
/ 11 марта 2020

Я хочу использовать таймер для периодической печати информации в репле (и делать некоторые другие вещи). SBCL 2.0.1 Emacs 26.1 sly 1.0.0-beta-3

(я не могу создать хитрый тег ...)

в sly-repl:

(defvar *timer* (make-timer (lambda ()
                              (write-line ".")
                              (force-output))))

(schedule-timer *timer* 2 :repeat-interval 1)`

и работает нормально - через 2 секунды "." печатается

в timer-test.lisp:

(defvar *timer* (make-timer (lambda ()
                              (write-line ".")
                              (force-output))))
(schedule-timer *timer* 2 :repeat-interval 1)`

прекрасно компилируется

при выполнении формы schedule-timer, REPL сообщает мне:

Timer #<TIMER {1002C5EB33}> failed to interrupt thread #<SB-THREAD:THREAD "slynk-worker" FINISHED values: T {1002C3DFA3}>.

Я недостаточно знаю о потоках в SBCL, чтобы разобраться в этом. Есть ли простой способ получить запланированный таймер (в файле) для вывода на REPL?

с благодарностью за вашу помощь.

1 Ответ

2 голосов
/ 11 марта 2020

Вот версия вашего кода, которая пытается использовать некоторые функциональные возможности SWANK, чтобы выяснить, что такое поток REPL, и запланировать таймер в этом потоке. Обратите внимание, что это не будет работать с SLY, насколько я могу судить, потому что SLY имеет по крайней мере разные имена пакетов. Однако он может дать подсказку, и он слишком длинный, чтобы быть комментарием.

Обратите также внимание, что я не знаю, является ли это правильным способом поиска потока REPL, или действительно ли поток REPL сохраняется для любого отрезок времени.

Если repl-thread-maybe не удается найти поток-кандидат, он возвращает t, в результате чего make-timer запускает таймер в своем собственном потоке. Я думаю, это безопасно, но это будет означать, что любой выходной сигнал от таймера (при условии, что это то, что вам нужно) идет куда-то, кроме REPL. *

...