这可能是一个愚蠢的问题,或者至少有一个关于演员模型的错误假设,但也许有人可以教育我。假设我设置了一个类似于cl-actors示例文档
中的示例actorcl-user> (ql:quickload :cl-actors)
:CL-ACTORS
cl-user> (use-package :cl-actors)
T
cl-user> (defactor echo (stream) (message)
(format stream "~a~%" message)
next)
ECHO
cl-user> (defparameter e (echo :stream *standard-output*))
E
cl-user> (send e "Test message")
Test Message
; No value
为什么; No value
而不是NIL
?有没有办法在不使用(bt:join-thread (cl-actors::get-thread e))
杀死actor线程的情况下获取返回值(我怀疑在任何情况下都不会完全按照我的意愿行事)?我特意想要获得返回值,而不是使用with-output-to-string
或类似的技巧。
我正在尝试解决的更普遍的问题,如果您关心,正试图将演员的信息输出到客户端的cl-who
页面。
(with-html-output (s)
(:h1 (send e "Test message")))
如果send
没有返回任何内容,那么显然无效。如果具体问题确实被证明是愚蠢的话,欢迎指出更普遍的问题。
答案 0 :(得分:0)
您将流(*STANDARD-OUTPUT*
)传递给您的actor并获取打印到该流的字符串。如果您传递Web请求输出流,则会在那里打印字符串。如果要将数据返回给调用actor以对其执行某些操作,则应传递其id并将数据发送回它。
答案 1 :(得分:0)
我最终稍微更改了cl-actors并添加了send-receive
构造,在这种情况下做了我想做的事情。修改后的代码为here(鼓励评论)。核心是:
(defmethod send-receive ((self actor) message &optional (timeout 0))
(let ((tmp (make-queue)))
(send self tmp message)
(car (dequeue tmp timeout))))
基本上,我们声明一个临时队列,发送带有该队列作为接收者的消息,然后尝试使用可选的超时(0
表示wait forever
)弹出一个值。这取决于目标参与者是否接受sender
参数,这似乎是一种充分的actors
y方式。