【问题标题】:Create custom standard output stream创建自定义标准输出流
【发布时间】:2019-12-12 16:27:00
【问题描述】:

我正在使用 LispWorks 的多处理工具(请参阅 here)。我启动了一些子进程(使用process-run-function),其中每个子进程都与一个特定的邮箱相关联。我想要实现的是子进程中标准输出(使用format)的消息最终进入邮箱,之后我可以在主进程中读取它们。

我将通过将子进程的*standard-output* 流替换为在格式化字符串上调用mailbox-send 的自定义流来解决此问题。但是,我不知道如何创建这样的自定义流。我在这里有什么选择?

【问题讨论】:

标签: stream multiprocessing common-lisp lispworks


【解决方案1】:

类似这样的:


(defclass mailbox-input-stream (stream:fundamental-character-input-stream)
  ((mailbox :initarg :mailbox
            :accessor mailbox-stream-mailbox
            :initform nil)))

(defmethod stream-element-type ((stream mailbox-input-stream))
  'character)

(defmethod stream:stream-read-char ((stream mailbox-input-stream))
  (let ((char (mp:mailbox-read (mailbox-stream-mailbox stream))))
    (if (eql char #\Line-Separator)
        #\Newline
        char)))

(defclass mailbox-output-stream (stream:fundamental-character-output-stream)
  ((mailbox :initarg :mailbox
            :accessor mailbox-stream-mailbox
            :initform nil)))

(defmethod stream-element-type ((stream mailbox-output-stream))
  'character)

(defmethod stream:stream-write-char ((stream mailbox-output-stream) char)
  (mp:mailbox-send (mailbox-stream-mailbox stream)
                   (if (eql char #\Newline)
                       #\Line-Separator
                       char)))

(defmethod stream:stream-line-column ((stream mailbox-output-stream))
  nil)

(defmethod stream:stream-start-line-p ((stream mailbox-output-stream))
  nil)

然后您可以在这样创建的流上使用READ-LINEWRITE-LINEREAD-CHARWRITE-CHAR

(make-instance 'mailbox-input-stream :mailbox (mp:process-mailbox process))

(make-instance 'mailbox-output-stream :mailbox other-mailbox)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多