stream - 创建自定义标准输出流
问题描述
我正在使用 LispWorks 的多处理工具(请参阅此处)。我启动了许多子进程(使用process-run-function
),其中每个子进程都与一个特定的邮箱相关联。我想要实现的是format
子进程中标准输出(使用)的消息最终进入邮箱,之后我可以在主进程中读取它们。
我将通过将*standard-output*
子流程的流替换为调用mailbox-send
格式化字符串的自定义流来解决此问题。但是,我不知道如何创建这样的自定义流。我在这里有什么选择?
解决方案
像这样的东西:
(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-LINE
, WRITE-LINE
, READ-CHAR
, WRITE-CHAR
:
(make-instance 'mailbox-input-stream :mailbox (mp:process-mailbox process))
(make-instance 'mailbox-output-stream :mailbox other-mailbox)
推荐阅读
- django - Django sessionid 从 cookie 中消失,用户变为匿名
- laravel - 使用中间件重定向到命名路由会导致找不到页面
- node.js - nodejs apache htaccess 配置问题
- javascript - 如何在本机反应中使用stackNavigation和drawerNavigation并在stackNavigation组件中使用toggleDrawer()
- elasticsearch - logstash -> Elasticsearch:更新非规范化数据
- mybatis - Mybatis foreach之HashMap
- c++ - map::lower_bound() 和 map::upper_bound 如何在 C++ 中工作?
- javascript - Javascript:循环到任何带有偶数/奇数描述的数字。为什么它只记录用户输入?
- python - 快速创建具有序列号的列表
- javascript - Kotlin XML 解析