1

这可能是一个愚蠢的问题,或者至少是一个对演员模型有一些错误假设的问题,但也许有人可以教育我。假设我设置了一个类似于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))(我怀疑在任何情况下都不会完全按照我的意愿去做)?我特别想获得返回值,而不是玩弄with-output-to-string或类似的把戏。

如果您关心的话,我试图解决的更普遍的问题是尝试将来自参与者的信息输出到cl-who客户端的页面中。类似的东西

(with-html-output (s)
   (:h1 (send e "Test message")))

send如果不返回任何东西,这显然是行不通的。如果特定问题实际上被证明是愚蠢的,则欢迎就更普遍的问题提出建议。

4

2 回答 2

0

您将流 ( *STANDARD-OUTPUT*) 传递给您的演员并将字符串打印到该流。如果您传递您的网络请求输出流,您将在此处打印字符串。如果您想将数据返回给调用参与者以对其进行处理,您应该传递其 id 并将数据发送回给它。

于 2012-07-21T19:33:20.463 回答
0

我最终稍微改变了 cl-actors 并添加了一个send-receive在这种情况下做我想要的构造。修改后的代码在这里(鼓励评论)。核心是这样的:

(defmethod send-receive ((self actor) message &optional (timeout 0))
  (let ((tmp (make-queue)))
    (send self tmp message)
    (car (dequeue tmp timeout))))

Essentially, we declare a temporary queue, send a message with that queue as a receiver, then try to pop a value off it with an optional timeout (0 means wait forever). This depends on the target actor accepting a sender parameter, which seems like a sufficiently actorsy way to go about it..

于 2012-08-10T13:19:07.100 回答