cl-actors返回值

时间:2012-07-21 04:09:19

标签: multithreading lisp common-lisp actor

这可能是一个愚蠢的问题,或者至少有一个关于演员模型的错误假设,但也许有人可以教育我。假设我设置了一个类似于cl-actors示例文档

中的示例actor
cl-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没有返回任何内容,那么显然无效。如果具体问题确实被证明是愚蠢的话,欢迎指出更普遍的问题。

2 个答案:

答案 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方式。