2012-07-21 33 views
1

这可能是一个愚蠢的问题,或者至少有一个关于演员模型的假设不正确,但也许有人可以教育我。假设我建立一个类似一个例子演员cl-actors例如文档cl-actors返回值

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不返回任何东西,这显然不会工作。如果具体问题实际上被证明是愚蠢的,则欢迎指出更普遍的问题。

+0

@wvxvw - Yup;这就是为什么我把关于我试图解决的更一般问题的说明放进去;有一群演员互动很好,但我试图将他们的网络连接到Hunchentoot(一个不是演员的HTTP服务器,因此向它发送消息不是解决方案)。如果我想要做这样的事情,我开始觉得我应该写一个快速的基于演员的服务器。 – Inaimathi 2012-07-21 14:24:37

回答

0

我最终稍微改变了角色扮演者,并添加了一个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的方式去了解它..

0

您将流(*STANDARD-OUTPUT*)传递给您的actor,并将字符串打印到该流中。如果您传递Web请求输出流,则会在该处打印字符串。如果您想要将数据返回给调用actor来执行某些操作,则应该传递其ID并将数据发回给它。