【问题标题】:using sbcl schedule-timer with sly使用 sbcl schedule-timer 和 sly
【发布时间】:2020-06-23 10:20:20
【问题描述】:

我想使用计时器定期将信息打印到 repl(并做一些其他事情)。 SBCL 2.0.1 Emacs 26.1 狡猾的1.0.0-beta-3

(我无法创建一个狡猾的标签...)

在狡猾的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?

感谢您的帮助。

【问题讨论】:

  • 感谢您的格式化帮助 - 我应该这样做

标签: timer emacs lisp common-lisp sbcl


【解决方案1】:

这是您的代码的一个版本,它尝试使用一些 SWANK 功能来找出 REPL 线程是什么并在该线程中安排计时器。请注意,据我所知,这不适用于 SLY,因为 SLY 至少具有不同的包名称。但是它可能会提供一个线索,而且它太长了,不能成为评论。

另请注意,我不知道这是否是找到 REPL 线程的正确方法,或者 REPL 线程实际上是否会持续任何时间。

如果repl-thread-maybe 找不到候选线程,它会返回t,这会导致make-timer 在自己的线程中运行计时器。我认为这是安全的,但意味着计时器的任何输出(假设这是您所追求的)都会转到 REPL 以外的其他地方。

不管怎样,这就是它的价值

;;;;
;;;

(in-package :cl-user)

#-(and SBCL SWANK)
(eval-when (:compile-toplevel :load-toplevel :execute)
  (error "Not SBCL / not SWANK"))

(defun repl-thread-maybe (&key (repl-thread-name "repl-thread")
                               (fallback-value t))
  ;; I have no idea if this is the right way to find the REPL thread,
  ;; but it kind of works.
  (or (find-if (lambda (thread)
                 (string-equal (swank/backend:thread-name thread)
                               repl-thread-name))
               (swank/backend:all-threads))
      fallback-value))

(defparameter *timer* (make-timer (lambda ()
                                    (write-line ".")
                                    (force-output))
                                  :thread (repl-thread-maybe)))

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

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2016-04-23
    相关资源
    最近更新 更多